/// <inheritdoc />
        public async Task SaveImageScanResult(ImageScanResultWithCVEs imageScanResult)
        {
            Logger.Information(
                "Saving Image Scan {ImageScanId} for {ImageTag} with {FoundCVE} found CVEs",
                imageScanResult.Id,
                imageScanResult.ImageTag,
                imageScanResult.FoundCVEs?.Count ?? 0);

            var existingScanResult = await this.db.Set <ImageScanResultEntity>().FirstOrDefaultAsync(i => i.ExternalId == imageScanResult.Id);

            if (existingScanResult == null)
            {
                this.db.Set <ImageScanResultEntity>().Add(imageScanResult.ToEntity());
            }
            else
            {
                var newEntity = imageScanResult.ToEntity();
                existingScanResult.Date        = newEntity.Date;
                existingScanResult.FoundCVEs   = newEntity.FoundCVEs;
                existingScanResult.Status      = newEntity.Status;
                existingScanResult.Description = newEntity.Description;

                this.db.Set <ImageScanResultEntity>().Update(existingScanResult);
            }

            // update in-progress check-results
            var checkResults = await this.db.Set <CheckResultEntity>()
                               .Where(i => i.Value == CheckValue.InProgress && i.ComponentId.EndsWith(imageScanResult.ImageTag))
                               .ToArrayAsync();

            foreach (var result in checkResults)
            {
                result.Value   = imageScanResult.GetCheckResultValue().ToEntity();
                result.Message = imageScanResult.GetCheckResultMessage();
                this.db.Update(result);
            }

            await this.db.SaveChangesAsync();
        }
示例#2
0
        private async Task <ImageScanResultWithCVEs> NormalizeRawData(AuditBlob auditBlob, AuditMetadata auditMetadata)
        {
            var auditDate  = DateTimeOffset.FromUnixTimeSeconds(auditMetadata.Timestamp).DateTime;
            var scanResult = new ImageScanResultWithCVEs
            {
                Id       = auditMetadata.AuditId,
                Date     = auditDate,
                ImageTag = auditMetadata.ImageTag,
            };

            if (auditMetadata.AuditResult != "succeeded")
            {
                var path = $"{auditBlob.ParentContainer.Name}/{auditBlob.Name}";
                Logger.Warning(
                    "Audit {AuditPath} result is {AuditResult} due: {FailureReason}",
                    path,
                    auditMetadata.AuditResult,
                    auditMetadata.FailureDescription);
                scanResult.Status      = ImageScanStatus.Failed;
                scanResult.Description = TrivyScanDescriptionNormalizer.ToHumanReadable(auditMetadata.FailureDescription);
            }
            else
            {
                var auditResultFilePath = $"{auditBlob.ParentContainer.Name}/{auditMetadata.TrivyAuditPath}";
                var(entities, counters) = await this.ParseScanTargets(auditResultFilePath);

                scanResult.FoundCVEs = entities;
                scanResult.Counters  = counters;
                scanResult.Status    = ImageScanStatus.Succeeded;

                Logger.Information(
                    "Successfully processed {ImageTag} image scan of {AuditDate} with {ScanSummary}",
                    scanResult.ImageTag,
                    scanResult.Date,
                    scanResult.GetCheckResultMessage());
            }

            return(scanResult);
        }