using System;
using System.IO;
using System.Threading.Tasks;
using EasyNetQ;
using MalwareMultiScan.Api.Data.Configuration;
using MalwareMultiScan.Api.Data.Models;
using MalwareMultiScan.Backends.Messages;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
namespace MalwareMultiScan.Api.Services
{
///
/// Scan backends service.
///
public class ScanBackendService
{
private readonly IBus _bus;
private readonly ILogger _logger;
///
/// Create scan backend service.
///
/// Configuration.
/// Service bus.
/// Logger.
/// Missing BackendsConfiguration YAML file.
public ScanBackendService(IConfiguration configuration, IBus bus, ILogger logger)
{
_bus = bus;
_logger = logger;
var configurationPath = configuration.GetValue("BackendsConfiguration");
if (!File.Exists(configurationPath))
throw new FileNotFoundException("Missing BackendsConfiguration YAML file", configurationPath);
var configurationContent = File.ReadAllText(configurationPath);
var deserializer = new DeserializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.Build();
List = deserializer.Deserialize(configurationContent);
}
///
/// List of available scan backends.
///
public ScanBackend[] List { get; }
///
/// Queue URL scan.
///
/// Scan result instance.
/// Scan backend.
/// File download URL.
public async Task QueueUrlScan(ScanResult result, ScanBackend backend, string fileUrl)
{
_logger.LogInformation(
$"Queueing scan for {result.Id} on {backend.Id} at {fileUrl}");
await _bus.SendAsync(backend.Id, new ScanRequestMessage
{
Id = result.Id,
Uri = new Uri(fileUrl)
});
}
}
}