HelperMetrologyFiles.SortAndDelete

HelperEventLog.ClearEventLogs
This commit is contained in:
Mike Phares 2024-01-26 14:13:55 -07:00
parent 58c4b9e487
commit e0f591e987
11 changed files with 276 additions and 13 deletions

View File

@ -1,4 +1,4 @@
[*.csproj] [*.md]
end_of_line = crlf end_of_line = crlf
file_header_template = unset file_header_template = unset
indent_size = 2 indent_size = 2
@ -6,7 +6,7 @@ indent_style = space
insert_final_newline = false insert_final_newline = false
root = true root = true
tab_width = 2 tab_width = 2
[*.md] [*.csproj]
end_of_line = crlf end_of_line = crlf
file_header_template = unset file_header_template = unset
indent_size = 2 indent_size = 2
@ -108,6 +108,7 @@ dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031)
dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed
dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049) dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049)
dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter
dotnet_diagnostic.IDE0270.severity = warning # IDE0270: Null check can be simplified
dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]csharp(IDE0290) dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]csharp(IDE0290)
dotnet_diagnostic.IDE0300.severity = error # IDE0300: Collection initialization can be simplified dotnet_diagnostic.IDE0300.severity = error # IDE0300: Collection initialization can be simplified
dotnet_diagnostic.IDE0301.severity = error #IDE0301: Collection initialization can be simplified dotnet_diagnostic.IDE0301.severity = error #IDE0301: Collection initialization can be simplified

View File

@ -8,7 +8,7 @@
<UserSecretsId>b6f34b8e-5026-41d4-9c28-6516d19d6569</UserSecretsId> <UserSecretsId>b6f34b8e-5026-41d4-9c28-6516d19d6569</UserSecretsId>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.0" /> <PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />

34
Helpers/HelperEventLog.cs Normal file
View File

@ -0,0 +1,34 @@
using File_Watcher.Models;
using System.Diagnostics;
namespace File_Watcher.Helpers;
internal static partial class HelperEventLog
{
internal static bool ClearEventLogs(AppSettings appSettings, ILogger<Worker> logger)
{
if (Directory.Exists(appSettings.WatchDirectory))
{
#pragma warning disable CA1416
using (EventLog eventLog = new("Security", Environment.MachineName))
eventLog.Clear();
logger.LogInformation("{logName} log cleared.", "Security");
foreach (EventLog eventLog in EventLog.GetEventLogs())
{
try
{
eventLog.Clear();
eventLog.Dispose();
logger.LogInformation("{logName} log cleared.", eventLog.LogDisplayName);
}
catch (Exception ex)
{ logger.LogInformation("Error: {logName} - {message}.", eventLog.LogDisplayName, ex.Message); }
}
#pragma warning restore CA1416
logger.LogCritical("{Company}", appSettings.Company);
}
return true;
}
}

View File

