public async Task <CveSummary[]> LoadFeed(string feedName, DateTimeOffset lastCheck, DateTimeOffset since) { _log.LogInformation($"Downloading '{feedName}' feed..."); var feed = await GetFeed(feedName); var items = feed.CVE_Items .Where(x => DateTimeOffset.Parse(x.publishedDate) > since) .Select(i => CveSummary.FromFeed(i)) .Where(i => !i.Description.StartsWith("** REJECT **")) .ToArray(); _log.LogInformation($"{items.Length} new items found"); return(items); }
private static string GetColor(CveSummary item) { switch (item.Impact) { case CveImpact.High: return("danger"); case CveImpact.Medium: return("warning"); case CveImpact.Low: return("#439FE0"); default: return("#E0C8C3"); } }
public static async Task <string[]> Run( [TimerTrigger("0 */15 * * * *")] TimerInfo myTimer, [Table("CveRefreshState", "state", "recent-cves")] CveRefreshState refreshState, [Table("CveRefreshState")] CloudTable stateUpdater, ILogger log) { var correlationId = Guid.NewGuid().ToString("D").ToLower(); using (var scope = log.BeginScope(correlationId)) { log.LogInformation($"CheckNistFeed function triggered at: {DateTimeOffset.UtcNow}"); var feedSourceUrl = GetEnvironmentVariable("NistFeedBaseUrl"); var feedName = GetEnvironmentVariable("NistFeedName"); var batchSize = Int32.Parse(GetEnvironmentVariable("CveBatchSize")); var lastChecked = refreshState != null ? refreshState.LastChecked : DateTimeOffset.Now.Subtract(TimeSpan.FromMinutes(240)); var lastFeedUpdate = refreshState != null ? refreshState.FeedLastUpdated : DateTime.MinValue; var minPublishDate = refreshState != null ? refreshState.LastPublishDate : lastChecked; var now = DateTimeOffset.UtcNow; var loader = new FeedLoader(feedSourceUrl, log); var meta = await loader.GetLatestFeedMeta(feedName); var entries = new CveSummary[0]; if (meta.LastUpdated > lastFeedUpdate) { entries = await loader.LoadFeed(feedName, lastChecked, minPublishDate); } else { log.LogInformation($"No changes since last check."); } var batches = entries .Select((item, index) => new { item, index }) .GroupBy(x => x.index / batchSize) .Select(g => g.Select(x => x.item)) .Select(b => JsonConvert.SerializeObject(b.ToArray())) .ToArray(); if (refreshState == null) { refreshState = new CveRefreshState() { PartitionKey = "state", RowKey = "recent-cves", ETag = "*", LastChecked = now, FeedLastUpdated = meta.LastUpdated, LastPublishDate = entries.Length > 0 ? entries.Max(x => x.PublishDate) : minPublishDate }; var operation = TableOperation.InsertOrReplace(refreshState); await stateUpdater.ExecuteAsync(operation); } else { refreshState.LastChecked = now; refreshState.FeedLastUpdated = meta.LastUpdated; refreshState.LastPublishDate = entries.Length > 0 ? entries.Max(x => x.PublishDate) : refreshState.LastPublishDate; } log.LogInformation($"CheckNistFeed function completed at: {DateTimeOffset.UtcNow}"); return(batches); } }