diff --git a/MalwareMultiScan.Api/Data/Models/ScanResultEntry.cs b/MalwareMultiScan.Api/Data/Models/ScanResultEntry.cs index a566c3d..b024c3d 100644 --- a/MalwareMultiScan.Api/Data/Models/ScanResultEntry.cs +++ b/MalwareMultiScan.Api/Data/Models/ScanResultEntry.cs @@ -1,9 +1,12 @@ +using System; + namespace MalwareMultiScan.Api.Data.Models { public class ScanResultEntry { public bool Completed { get; set; } public bool? Succeeded { get; set; } + public long Duration { get; set; } public string[] Threats { get; set; } } } \ No newline at end of file diff --git a/MalwareMultiScan.Api/Services/ReceiverHostedService.cs b/MalwareMultiScan.Api/Services/ReceiverHostedService.cs index 341244e..af4b2ed 100644 --- a/MalwareMultiScan.Api/Services/ReceiverHostedService.cs +++ b/MalwareMultiScan.Api/Services/ReceiverHostedService.cs @@ -46,7 +46,7 @@ namespace MalwareMultiScan.Api.Services $"with threats {string.Join(",", message.Threats)}"); await _scanResultService.UpdateScanResultForBackend( - message.Id, message.Backend, true, + message.Id, message.Backend, message.Duration, true, message.Succeeded, message.Threats); }); diff --git a/MalwareMultiScan.Api/Services/ScanResultService.cs b/MalwareMultiScan.Api/Services/ScanResultService.cs index 231c88e..862b573 100644 --- a/MalwareMultiScan.Api/Services/ScanResultService.cs +++ b/MalwareMultiScan.Api/Services/ScanResultService.cs @@ -68,10 +68,11 @@ namespace MalwareMultiScan.Api.Services /// /// Result id. /// Backend id. + /// Duration of scan. /// If the scan has been completed. /// If the scan has been succeeded. /// List of found threats. - public async Task UpdateScanResultForBackend(string resultId, string backendId, + public async Task UpdateScanResultForBackend(string resultId, string backendId, long duration, bool completed = false, bool succeeded = false, string[] threats = null) { await _collection.UpdateOneAsync( @@ -80,6 +81,7 @@ namespace MalwareMultiScan.Api.Services { Completed = completed, Succeeded = succeeded, + Duration = duration, Threats = threats ?? new string[] { } })); } diff --git a/MalwareMultiScan.Backends/Messages/ScanResultMessage.cs b/MalwareMultiScan.Backends/Messages/ScanResultMessage.cs index 21807b7..1f9bdb6 100644 --- a/MalwareMultiScan.Backends/Messages/ScanResultMessage.cs +++ b/MalwareMultiScan.Backends/Messages/ScanResultMessage.cs @@ -1,3 +1,5 @@ +using System; + namespace MalwareMultiScan.Backends.Messages { public class ScanResultMessage @@ -7,5 +9,7 @@ namespace MalwareMultiScan.Backends.Messages public bool Succeeded { get; set; } public string[] Threats { get; set; } + + public long Duration { get; set; } } } \ No newline at end of file diff --git a/MalwareMultiScan.Scanner/Services/ScanHostedService.cs b/MalwareMultiScan.Scanner/Services/ScanHostedService.cs index b5cfe09..b85bc49 100644 --- a/MalwareMultiScan.Scanner/Services/ScanHostedService.cs +++ b/MalwareMultiScan.Scanner/Services/ScanHostedService.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using EasyNetQ; @@ -61,6 +62,10 @@ namespace MalwareMultiScan.Scanner.Services Id = message.Id, Backend = _backend.Id }; + + var stopwatch = new Stopwatch(); + + stopwatch.Start(); try { @@ -80,6 +85,12 @@ namespace MalwareMultiScan.Scanner.Services _logger.LogError( exception, "Scanning failed with exception"); } + finally + { + stopwatch.Stop(); + } + + result.Duration = stopwatch.ElapsedMilliseconds / 1000; _logger.LogInformation( $"Sending scan results with status {result.Succeeded}"); diff --git a/MalwareMultiScan.Ui/.dockerignore b/MalwareMultiScan.Ui/.dockerignore index e8f682b..61b82ad 100644 --- a/MalwareMultiScan.Ui/.dockerignore +++ b/MalwareMultiScan.Ui/.dockerignore @@ -1,3 +1,7 @@ +.git +*.Dockerfile +Dockerfile + # Created by .ignore support plugin (hsz.mobi) ### Node template # Logs diff --git a/MalwareMultiScan.Ui/models/scan-result-entry-flattened.ts b/MalwareMultiScan.Ui/models/scan-result-entry-flattened.ts index b4bf981..faa2df9 100644 --- a/MalwareMultiScan.Ui/models/scan-result-entry-flattened.ts +++ b/MalwareMultiScan.Ui/models/scan-result-entry-flattened.ts @@ -4,12 +4,16 @@ export default class ScanResultEntryFlattened implements ScanResultEntry { readonly id: string; readonly completed: boolean; readonly succeeded: boolean | null; + readonly duration: number; readonly threats: string[]; - constructor(id: string, completed: boolean, succeeded: boolean | null, threats: string[]) { + constructor(id: string, completed: boolean, succeeded: boolean | null, duration: number, threats: string[]) { this.id = id; this.completed = completed; this.succeeded = succeeded; + this.duration = duration; this.threats = threats; } + + } diff --git a/MalwareMultiScan.Ui/models/scan-result-entry.ts b/MalwareMultiScan.Ui/models/scan-result-entry.ts index ea9c319..96856b3 100644 --- a/MalwareMultiScan.Ui/models/scan-result-entry.ts +++ b/MalwareMultiScan.Ui/models/scan-result-entry.ts @@ -1,5 +1,6 @@ export default interface ScanResultEntry { readonly completed: boolean, readonly succeeded: boolean | null, + readonly duration: number, readonly threats: string[] } diff --git a/MalwareMultiScan.Ui/pages/_id/index.vue b/MalwareMultiScan.Ui/pages/_id/index.vue index 242a9c5..2b1b92f 100644 --- a/MalwareMultiScan.Ui/pages/_id/index.vue +++ b/MalwareMultiScan.Ui/pages/_id/index.vue @@ -10,6 +10,11 @@ + +