diff --git a/MalwareMultiScan.Api/Services/ScanResultService.cs b/MalwareMultiScan.Api/Services/ScanResultService.cs index 7a906c2..241bcce 100644 --- a/MalwareMultiScan.Api/Services/ScanResultService.cs +++ b/MalwareMultiScan.Api/Services/ScanResultService.cs @@ -7,6 +7,7 @@ using Hangfire; using Hangfire.States; using MalwareMultiScan.Api.Data; using MalwareMultiScan.Api.Services.Interfaces; +using MalwareMultiScan.Shared.Enums; using MalwareMultiScan.Shared.Message; using MalwareMultiScan.Shared.Services.Interfaces; using MongoDB.Bson; @@ -71,7 +72,10 @@ namespace MalwareMultiScan.Api.Services public async Task UpdateScanResultForBackend(string resultId, string backendId, ScanResultMessage result = null) { - result ??= new ScanResultMessage(); + result ??= new ScanResultMessage + { + Status = ScanResultStatus.Queued + }; await _collection.UpdateOneAsync( Builders.Filter.Where(r => r.Id == resultId), diff --git a/MalwareMultiScan.Backends/MalwareMultiScan.Backends.csproj b/MalwareMultiScan.Backends/MalwareMultiScan.Backends.csproj index e62ad89..dfa620b 100644 --- a/MalwareMultiScan.Backends/MalwareMultiScan.Backends.csproj +++ b/MalwareMultiScan.Backends/MalwareMultiScan.Backends.csproj @@ -4,8 +4,8 @@ netcoreapp3.1 Volodymyr Smirnov MalwareMultiScan Backends - 1.0.0 - 1.0.0 + 1.5.0 + 1.5.0 true diff --git a/MalwareMultiScan.ScannerWorker/MalwareMultiScan.ScannerWorker.csproj b/MalwareMultiScan.Scanner/MalwareMultiScan.Scanner.csproj similarity index 52% rename from MalwareMultiScan.ScannerWorker/MalwareMultiScan.ScannerWorker.csproj rename to MalwareMultiScan.Scanner/MalwareMultiScan.Scanner.csproj index b69ce1f..19e6ff6 100644 --- a/MalwareMultiScan.ScannerWorker/MalwareMultiScan.ScannerWorker.csproj +++ b/MalwareMultiScan.Scanner/MalwareMultiScan.Scanner.csproj @@ -1,15 +1,14 @@ netcoreapp3.1 + Volodymyr Smirnov + MalwareMultiScan Scanner + 1.5.0 + 1.5.0 + true - - - - - - diff --git a/MalwareMultiScan.ScannerWorker/Program.cs b/MalwareMultiScan.Scanner/Program.cs similarity index 89% rename from MalwareMultiScan.ScannerWorker/Program.cs rename to MalwareMultiScan.Scanner/Program.cs index d56c958..1339b20 100644 --- a/MalwareMultiScan.ScannerWorker/Program.cs +++ b/MalwareMultiScan.Scanner/Program.cs @@ -1,10 +1,8 @@ using System.Threading.Tasks; -using Hangfire; -using MalwareMultiScan.Backends.Backends.Interfaces; using MalwareMultiScan.Backends.Extensions; using MalwareMultiScan.Backends.Services.Implementations; using MalwareMultiScan.Backends.Services.Interfaces; -using MalwareMultiScan.ScannerWorker.Services; +using MalwareMultiScan.Scanner.Services; using MalwareMultiScan.Shared.Extensions; using MalwareMultiScan.Shared.Services.Interfaces; using Microsoft.Extensions.Configuration; @@ -12,9 +10,9 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -namespace MalwareMultiScan.ScannerWorker +namespace MalwareMultiScan.Scanner { - public static class Program + internal static class Program { public static async Task Main(string[] args) { diff --git a/MalwareMultiScan.ScannerWorker/Properties/launchSettings.json b/MalwareMultiScan.Scanner/Properties/launchSettings.json similarity index 100% rename from MalwareMultiScan.ScannerWorker/Properties/launchSettings.json rename to MalwareMultiScan.Scanner/Properties/launchSettings.json diff --git a/MalwareMultiScan.ScannerWorker/Services/ConsulHostedService.cs b/MalwareMultiScan.Scanner/Services/ConsulHostedService.cs similarity index 95% rename from MalwareMultiScan.ScannerWorker/Services/ConsulHostedService.cs rename to MalwareMultiScan.Scanner/Services/ConsulHostedService.cs index 0f45532..1e10ead 100644 --- a/MalwareMultiScan.ScannerWorker/Services/ConsulHostedService.cs +++ b/MalwareMultiScan.Scanner/Services/ConsulHostedService.cs @@ -8,7 +8,7 @@ using MalwareMultiScan.Backends.Backends.Interfaces; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; -namespace MalwareMultiScan.ScannerWorker.Services +namespace MalwareMultiScan.Scanner.Services { public class ConsulHostedService : BackgroundService { @@ -17,7 +17,7 @@ namespace MalwareMultiScan.ScannerWorker.Services private readonly IConsulClient _consulClient; private readonly AgentServiceRegistration _registration; - + public ConsulHostedService( IConsulClient consulClient, IConfiguration configuration, @@ -37,6 +37,7 @@ namespace MalwareMultiScan.ScannerWorker.Services }; } + /// protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) @@ -48,6 +49,7 @@ namespace MalwareMultiScan.ScannerWorker.Services } } + /// public override async Task StartAsync(CancellationToken cancellationToken) { await _consulClient.Agent.ServiceDeregister( @@ -68,6 +70,7 @@ namespace MalwareMultiScan.ScannerWorker.Services await base.StartAsync(cancellationToken); } + /// public override async Task StopAsync(CancellationToken cancellationToken) { await _consulClient.Agent.ServiceDeregister( diff --git a/MalwareMultiScan.ScannerWorker/Services/ScanBackgroundJob.cs b/MalwareMultiScan.Scanner/Services/ScanBackgroundJob.cs similarity index 94% rename from MalwareMultiScan.ScannerWorker/Services/ScanBackgroundJob.cs rename to MalwareMultiScan.Scanner/Services/ScanBackgroundJob.cs index 7f16f91..9f04b7a 100644 --- a/MalwareMultiScan.ScannerWorker/Services/ScanBackgroundJob.cs +++ b/MalwareMultiScan.Scanner/Services/ScanBackgroundJob.cs @@ -11,7 +11,7 @@ using MalwareMultiScan.Shared.Services.Interfaces; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -namespace MalwareMultiScan.ScannerWorker.Services +namespace MalwareMultiScan.Scanner.Services { /// public class ScanBackgroundJob : IScanBackgroundJob @@ -51,7 +51,10 @@ namespace MalwareMultiScan.ScannerWorker.Services var cancellationToken = cancellationTokenSource.Token; - var result = new ScanResultMessage(); + var result = new ScanResultMessage + { + Status = ScanResultStatus.Queued + }; var stopwatch = new Stopwatch(); diff --git a/MalwareMultiScan.ScannerWorker/appsettings.json b/MalwareMultiScan.Scanner/appsettings.json similarity index 76% rename from MalwareMultiScan.ScannerWorker/appsettings.json rename to MalwareMultiScan.Scanner/appsettings.json index 5f5379c..1083ca6 100644 --- a/MalwareMultiScan.ScannerWorker/appsettings.json +++ b/MalwareMultiScan.Scanner/appsettings.json @@ -5,5 +5,6 @@ "CONSUL_SERVICE_NAME": "scanner", "BACKEND_ID": "dummy", - "MAX_SCANNING_TIME": 60 + "MAX_SCANNING_TIME": 60, + "WORKER_COUNT": 4 } diff --git a/MalwareMultiScan.Shared/Enums/ScanResultStatus.cs b/MalwareMultiScan.Shared/Enums/ScanResultStatus.cs index f3b9178..0f2ab06 100644 --- a/MalwareMultiScan.Shared/Enums/ScanResultStatus.cs +++ b/MalwareMultiScan.Shared/Enums/ScanResultStatus.cs @@ -1,9 +1,23 @@ namespace MalwareMultiScan.Shared.Enums { + /// + /// Scan result status. + /// public enum ScanResultStatus { + /// + /// Scan is queued. + /// Queued, + + /// + /// Scan succeeded. + /// Succeeded, + + /// + /// Scan failed. + /// Failed } } \ No newline at end of file diff --git a/MalwareMultiScan.Shared/Extensions/ServiceCollectionExtensions.cs b/MalwareMultiScan.Shared/Extensions/ServiceCollectionExtensions.cs index d2fbbf3..730ade3 100644 --- a/MalwareMultiScan.Shared/Extensions/ServiceCollectionExtensions.cs +++ b/MalwareMultiScan.Shared/Extensions/ServiceCollectionExtensions.cs @@ -1,7 +1,6 @@ using System; using Consul; using Hangfire; -using Hangfire.Redis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -25,6 +24,12 @@ namespace MalwareMultiScan.Shared.Extensions })); } + /// + /// Add Hangfire with Redis storage. + /// + /// Service collection. + /// Configuration. + /// Queue names. public static void AddHangfire(this IServiceCollection services, IConfiguration configuration, params string[] queues) { @@ -34,7 +39,19 @@ namespace MalwareMultiScan.Shared.Extensions services.AddHangfire(options => options.UseRedisStorage(configuration.GetValue("REDIS_ADDRESS"))); - services.AddHangfireServer(options => options.Queues = queues); + services.AddHangfireServer(options => + { + options.Queues = queues; + + options.ServerTimeout = TimeSpan.FromSeconds(30); + options.HeartbeatInterval = TimeSpan.FromSeconds(5); + options.ServerCheckInterval = TimeSpan.FromSeconds(15); + + var workerCount = configuration.GetValue("WORKER_COUNT"); + + if (workerCount > 0) + options.WorkerCount = workerCount; + }); } } } \ No newline at end of file diff --git a/MalwareMultiScan.Shared/MalwareMultiScan.Shared.csproj b/MalwareMultiScan.Shared/MalwareMultiScan.Shared.csproj index b69f6ae..4f90da1 100644 --- a/MalwareMultiScan.Shared/MalwareMultiScan.Shared.csproj +++ b/MalwareMultiScan.Shared/MalwareMultiScan.Shared.csproj @@ -1,6 +1,11 @@ netcoreapp3.1 + Volodymyr Smirnov + MalwareMultiScan Shared + 1.5.0 + 1.5.0 + true @@ -10,11 +15,5 @@ - - - - - - diff --git a/MalwareMultiScan.Shared/Message/ScanQueueMessage.cs b/MalwareMultiScan.Shared/Message/ScanQueueMessage.cs index d1afb1d..b900abb 100644 --- a/MalwareMultiScan.Shared/Message/ScanQueueMessage.cs +++ b/MalwareMultiScan.Shared/Message/ScanQueueMessage.cs @@ -2,9 +2,19 @@ using System; namespace MalwareMultiScan.Shared.Message { + /// + /// Scan queue message. + /// public class ScanQueueMessage { + /// + /// Scan result id. + /// public string Id { get; set; } + + /// + /// Scan file URL. + /// public Uri Uri { get; set; } } } \ No newline at end of file diff --git a/MalwareMultiScan.Shared/Message/ScanResultMessage.cs b/MalwareMultiScan.Shared/Message/ScanResultMessage.cs index 8ed6a7a..e2d0727 100644 --- a/MalwareMultiScan.Shared/Message/ScanResultMessage.cs +++ b/MalwareMultiScan.Shared/Message/ScanResultMessage.cs @@ -2,12 +2,24 @@ using MalwareMultiScan.Shared.Enums; namespace MalwareMultiScan.Shared.Message { + /// + /// Scan result message. + /// public class ScanResultMessage { + /// + /// Scan status. + /// public ScanResultStatus Status { get; set; } + /// + /// Scan duration in seconds. + /// public long Duration { get; set; } + /// + /// Detected threats. + /// public string[] Threats { get; set; } } } \ No newline at end of file diff --git a/MalwareMultiScan.Shared/Services/Interfaces/IScanBackgroundJob.cs b/MalwareMultiScan.Shared/Services/Interfaces/IScanBackgroundJob.cs index d552b81..ae26ee7 100644 --- a/MalwareMultiScan.Shared/Services/Interfaces/IScanBackgroundJob.cs +++ b/MalwareMultiScan.Shared/Services/Interfaces/IScanBackgroundJob.cs @@ -4,9 +4,16 @@ using MalwareMultiScan.Shared.Message; namespace MalwareMultiScan.Shared.Services.Interfaces { + /// + /// Scan background job. + /// [AutomaticRetry(Attempts = 0, OnAttemptsExceeded = AttemptsExceededAction.Delete)] public interface IScanBackgroundJob { + /// + /// Start scan. + /// + /// Scan queue message. Task Process(ScanQueueMessage message); } } \ No newline at end of file diff --git a/MalwareMultiScan.Shared/Services/Interfaces/IScanResultJob.cs b/MalwareMultiScan.Shared/Services/Interfaces/IScanResultJob.cs index 13c8f02..63f4237 100644 --- a/MalwareMultiScan.Shared/Services/Interfaces/IScanResultJob.cs +++ b/MalwareMultiScan.Shared/Services/Interfaces/IScanResultJob.cs @@ -5,11 +5,27 @@ using MalwareMultiScan.Shared.Message; namespace MalwareMultiScan.Shared.Services.Interfaces { + /// + /// Scan background result job. + /// public interface IScanResultJob { + /// + /// Report job status. + /// + /// Result id. + /// Backend id. + /// Scan result. [AutomaticRetry(Attempts = 0, OnAttemptsExceeded = AttemptsExceededAction.Delete)] Task Report(string resultId, string backendId, ScanResultMessage result); + /// + /// Notify remote URL on scan result. + /// + /// Base URL. + /// Result id. + /// Backend id. + /// Scan result. [AutomaticRetry(Attempts = 0, OnAttemptsExceeded = AttemptsExceededAction.Delete)] Task Notify(Uri uri, string resultId, string backendId, ScanResultMessage result); } diff --git a/MalwareMultiScan.sln b/MalwareMultiScan.sln index bc27750..6401eb7 100644 --- a/MalwareMultiScan.sln +++ b/MalwareMultiScan.sln @@ -15,7 +15,7 @@ EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MalwareMultiScan.Tests", "MalwareMultiScan.Tests\MalwareMultiScan.Tests.csproj", "{9896162D-8FC7-4911-933F-A78C94128923}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MalwareMultiScan.ScannerWorker", "MalwareMultiScan.ScannerWorker\MalwareMultiScan.ScannerWorker.csproj", "{D36ED4DD-4EEA-4609-8AED-B2FD496E4C90}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MalwareMultiScan.Scanner", "MalwareMultiScan.Scanner\MalwareMultiScan.Scanner.csproj", "{D36ED4DD-4EEA-4609-8AED-B2FD496E4C90}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MalwareMultiScan.Shared", "MalwareMultiScan.Shared\MalwareMultiScan.Shared.csproj", "{534E3C92-FD6D-401C-99D4-792DB11B57AE}" EndProject