95 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Globalization;
 | |
| using System.Text.Json;
 | |
| using System.Threading;
 | |
| using System.Threading.Tasks;
 | |
| using Microsoft.Extensions.Logging;
 | |
| using StellaOps.Concelier.Core.Jobs;
 | |
| 
 | |
| namespace StellaOps.Concelier.Exporter.TrivyDb;
 | |
| 
 | |
| public sealed class TrivyDbExportJob : IJob
 | |
| {
 | |
|     public const string JobKind = "export:trivy-db";
 | |
|     public static readonly TimeSpan DefaultTimeout = TimeSpan.FromMinutes(20);
 | |
|     public static readonly TimeSpan DefaultLeaseDuration = TimeSpan.FromMinutes(10);
 | |
| 
 | |
|     private readonly TrivyDbFeedExporter _exporter;
 | |
|     private readonly ILogger<TrivyDbExportJob> _logger;
 | |
| 
 | |
|     public TrivyDbExportJob(TrivyDbFeedExporter exporter, ILogger<TrivyDbExportJob> logger)
 | |
|     {
 | |
|         _exporter = exporter ?? throw new ArgumentNullException(nameof(exporter));
 | |
|         _logger = logger ?? throw new ArgumentNullException(nameof(logger));
 | |
|     }
 | |
| 
 | |
|     public async Task ExecuteAsync(JobExecutionContext context, CancellationToken cancellationToken)
 | |
|     {
 | |
|         _logger.LogInformation("Executing Trivy DB export job {RunId}", context.RunId);
 | |
|         var overrides = CreateOverrides(context.Parameters);
 | |
|         if (overrides?.HasOverrides == true)
 | |
|         {
 | |
|             using var scope = TrivyDbExportOverrideScope.Begin(overrides);
 | |
|             await _exporter.ExportAsync(context.Services, cancellationToken).ConfigureAwait(false);
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             await _exporter.ExportAsync(context.Services, cancellationToken).ConfigureAwait(false);
 | |
|         }
 | |
| 
 | |
|         _logger.LogInformation("Completed Trivy DB export job {RunId}", context.RunId);
 | |
|     }
 | |
| 
 | |
|     private static TrivyDbExportOverrides? CreateOverrides(IReadOnlyDictionary<string, object?> parameters)
 | |
|     {
 | |
|         if (parameters is null || parameters.Count == 0)
 | |
|         {
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         var publishFull = TryReadBoolean(parameters, "publishFull");
 | |
|         var publishDelta = TryReadBoolean(parameters, "publishDelta");
 | |
|         var includeFull = TryReadBoolean(parameters, "includeFull");
 | |
|         var includeDelta = TryReadBoolean(parameters, "includeDelta");
 | |
| 
 | |
|         var overrides = new TrivyDbExportOverrides(publishFull, publishDelta, includeFull, includeDelta);
 | |
|         return overrides.HasOverrides ? overrides : null;
 | |
|     }
 | |
| 
 | |
|     private static bool? TryReadBoolean(IReadOnlyDictionary<string, object?> parameters, string key)
 | |
|     {
 | |
|         if (!parameters.TryGetValue(key, out var value) || value is null)
 | |
|         {
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         switch (value)
 | |
|         {
 | |
|             case bool b:
 | |
|                 return b;
 | |
|             case string s when bool.TryParse(s, out var result):
 | |
|                 return result;
 | |
|             case JsonElement element:
 | |
|                 return element.ValueKind switch
 | |
|                 {
 | |
|                     JsonValueKind.True => true,
 | |
|                     JsonValueKind.False => false,
 | |
|                     JsonValueKind.String when bool.TryParse(element.GetString(), out var parsed) => parsed,
 | |
|                     _ => null,
 | |
|                 };
 | |
|             case IConvertible convertible:
 | |
|                 try
 | |
|                 {
 | |
|                     return convertible.ToBoolean(CultureInfo.InvariantCulture);
 | |
|                 }
 | |
|                 catch
 | |
|                 {
 | |
|                     return null;
 | |
|                 }
 | |
|         }
 | |
| 
 | |
|         return null;
 | |
|     }
 | |
| }
 |