@ -0,0 +1,109 @@
using File_Watcher.Models;
using System.Globalization;
namespace File_Watcher.Helpers;
internal static partial class HelperMetrologyFiles
{
private static void Sort(MetrologyConfiguration metrologyConfiguration, ILogger<Worker> logger, Calendar calendar)
{
bool check;
string lines;
int weekOfYear;
string[] files;
string checkFile;
string directory;
FileInfo fileInfo;
string checkDirectory;
DateTime dateTime = DateTime.Now;
foreach (string sourceDirectory in metrologyConfiguration.SourceDirectories)
{
files = Directory.GetFiles(sourceDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files)
{
check = false;
fileInfo = new(file);
if (fileInfo.LastWriteTime > dateTime)
continue;
directory = Path.GetDirectoryName(file) ?? throw new Exception();
for (int i = 0; i < metrologyConfiguration.DirectoriesBack; i++)
directory = Path.GetDirectoryName(directory) ?? throw new Exception();
weekOfYear = calendar.GetWeekOfYear(fileInfo.LastWriteTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
for (int i = 1; i < 3; i++)
{
if (check)
break;
lines = i switch
{
1 => fileInfo.Name,
2 => File.ReadAllText(file),
_ => throw new NotImplementedException()
};
foreach (string hardcodedValue in metrologyConfiguration.HardcodedValues)
{
if (!lines.Contains(hardcodedValue))
continue;
checkDirectory = Path.Combine(directory, $"{fileInfo.LastWriteTime:yyyy}_Week_{weekOfYear:00}", fileInfo.LastWriteTime.ToString("yyyy-MM-dd"), hardcodedValue);
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
checkFile = Path.Combine(checkDirectory, Path.GetFileName(file));
if (File.Exists(checkFile) || !File.Exists(file))
continue;
try
{ File.Move(file, checkFile); }
catch (Exception) { }
check = true;
break;
}
}
}
logger.LogInformation("{sourceDirectory}", sourceDirectory);
}
}
private static void Delete(MetrologyConfiguration metrologyConfiguration, ILogger<Worker> logger, Calendar calendar)
{
string directory;
DateTime dateTime;
string[] directories;
DirectoryInfo directoryInfo;
string yearWeekFormat = "yyyy_Week_00";
DateTime deleteBefore = DateTime.Now.AddDays(-7 * metrologyConfiguration.DeleteOlderThanWeeks);
foreach (string sourceDirectory in metrologyConfiguration.SourceDirectories)
{
directory = sourceDirectory;
for (int i = 0; i < metrologyConfiguration.DirectoriesBack; i++)
directory = Path.GetDirectoryName(directory) ?? throw new Exception();
directories = Directory.GetDirectories(directory, "*", SearchOption.TopDirectoryOnly);
foreach (string weekOfYearDirectory in directories)
{
directoryInfo = new(weekOfYearDirectory);
if (directoryInfo.Name.Length != yearWeekFormat.Length)
continue;
if (!int.TryParse(directoryInfo.Name[..4], out int year))
continue;
if (!int.TryParse(directoryInfo.Name[^2..], out int week))
continue;
dateTime = new(year, 1, 1);
dateTime = dateTime.AddDays(week * 7).AddSeconds(-1);
if (directoryInfo.LastWriteTime != dateTime)
Directory.SetLastWriteTime(directoryInfo.FullName, dateTime);
if (dateTime > deleteBefore)
continue;
Directory.Delete(weekOfYearDirectory, recursive: true);
}
logger.LogInformation("{sourceDirectory}", sourceDirectory);
}
}
internal static bool SortAndDelete(AppSettings appSettings, ILogger<Worker> logger)
{
CultureInfo cultureInfo = new("en-US");
Calendar calendar = cultureInfo.Calendar;
Sort(appSettings.MetrologyConfiguration, logger, calendar);
Delete(appSettings.MetrologyConfiguration, logger, calendar);
return true;
}
}

View File

@ -1,4 +1,5 @@
using File_Watcher.Models; using File_Watcher.Models;
using System.Globalization;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace File_Watcher.Helpers; namespace File_Watcher.Helpers;
@ -12,9 +13,13 @@ internal static partial class HelperStratus
private static void TryMoveFile(AppSettings appSettings, string checkFile) private static void TryMoveFile(AppSettings appSettings, string checkFile)
{ {
string line; string line;
string weekYearDirectory;
List<string> collection = []; List<string> collection = [];
DateTime dateTime = DateTime.Now;
Calendar calendar = new CultureInfo("en-US").Calendar;
char start = appSettings.StratusConfiguration.FileDelimiterPattern[0]; char start = appSettings.StratusConfiguration.FileDelimiterPattern[0];
string[] lines = !File.Exists(checkFile) ? [] : File.ReadAllLines(checkFile); string[] lines = !File.Exists(checkFile) ? [] : File.ReadAllLines(checkFile);
string weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
for (int i = 0; i < lines.Length; i++) for (int i = 0; i < lines.Length; i++)
{ {
line = lines[i]; line = lines[i];
@ -23,7 +28,10 @@ internal static partial class HelperStratus
continue; continue;
if (!Regex.Match(line, appSettings.StratusConfiguration.FileDelimiterPattern).Success) if (!Regex.Match(line, appSettings.StratusConfiguration.FileDelimiterPattern).Success)
continue; continue;
File.WriteAllLines(Path.Combine(appSettings.WatchDirectory, $"{DateTime.Now.Ticks}.txt"), collection); weekYearDirectory = Path.Combine(appSettings.WatchDirectory, $"{dateTime.Year}_Week_{weekOfYear}");
if (!Directory.Exists(weekYearDirectory))
_ = Directory.CreateDirectory(weekYearDirectory);
File.WriteAllLines(Path.Combine(weekYearDirectory, $"{dateTime.Ticks}.txt"), collection);
collection.Clear(); collection.Clear();
for (int j = i + 1; j < lines.Length; j++) for (int j = i + 1; j < lines.Length; j++)
collection.Add(lines[j]); collection.Add(lines[j]);
@ -35,11 +43,14 @@ internal static partial class HelperStratus
internal static bool MoveFile(AppSettings appSettings, ILogger<Worker> logger) internal static bool MoveFile(AppSettings appSettings, ILogger<Worker> logger)
{ {
string file = Path.Combine(appSettings.WatchDirectory, appSettings.StratusConfiguration.WatchFile); string checkFile = Path.Combine(appSettings.WatchDirectory, appSettings.StratusConfiguration.WatchFile);
try try
{ TryMoveFile(appSettings, file); } { TryMoveFile(appSettings, checkFile); }
catch (Exception ex) catch (Exception ex)
{ logger.LogError(ex, "Inner loop error!"); } {
logger.LogError(ex, "Inner loop error!");
Thread.Sleep(appSettings.MillisecondsDelay * 5);
}
return true; return true;
} }

View File

@ -4,6 +4,7 @@ using System.Text.Json.Serialization;
namespace File_Watcher.Models; namespace File_Watcher.Models;
public record AppSettings(EAFLogConfiguration EAFLogConfiguration, public record AppSettings(EAFLogConfiguration EAFLogConfiguration,
MetrologyConfiguration MetrologyConfiguration,
StratusConfiguration StratusConfiguration, StratusConfiguration StratusConfiguration,
WaferCounterConfiguration WaferCounterConfiguration, WaferCounterConfiguration WaferCounterConfiguration,
string BuildNumber, string BuildNumber,

View File

@ -43,6 +43,7 @@ public class AppSettings
private static Models.AppSettings Get(AppSettings? appSettings, private static Models.AppSettings Get(AppSettings? appSettings,
Models.EAFLogConfiguration eafLogConfiguration, Models.EAFLogConfiguration eafLogConfiguration,
Models.MetrologyConfiguration metrologyConfiguration,
Models.StratusConfiguration stratusConfiguration, Models.StratusConfiguration stratusConfiguration,
Models.WaferCounterConfiguration waferCounterConfiguration) Models.WaferCounterConfiguration waferCounterConfiguration)
{ {
@ -56,6 +57,7 @@ public class AppSettings
if (appSettings.WatchDirectory is null) throw new NullReferenceException(nameof(WatchDirectory)); if (appSettings.WatchDirectory is null) throw new NullReferenceException(nameof(WatchDirectory));
Verify(appSettings); Verify(appSettings);
result = new(eafLogConfiguration, result = new(eafLogConfiguration,
metrologyConfiguration,
stratusConfiguration, stratusConfiguration,
waferCounterConfiguration, waferCounterConfiguration,
appSettings.BuildNumber, appSettings.BuildNumber,
@ -69,6 +71,7 @@ public class AppSettings
public static Models.AppSettings Get(IConfigurationRoot configurationRoot, public static Models.AppSettings Get(IConfigurationRoot configurationRoot,
Models.EAFLogConfiguration eafLogConfiguration, Models.EAFLogConfiguration eafLogConfiguration,
Models.MetrologyConfiguration metrologyConfiguration,
Models.StratusConfiguration stratusConfiguration, Models.StratusConfiguration stratusConfiguration,
Models.WaferCounterConfiguration waferCounterConfiguration) Models.WaferCounterConfiguration waferCounterConfiguration)
{ {
@ -79,6 +82,7 @@ public class AppSettings
PreVerify(configurationRoot, appSettings); PreVerify(configurationRoot, appSettings);
result = Get(appSettings, result = Get(appSettings,
eafLogConfiguration, eafLogConfiguration,
metrologyConfiguration,
stratusConfiguration, stratusConfiguration,
waferCounterConfiguration); waferCounterConfiguration);
return result; return result;

View File

@ -0,0 +1,76 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace File_Watcher.Models.Binder;
public class MetrologyConfiguration
{
public int? DirectoriesBack { get; set; }
public int? DeleteOlderThanWeeks { get; set; }
public string[]? HardcodedValues { get; set; }
public string[]? SourceDirectories { get; set; }
public override string ToString()
{
string result = JsonSerializer.Serialize(this, BinderMetrologyConfigurationSourceGenerationContext.Default.MetrologyConfiguration);
return result;
}
private static void PreVerify(IConfigurationRoot configurationRoot, MetrologyConfiguration? configuration)
{
if (configuration?.DirectoriesBack is null)
{
foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers)
{
if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider)
continue;
if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider)
continue;
if (!physicalFileProvider.Root.Contains("UserSecrets"))
continue;
throw new NotSupportedException(physicalFileProvider.Root);
}
throw new NotSupportedException("Not Found!");
}
}
private static void Verify(MetrologyConfiguration _)
{
}
private static Models.MetrologyConfiguration Get(MetrologyConfiguration? configuration)
{
Models.MetrologyConfiguration result;
if (configuration is null) throw new NullReferenceException(nameof(configuration));
if (configuration.DirectoriesBack is null) throw new NullReferenceException(nameof(configuration.DirectoriesBack));
if (configuration.DeleteOlderThanWeeks is null) throw new NullReferenceException(nameof(configuration.DeleteOlderThanWeeks));
if (configuration.HardcodedValues is null) throw new NullReferenceException(nameof(configuration.HardcodedValues));
if (configuration.SourceDirectories is null) throw new NullReferenceException(nameof(configuration.SourceDirectories));
Verify(configuration);
result = new(configuration.DirectoriesBack.Value,
configuration.DeleteOlderThanWeeks.Value,
configuration.HardcodedValues,
configuration.SourceDirectories);
return result;
}
public static Models.MetrologyConfiguration Get(IConfigurationRoot configurationRoot)
{
Models.MetrologyConfiguration result;
IConfigurationSection configurationSection = configurationRoot.GetSection(nameof(Models.MetrologyConfiguration));
#pragma warning disable IL3050, IL2026
MetrologyConfiguration? configuration = configurationSection.Get<MetrologyConfiguration>();
#pragma warning restore IL3050, IL2026
PreVerify(configurationRoot, configuration);
result = Get(configuration);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(MetrologyConfiguration))]
internal partial class BinderMetrologyConfigurationSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -0,0 +1,24 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace File_Watcher.Models;
public record MetrologyConfiguration(int DirectoriesBack,
int DeleteOlderThanWeeks,
string[] HardcodedValues,
string[] SourceDirectories)
{
public override string ToString()
{
string result = JsonSerializer.Serialize(this, MetrologyConfigurationSourceGenerationContext.Default.MetrologyConfiguration);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(MetrologyConfiguration))]
internal partial class MetrologyConfigurationSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -15,9 +15,10 @@ public class Program
#pragma warning restore IL3050 #pragma warning restore IL3050
_ = webApplicationBuilder.Configuration.AddUserSecrets<Program>(); _ = webApplicationBuilder.Configuration.AddUserSecrets<Program>();
EAFLogConfiguration eafLogConfiguration = Models.Binder.EAFLogConfiguration.Get(webApplicationBuilder.Configuration); EAFLogConfiguration eafLogConfiguration = Models.Binder.EAFLogConfiguration.Get(webApplicationBuilder.Configuration);
MetrologyConfiguration metrologyConfiguration = Models.Binder.MetrologyConfiguration.Get(webApplicationBuilder.Configuration);
StratusConfiguration stratusConfiguration = Models.Binder.StratusConfiguration.Get(webApplicationBuilder.Configuration); StratusConfiguration stratusConfiguration = Models.Binder.StratusConfiguration.Get(webApplicationBuilder.Configuration);
WaferCounterConfiguration waferCounterConfiguration = Models.Binder.WaferCounterConfiguration.Get(webApplicationBuilder.Configuration); WaferCounterConfiguration waferCounterConfiguration = Models.Binder.WaferCounterConfiguration.Get(webApplicationBuilder.Configuration);
AppSettings appSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration, eafLogConfiguration, stratusConfiguration, waferCounterConfiguration); AppSettings appSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration, eafLogConfiguration, metrologyConfiguration, stratusConfiguration, waferCounterConfiguration);
if (string.IsNullOrEmpty(appSettings.Company)) if (string.IsNullOrEmpty(appSettings.Company))
throw new Exception("Company name must have a value!"); throw new Exception("Company name must have a value!");
try try
@ -38,21 +39,21 @@ public class Program
#pragma warning restore #pragma warning restore
}); });
} }
using IHost host = webApplicationBuilder.Build(); using WebApplication webApplication = webApplicationBuilder.Build();
logger = host.Services.GetRequiredService<ILogger<Program>>(); logger = webApplication.Services.GetRequiredService<ILogger<Program>>();
if (string.IsNullOrEmpty(appSettings.Company)) if (string.IsNullOrEmpty(appSettings.Company))
{ {
Environment.ExitCode = -1; Environment.ExitCode = -1;
_ = host.StopAsync(); _ = webApplication.StopAsync();
} }
logger.LogInformation("Starting Web Application"); logger.LogInformation("Starting Web Application");
logger.LogCritical("{Company}", appSettings.Company); logger.LogCritical("{Company}", appSettings.Company);
await host.RunAsync(); await webApplication.RunAsync();
} }
catch (Exception ex) catch (Exception ex)
{ {
try try
{ logger?.LogCritical(ex, "Host terminated unexpectedly"); } { logger?.LogCritical(ex, "WebApplication terminated unexpectedly"); }
catch (Exception) { } catch (Exception) { }
throw; throw;
} }

View File

@ -33,7 +33,9 @@ public partial class Worker : BackgroundService
{ {
nameof(Helpers.HelperEAFLog) => Helpers.HelperEAFLog.DeleteFiles(_AppSettings, _Logger), nameof(Helpers.HelperEAFLog) => Helpers.HelperEAFLog.DeleteFiles(_AppSettings, _Logger),
nameof(Helpers.HelperStratus) => Helpers.HelperStratus.MoveFile(_AppSettings, _Logger), nameof(Helpers.HelperStratus) => Helpers.HelperStratus.MoveFile(_AppSettings, _Logger),
nameof(Helpers.HelperEventLog) => Helpers.HelperEventLog.ClearEventLogs(_AppSettings, _Logger),
nameof(Helpers.HelperWaferCounter) => Helpers.HelperWaferCounter.MoveFile(_AppSettings, _Logger), nameof(Helpers.HelperWaferCounter) => Helpers.HelperWaferCounter.MoveFile(_AppSettings, _Logger),
nameof(Helpers.HelperMetrologyFiles) => Helpers.HelperMetrologyFiles.SortAndDelete(_AppSettings, _Logger),
_ => throw new NotSupportedException() _ => throw new NotSupportedException()
}; };
} }