示例#1
0
        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");
            }
        }
示例#3
0
        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);
            }
        }