Switch multilevel app settings

Removed gpcl6win64 and LincPDFC just from proj file

Removed package.json to clean out publish directory
This commit is contained in:
Mike Phares 2025-03-05 16:50:02 -07:00
parent 84d1b07301
commit 4e6504af7e
19 changed files with 161 additions and 466 deletions

View File

@ -1,195 +0,0 @@
{
"CamstarOracleConfiguration": {
"DateFormat": "yyyy-MM-dd HH:mm:ss:fff",
"DirectoryX": "C:/Users/ECUSLEOCamstarTsvc/AppData/Local/IFXApps/WinLog/Logs",
"Directory": "D:/Tmp/Phares/WinLog/Logs",
"LogFilter": "Camstar",
"MessageFilters": [
"Connection Dead",
"not connected to ORACLE"
],
"MillisecondsDelay": 90000,
"MonitorApplicationResource": "LEO_CAMSTAR_ORACLE_P21_COUNT",
"MonitorApplicationSite": "auc",
"RollingMinutes": 998877123
},
"CompassConfiguration": {
"Destination": "\\\\10.95.1.211\\Share\\RawData\\TRENDLOG",
"HoursBack": 4,
"MonthPattern": "MMM",
"Pattern": "*.csv",
"Source": "C:/Alerton/Compass/1.0/CLIMATEC/archive/trendlog",
"TriggerAppendage": ".trg",
"YearPattern": "yyyy"
},
"DriveConfiguration": {
"Letter": "s",
"Password": "zjtaxxwdEnJ/9tfXQFdj6TKiKBAmpCHWjdi6XYrflw4=",
"Share": "\\\\10.95.1.211\\Share",
"Use": true,
"User": "infineon\\ECMESEAF"
},
"EAFLogConfiguration": {
"SearchPattern": "*.log*"
},
"EAFProgramDataConfiguration": {
"Destination": "\\\\messa08ec.infineon.com\\d$\\ProgramData\\EC_Characterization_Si\\RawData",
"Source": "D:/ProgramData/EC_Characterization_Si/RawData"
},
"EDADatabaseConfiguration": {
"CSharpDateTimeFormat": "yyyy-MM-dd_hh:mm:ss tt",
"FileShare": "\\\\mesfs.infineon.com\\EC_EDA",
"Name": "Staging",
"OracleDateTimeFormat": "yyyy-MM-dd_hh:mi:ss AM",
"Password": "8vIs2nEZPkcdBUfXX0hHlA==",
"TNS": "(description=(address_list=(address=(protocol=tcp)(host=fimess-db.mes.infineon.com)(port=7001)))(connect_data=(sid=fimess)))",
"TNSX": "(description=(address_list=(address=(protocol=tcp)(host=fimesp-db.mes.infineon.com)(port=7002)))(connect_data=(sid=fimesp)))",
"UserName": "edastag"
},
"IsoConfiguration": {
"DestinationDirectory": "D:/EAF/drssdv702.eu.infineon.com-eafdev-DeliveredPackages-IFX.EAF Kernel SEMI/v2.57.0.0",
"SourceDirectory": "\\\\eafdev.drs.infineon.com\\eafdev\\DeliveredPackages\\IFX.EAF Kernel SEMI\\v2.57.0.0\\EAF v2.57.0.0 API\\complete_with_adaptations"
},
"InfinityQSConfiguration": {
"ConnectionStringX": "Data Source=messad1001\\test1,59583;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;",
"ConnectionStringXX": "Data Source=messqlec1.infineon.com\\PROD1,53959;Initial Catalog=Metrology;User ID=metrology_rouser;Password=Metrologyrouser2024!;",
"ConnectionStringXXX": "Data Source=messqlec1.infineon.com\\PROD1,53959;Initial Catalog=IRMNSPC;User ID=IRMNSPC;Password=dsaf;",
"ConnectionString": "Data Source=messqlec1.infineon.com\\PROD1,53959;Initial Catalog=IRMNSPC;Integrated Security=True;",
"DestinationDirectory": "L:/File-Watcher/Helper/InfinityQS",
"SubGroupTime": 1727177147,
"TestsFile": "L:/File-Watcher/Helper/InfinityQS/.json",
"Tests": [
{
"Name": "Bin2",
"Value": 1655396897
},
{
"Name": "Thresh",
"Value": 1655396909
},
{
"Name": "GradeStdDev",
"Value": 1656695902
},
{
"Name": "HgCV Res Average",
"Value": 1228920625
},
{
"Name": "3mm Edge % from R/2",
"Value": 1423499546
},
{
"Name": "Average Sum of Defects",
"Value": 1125073605
}
]
},
"MetrologyConfiguration": {
"DeleteOlderThanWeeks": 16,
"DirectoriesBack": 2,
"HardcodedValues": [
"BIORAD2",
"BIORAD3",
"BIORAD4",
"BIORAD5",
"CDE2",
"CDE3",
"CDE4",
"CDE5",
"CDE6",
"HGCV1",
"HGCV2",
"HGCV3",
"TENCOR1",
"TENCOR2",
"TENCOR3",
"SP101",
"SPV01",
"SRP",
"WC6Inch",
"WC8Inch",
"Bio-Rad"
],
"SourceDirectories": [
"\\\\messa01ec.infineon.com\\apps\\Metrology\\Run Data Repository\\MET08ANLYSDIFAAST230\\Source\\MET08ANLYSDIFAAST230",
"\\\\messa01ec.infineon.com\\apps\\Metrology\\Run Data Repository\\MET08DDUPSFS6420\\Source\\MET08DDUPSFS6420",
"\\\\messa01ec.infineon.com\\apps\\Metrology\\Run Data Repository\\MET08DDUPSP1TBI\\Source\\MET08DDUPSP1TBI",
"\\\\messa01ec.infineon.com\\apps\\Metrology\\Run Data Repository\\MET08RESIHGCV\\Source\\MET08RESIHGCV",
"\\\\messa01ec.infineon.com\\apps\\Metrology\\Run Data Repository\\MET08RESIMAPCDE\\Source\\MET08RESIMAPCDE",
"\\\\messa01ec.infineon.com\\apps\\Metrology\\Run Data Repository\\MET08RESISRP2100\\Source\\MET08RESISRP2100",
"\\\\messa01ec.infineon.com\\apps\\Metrology\\Run Data Repository\\MET08THFTIRQS408M\\Source\\MET08THFTIRQS408M",
"\\\\messa01ec.infineon.com\\apps\\Metrology\\Run Data Repository\\MET08THFTIRSTRATUS\\Source\\MET08THFTIRSTRATUS"
]
},
"NugetConfiguration": {
"Destination": "L:/File-Watcher/Helper/Nuget/Packages",
"KeyFileExtension": ".nuspec",
"KeyFileExtensionB": "icon",
"KeyFileExtensionC": "readme",
"RenameToLower": true,
"SearchPattern": "*.nupkg",
"Source": "C:/Users/phares/.nuget/packages"
},
"SerialConfiguration": {
"Destination": "L:/DevOps/MESA_FI/File-Watcher/.vscode",
"GhostPCLFileName": "gpcl6win64.exe",
"LincPDFCFileName": "LincPDFC.exe",
"PortName": "COM37"
},
"StratusConfiguration": {
"Days": 4,
"Destination": "D:/Tmp",
"DestinationX": "\\\\10.95.1.211\\Share\\RawData\\BIORAD4",
"FileDelimiterPattern": "Mean [0-9.]*, STDD [0-9.]*",
"WatchFile": "DataBiorad.txt"
},
"TransmissionControlProtocolConfiguration": {
"Destination": "L:/DevOps/MESA_FI/File-Watcher/.vscode",
"GhostPCLFileName": "gpcl6win64.exe",
"IPAddress": "COM37",
"IPAddresses": {
"10.95.154.19": [
"EPP-WEST",
"6INCH",
"WC6INCH3"
],
"10.95.154.43": [
"FQA",
"6INCH",
"WC6INCH1"
],
"10.95.154.44": [
"MU",
"6INCH",
"WC6INCH2"
],
"10.95.154.46": [
"EPP-EAST",
"6INCH",
"WC6INCH4"
],
"10.95.154.47": [
"FQA",
"8INCH",
"WC8INCH1"
],
"10.95.154.48": [
"MU",
"8INCH",
"WC8INCH2"
],
"10.95.154.49": [
"EPP-WEST",
"8INCH",
"WC8INCH3"
]
},
"Port": 950,
"Server": false
},
"WaferCounterConfiguration": {
"Destination": "\\\\mestsa01ec.infineon.com\\apps\\WaferCounter\\V203",
"MatchPath": false
}
}

10
.vscode/settings.json vendored
View File

@ -15,19 +15,29 @@
"Camstar",
"CHIL",
"DEAT",
"DEVICEHEIGHTPOINTS",
"DEVICEWIDTHPOINTS",
"endianness",
"FAMC",
"FAMS",
"FIXEDMEDIA",
"GIVN",
"gpcl",
"Hmmssfff",
"HUSB",
"INDI",
"Infineon",
"Kanban",
"kanbn",
"Kofax",
"linc",
"Linc",
"NOPAUSE",
"NSFX",
"OBJE",
"onenote",
"PDFC",
"pdfwrite",
"PDSF",
"pged",
"Phares",

View File

@ -18,30 +18,10 @@
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.1" />
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="23.6.0" />
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.10" />
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="23.7.0" />
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.13" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
<PackageReference Include="System.IO.Ports" Version="8.0.0" />
<PackageReference Include="System.Text.Json" Version="8.0.5" />
</ItemGroup>
<ItemGroup>
<None Condition="'$(Configuration)' == 'Debug'" Include="\\mestsa003.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6dll64.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Condition="'$(Configuration)' == 'Debug'" Include="\\mestsa003.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6win64.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Condition="'$(Configuration)' == 'Debug'" Include="\\mestsa003.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\LincPDFC\v2.6.6.21\LincPDFC.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Condition="'$(Configuration)' == 'Release'" Include="\\mesfs.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6dll64.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Condition="'$(Configuration)' == 'Release'" Include="\\mesfs.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6win64.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Condition="'$(Configuration)' == 'Release'" Include="\\mesfs.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\LincPDFC\v2.6.6.21\LincPDFC.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<PackageReference Include="System.Text.Json" Version="9.0.2" />
</ItemGroup>
</Project>

View File

@ -29,7 +29,7 @@ internal class HelperCompass
if (string.IsNullOrEmpty(appSettings.DriveConfiguration.Password))
decrypted = string.Empty;
else
decrypted = RijndaelEncryption.Decrypt(appSettings.DriveConfiguration.Password, appSettings.Company);
decrypted = RijndaelEncryption.Decrypt(appSettings.DriveConfiguration.Password, appSettings.FileWatcherConfiguration.Company);
arguments = $"use {appSettings.DriveConfiguration.Letter}: \"{appSettings.DriveConfiguration.Share}\" /p:yes /user:{appSettings.DriveConfiguration.User} {decrypted}";
_ = stringBuilder.Clear();
segments = arguments.Split(' ');

View File

@ -7,8 +7,8 @@ internal static partial class HelperEAFLog
internal static bool DeleteFiles(AppSettings appSettings, ILogger<Worker> logger)
{
string[] files = Directory.GetFiles(appSettings.WatchDirectory, appSettings.EAFLogConfiguration.SearchPattern, SearchOption.AllDirectories);
logger.LogInformation("After {MillisecondsDelay} with search pattern '{SearchPattern}' found {files}", appSettings.MillisecondsDelay, appSettings.EAFLogConfiguration.SearchPattern, files.Length);
string[] files = Directory.GetFiles(appSettings.FileWatcherConfiguration.WatchDirectory, appSettings.EAFLogConfiguration.SearchPattern, SearchOption.AllDirectories);
logger.LogInformation("After {MillisecondsDelay} with search pattern '{SearchPattern}' found {files}", appSettings.FileWatcherConfiguration.MillisecondsDelay, appSettings.EAFLogConfiguration.SearchPattern, files.Length);
foreach (string file in files)
{
if (file.EndsWith(".dll"))

View File

@ -1,9 +1,7 @@
using File_Watcher.Helpers.EDA;
using File_Watcher.Models;
using System.Globalization;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Xml;
using System.Xml.Serialization;
@ -12,12 +10,8 @@ namespace File_Watcher.Helpers;
internal static partial class HelperEDADatabase
{
private static Calendar? _Calendar;
private static string? _EDADataCollectionPlansLastRun;
[GeneratedRegex("[a-zA-Z0-9]{1,}")]
private static partial Regex RegexAZ09();
private static Stream ToStream(string @this)
{
MemoryStream? stream = new();
@ -207,7 +201,7 @@ internal static partial class HelperEDADatabase
}
}
private static void DataCollectionPlans(AppSettings appSettings, ILogger<Worker> logger, Calendar calendar, CancellationToken cancellationToken)
private static void DataCollectionPlans(AppSettings appSettings, ILogger<Worker> logger, CancellationToken cancellationToken)
{
int fieldCount;
object @object;
@ -219,7 +213,7 @@ internal static partial class HelperEDADatabase
Array objectTypes = Enum.GetValues(typeof(ModuleInstanceTypeName));
#pragma warning restore IL3050
Dictionary<string, Dictionary<ModuleInstanceTypeName, List<List<object>>>> rows = [];
string decrypted = RijndaelEncryption.Decrypt(appSettings.EDADatabaseConfiguration.Password, appSettings.Company);
string decrypted = RijndaelEncryption.Decrypt(appSettings.EDADatabaseConfiguration.Password, appSettings.FileWatcherConfiguration.Company);
string connectionString = $"Data Source={appSettings.EDADatabaseConfiguration.TNS}; User Id={appSettings.EDADatabaseConfiguration.UserName}; Password={decrypted};";
rows.Add(appSettings.EDADatabaseConfiguration.Name, []);
foreach (ModuleInstanceTypeName objectType in objectTypes)
@ -278,8 +272,7 @@ internal static partial class HelperEDADatabase
internal static bool SaveDataCollectionPlans(AppSettings appSettings, ILogger<Worker> logger, CancellationToken cancellationToken)
{
_Calendar ??= new CultureInfo("en-US").Calendar;
DataCollectionPlans(appSettings, logger, _Calendar, cancellationToken);
DataCollectionPlans(appSettings, logger, cancellationToken);
return true;
}

View File

@ -8,7 +8,7 @@ internal static partial class HelperEventLog
internal static bool ClearEventLogs(AppSettings appSettings, ILogger<Worker> logger)
{
if (Directory.Exists(appSettings.WatchDirectory))
if (Directory.Exists(appSettings.FileWatcherConfiguration.WatchDirectory))
{
#pragma warning disable CA1416
using (EventLog eventLog = new("Security", Environment.MachineName))
@ -26,7 +26,7 @@ internal static partial class HelperEventLog
{ logger.LogInformation("Error: {logName} - {message}.", eventLog.LogDisplayName, ex.Message); }
}
#pragma warning restore CA1416
logger.LogCritical("{Company}", appSettings.Company);
logger.LogCritical("{Company}", appSettings.FileWatcherConfiguration.Company);
}
return true;
}

View File

@ -6,10 +6,23 @@ namespace File_Watcher.Helpers;
internal static partial class HelperInfinityQS
{
private static void KillExisting(string processName)
{
Process[] processes = Process.GetProcessesByName(processName);
foreach (Process process in processes)
{
try
{ process.Kill(); }
catch (Exception) { }
}
}
private static void RunMI()
{
#pragma warning disable CA1416
ProcessStartInfo processStartInfo = new("iispcmi.exe")
string processName = "iispcmi.exe";
KillExisting(processName);
ProcessStartInfo processStartInfo = new(processName)
{
Domain = "Infineon",
UseShellExecute = false,
@ -17,14 +30,15 @@ internal static partial class HelperInfinityQS
PasswordInClearText = "j(1(P%xB=g}3w9db",
WorkingDirectory = "C:/Program Files (x86)/InfinityQS International/ProFicient/Applications"
};
TimeSpan timeSpan = new(DateTime.Now.AddDays(7).Ticks - DateTime.Now.Ticks);
Process process = Process.Start(processStartInfo) ?? throw new NullReferenceException(nameof(Process));
process.WaitForExit();
_ = process.WaitForExit((int)timeSpan.TotalMilliseconds);
#pragma warning restore CA1416
}
internal static bool Select(AppSettings appSettings, ILogger<Worker> logger)
{
logger.LogInformation(appSettings.Company);
logger.LogInformation(appSettings.FileWatcherConfiguration.Company);
RunMI();
return true;
}

View File

@ -29,7 +29,7 @@ internal static partial class HelperStratus
continue;
if (!Regex.Match(line, appSettings.StratusConfiguration.FileDelimiterPattern).Success)
continue;
weekYearDirectory = Path.Combine(appSettings.WatchDirectory, $"{fileInfo.CreationTime.Year}_Week_{weekOfYear}");
weekYearDirectory = Path.Combine(appSettings.FileWatcherConfiguration.WatchDirectory, $"{fileInfo.CreationTime.Year}_Week_{weekOfYear}");
checkDirectory = Path.Combine(weekYearDirectory, fileInfo.CreationTime.ToString("yyyy-MM-dd"));
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
@ -81,19 +81,19 @@ internal static partial class HelperStratus
internal static bool MoveFile(AppSettings appSettings, ILogger<Worker> logger)
{
// http://10.95.154.10:8081/2023_Week_45/2023-11-08/a.txt
string checkFile = Path.Combine(appSettings.WatchDirectory, appSettings.StratusConfiguration.WatchFile);
string checkFile = Path.Combine(appSettings.FileWatcherConfiguration.WatchDirectory, appSettings.StratusConfiguration.WatchFile);
try
{ TryMoveFile(appSettings, checkFile); }
catch (Exception ex)
{
logger.LogError(ex, "Inner loop error!");
Thread.Sleep(appSettings.MillisecondsDelay * 5);
Thread.Sleep(appSettings.FileWatcherConfiguration.MillisecondsDelay * 5);
}
Console.WriteLine("Hello");
int days = appSettings.StratusConfiguration.Days;
string sourceDirectory = appSettings.WatchDirectory;
int millisecondsDelay = appSettings.MillisecondsDelay;
string pattern = appSettings.StratusConfiguration.FileDelimiterPattern;
string sourceDirectory = appSettings.FileWatcherConfiguration.WatchDirectory;
int millisecondsDelay = appSettings.FileWatcherConfiguration.MillisecondsDelay;
string archiveDirectory = Path.GetFullPath(appSettings.StratusConfiguration.Destination);
try
{ TryArchiveFilesFramework(sourceDirectory, pattern, archiveDirectory, days); }

View File

@ -99,7 +99,7 @@ internal static partial class HelperTCP
{
List<byte> results = [];
byte[] bytes = new byte[1024];
string directory = Path.Combine(transmissionControlProtocolConfiguration.Destination, transmissionControlProtocolConfiguration.IPAddress);
string directory = Path.GetFullPath(Path.Combine(transmissionControlProtocolConfiguration.Destination, transmissionControlProtocolConfiguration.IPAddress));
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
do
@ -110,7 +110,7 @@ internal static partial class HelperTCP
}
while (networkStream.DataAvailable);
if (results.Count > 0)
File.WriteAllBytes(string.Concat(directory, $"-{DateTime.Now.Ticks}{directory[^1]}.raw"), results.ToArray());
File.WriteAllBytes(Path.Combine(directory, $"{DateTime.Now.Ticks}{directory[^1]}.raw"), results.ToArray());
}
internal static bool ReadWrite(AppSettings appSettings, ILogger<Worker> logger)

View File

@ -11,7 +11,7 @@ internal static partial class HelperWaferCounter
string checkFile;
FileInfo fileInfo;
string checkDirectory;
string[] directories = Directory.GetDirectories(appSettings.WatchDirectory, "*", SearchOption.TopDirectoryOnly);
string[] directories = Directory.GetDirectories(appSettings.FileWatcherConfiguration.WatchDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
checkDirectory = !appSettings.WaferCounterConfiguration.MatchPath ? appSettings.WaferCounterConfiguration.Destination : Path.Combine(appSettings.WaferCounterConfiguration.Destination, Path.GetFileName(directory));
@ -23,7 +23,7 @@ internal static partial class HelperWaferCounter
foreach (string file in files)
{
fileInfo = new(file);
if (new TimeSpan(DateTime.Now.Ticks - fileInfo.LastWriteTime.Ticks).TotalMilliseconds < appSettings.MillisecondsDelay)
if (new TimeSpan(DateTime.Now.Ticks - fileInfo.LastWriteTime.Ticks).TotalMilliseconds < appSettings.FileWatcherConfiguration.MillisecondsDelay)
continue;
checkFile = Path.Combine(checkDirectory, Path.GetFileName(file));
if (File.Exists(checkFile))

View File

@ -8,6 +8,7 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration,
DriveConfiguration DriveConfiguration,
EAFLogConfiguration EAFLogConfiguration,
EDADatabaseConfiguration EDADatabaseConfiguration,
FileWatcherConfiguration FileWatcherConfiguration,
InfinityQSConfiguration InfinityQSConfiguration,
IsoConfiguration IsoConfiguration,
MetrologyConfiguration MetrologyConfiguration,
@ -15,13 +16,7 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration,
SerialConfiguration SerialConfiguration,
StratusConfiguration StratusConfiguration,
TransmissionControlProtocolConfiguration TransmissionControlProtocolConfiguration,
WaferCounterConfiguration WaferCounterConfiguration,
string BuildNumber,
string Company,
string GitCommitSeven,
string Helper,
int MillisecondsDelay,
string WatchDirectory)
WaferCounterConfiguration WaferCounterConfiguration)
{
public override string ToString()
@ -30,6 +25,73 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration,
return result;
}
private static void Verify(AppSettings _)
{ }
public static AppSettings Get(IConfigurationRoot configurationRoot)
{
AppSettings result;
#pragma warning disable IL3050, IL2026
CamstarOracleConfiguration? camstarOracleConfiguration = configurationRoot.GetSection(nameof(CamstarOracleConfiguration)).Get<CamstarOracleConfiguration>();
CompassConfiguration? compassConfiguration = configurationRoot.GetSection(nameof(CompassConfiguration)).Get<CompassConfiguration>();
DriveConfiguration? driveConfiguration = configurationRoot.GetSection(nameof(DriveConfiguration)).Get<DriveConfiguration>();
EAFLogConfiguration? eafLogConfiguration = configurationRoot.GetSection(nameof(EAFLogConfiguration)).Get<EAFLogConfiguration>();
EDADatabaseConfiguration? edaDatabaseConfiguration = configurationRoot.GetSection(nameof(EDADatabaseConfiguration)).Get<EDADatabaseConfiguration>();
FileWatcherConfiguration? fileWatcherConfiguration = configurationRoot.GetSection(nameof(FileWatcherConfiguration)).Get<FileWatcherConfiguration>();
InfinityQSConfiguration? infinityQSConfiguration = configurationRoot.GetSection(nameof(InfinityQSConfiguration)).Get<InfinityQSConfiguration>();
IsoConfiguration? isoConfiguration = configurationRoot.GetSection(nameof(IsoConfiguration)).Get<IsoConfiguration>();
MetrologyConfiguration? metrologyConfiguration = configurationRoot.GetSection(nameof(MetrologyConfiguration)).Get<MetrologyConfiguration>();
NugetConfiguration? nugetConfiguration = configurationRoot.GetSection(nameof(NugetConfiguration)).Get<NugetConfiguration>();
SerialConfiguration? serialConfiguration = configurationRoot.GetSection(nameof(SerialConfiguration)).Get<SerialConfiguration>();
StratusConfiguration? stratusConfiguration = configurationRoot.GetSection(nameof(StratusConfiguration)).Get<StratusConfiguration>();
TransmissionControlProtocolConfiguration? transmissionControlProtocolConfiguration = configurationRoot.GetSection(nameof(TransmissionControlProtocolConfiguration)).Get<TransmissionControlProtocolConfiguration>();
WaferCounterConfiguration? waferCounterConfiguration = configurationRoot.GetSection(nameof(WaferCounterConfiguration)).Get<WaferCounterConfiguration>();
#pragma warning restore IL3050, IL2026
if (camstarOracleConfiguration is null
|| compassConfiguration is null
|| driveConfiguration is null
|| eafLogConfiguration is null
|| edaDatabaseConfiguration is null
|| fileWatcherConfiguration is null
|| infinityQSConfiguration is null
|| isoConfiguration is null
|| metrologyConfiguration is null
|| nugetConfiguration is null
|| serialConfiguration is null
|| stratusConfiguration is null
|| transmissionControlProtocolConfiguration is null
|| waferCounterConfiguration is null
|| fileWatcherConfiguration?.Company is null)
{
List<string> paths = [];
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;
paths.Add(physicalFileProvider.Root);
}
throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}");
}
result = new(camstarOracleConfiguration,
compassConfiguration,
driveConfiguration,
eafLogConfiguration,
edaDatabaseConfiguration,
fileWatcherConfiguration,
infinityQSConfiguration,
isoConfiguration,
metrologyConfiguration,
nugetConfiguration,
serialConfiguration,
stratusConfiguration,
transmissionControlProtocolConfiguration,
waferCounterConfiguration);
Verify(result);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]

View File

@ -1,2 +0,0 @@
[*.cs]
csharp_preserve_single_line_statements = true

View File

@ -1,150 +0,0 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace File_Watcher.Models.Binder;
public class AppSettings
{
public string? BuildNumber { get; set; }
public string[]? ConfigurationDirectoryNames { get; set; }
public int? ConfigurationSpecialFolder { get; set; }
public string? ConfigurationFileName { get; set; }
public string? Company { get; set; }
public string? GitCommitSeven { get; set; }
public string? Helper { get; set; }
public int? MillisecondsDelay { get; set; }
public string? WatchDirectory { get; set; }
public override string ToString()
{
string result = JsonSerializer.Serialize(this, BinderAppSettingsSourceGenerationContext.Default.AppSettings);
return result;
}
private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings)
{
if (appSettings?.BuildNumber is null)
{
List<string> paths = [];
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;
paths.Add(physicalFileProvider.Root);
}
throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}");
}
}
private static void Verify(AppSettings _)
{
}
private static Models.AppSettings Get(AppSettings? appSettings,
CamstarOracleConfiguration camstarOracleConfiguration,
CompassConfiguration compassConfiguration,
DriveConfiguration driveConfiguration,
EAFLogConfiguration eafLogConfiguration,
EDADatabaseConfiguration edaDatabaseConfiguration,
InfinityQSConfiguration infinityQSConfiguration,
IsoConfiguration isoConfiguration,
MetrologyConfiguration metrologyConfiguration,
NugetConfiguration nugetConfiguration,
SerialConfiguration serialConfiguration,
StratusConfiguration stratusConfiguration,
TransmissionControlProtocolConfiguration transmissionControlProtocolConfiguration,
WaferCounterConfiguration waferCounterConfiguration)
{
Models.AppSettings result;
if (appSettings is null) throw new NullReferenceException(nameof(appSettings));
if (appSettings.BuildNumber is null) throw new NullReferenceException(nameof(BuildNumber));
if (appSettings.Company is null) throw new NullReferenceException(nameof(Company));
if (appSettings.GitCommitSeven is null) throw new NullReferenceException(nameof(GitCommitSeven));
if (appSettings.Helper is null) throw new NullReferenceException(nameof(Helper));
if (appSettings.MillisecondsDelay is null) throw new NullReferenceException(nameof(MillisecondsDelay));
if (appSettings.WatchDirectory is null) throw new NullReferenceException(nameof(WatchDirectory));
Verify(appSettings);
result = new(camstarOracleConfiguration,
compassConfiguration,
driveConfiguration,
eafLogConfiguration,
edaDatabaseConfiguration,
infinityQSConfiguration,
isoConfiguration,
metrologyConfiguration,
nugetConfiguration,
serialConfiguration,
stratusConfiguration,
transmissionControlProtocolConfiguration,
waferCounterConfiguration,
appSettings.BuildNumber,
appSettings.Company,
appSettings.GitCommitSeven,
appSettings.Helper,
appSettings.MillisecondsDelay.Value,
appSettings.WatchDirectory);
return result;
}
private static Models.AppSettings Get(AppSettings? appSettings)
{
Models.AppSettings? results;
string? json;
if (appSettings is null || appSettings.ConfigurationFileName is null)
throw new NotSupportedException($"{nameof(appSettings.ConfigurationFileName)} must be set!");
string jsonFile = Path.Combine(AppContext.BaseDirectory, appSettings.ConfigurationFileName);
if (File.Exists(jsonFile))
json = File.ReadAllText(jsonFile);
else
{
json = null;
string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
List<string> collection = [applicationData];
if (appSettings?.ConfigurationDirectoryNames is not null)
collection.AddRange(appSettings.ConfigurationDirectoryNames);
if (appSettings?.ConfigurationFileName is not null)
collection.Add(appSettings.ConfigurationFileName);
jsonFile = Path.Combine(collection.ToArray());
}
if (string.IsNullOrEmpty(json) && File.Exists(jsonFile))
json = File.ReadAllText(jsonFile);
results = (string.IsNullOrEmpty(json) ? null : results = JsonSerializer.Deserialize(json, AppSettingsSourceGenerationContext.Default.AppSettings)) ??
throw new NullReferenceException(nameof(Models.AppSettings));
results = Get(appSettings,
results.CamstarOracleConfiguration,
results.CompassConfiguration,
results.DriveConfiguration,
results.EAFLogConfiguration,
results.EDADatabaseConfiguration,
results.InfinityQSConfiguration,
results.IsoConfiguration,
results.MetrologyConfiguration,
results.NugetConfiguration,
results.SerialConfiguration,
results.StratusConfiguration,
results.TransmissionControlProtocolConfiguration,
results.WaferCounterConfiguration);
return results;
}
public static Models.AppSettings Get(IConfigurationRoot configurationRoot)
{
Models.AppSettings result;
#pragma warning disable IL3050, IL2026
AppSettings? appSettings = configurationRoot.Get<AppSettings>();
#pragma warning restore IL3050, IL2026
PreVerify(configurationRoot, appSettings);
result = Get(appSettings);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(AppSettings))]
internal partial class BinderAppSettingsSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -0,0 +1,24 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace File_Watcher.Models;
public record FileWatcherConfiguration(string Company,
string Helper,
int MillisecondsDelay,
string WatchDirectory)
{
public override string ToString()
{
string result = JsonSerializer.Serialize(this, FileWatcherConfigurationSourceGenerationContext.Default.FileWatcherConfiguration);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(FileWatcherConfiguration))]
internal partial class FileWatcherConfigurationSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -14,12 +14,16 @@ public class Program
WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args);
#pragma warning restore IL3050
_ = webApplicationBuilder.Configuration.AddUserSecrets<Program>();
AppSettings appSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration);
if (string.IsNullOrEmpty(appSettings.Company))
AppSettings appSettings = AppSettings.Get(webApplicationBuilder.Configuration);
if (string.IsNullOrEmpty(appSettings.FileWatcherConfiguration.Company))
throw new Exception("Company name must have a value!");
try
{
List<string> collection = [];
List<string> collection =
[
$"BuildNumber:{webApplicationBuilder.Configuration.GetValue<string>("BuildNumber")};",
$"GitCommitSeven:{webApplicationBuilder.Configuration.GetValue<string>("GitCommitSeven")};"
];
_ = webApplicationBuilder.Services.AddHttpClient();
_ = webApplicationBuilder.Services.AddHostedService<Worker>();
_ = webApplicationBuilder.Services.AddSingleton(collection);
@ -38,13 +42,13 @@ public class Program
}
using WebApplication webApplication = webApplicationBuilder.Build();
logger = webApplication.Services.GetRequiredService<ILogger<Program>>();
if (string.IsNullOrEmpty(appSettings.Company))
if (string.IsNullOrEmpty(appSettings.FileWatcherConfiguration.Company))
{
Environment.ExitCode = -1;
_ = webApplication.StopAsync();
}
logger.LogInformation("Starting Web Application");
logger.LogCritical("{Company}", appSettings.Company);
logger.LogCritical("{Company}", appSettings.FileWatcherConfiguration.Company);
await webApplication.RunAsync();
}
catch (Exception ex)

View File

@ -15,7 +15,7 @@ public partial class Worker : BackgroundService
public override Task StopAsync(CancellationToken cancellationToken)
{
if (_AppSettings.Helper == nameof(Helpers.HelperCamstarOracle))
if (_AppSettings.FileWatcherConfiguration.Helper == nameof(Helpers.HelperCamstarOracle))
Helpers.HelperCamstarOracle.Heartbeat(_AppSettings, _HttpClientFactory, _Logger, Infineon.Monitoring.MonA.State.Down, cancellationToken);
return base.StopAsync(cancellationToken);
}
@ -25,7 +25,7 @@ public partial class Worker : BackgroundService
_Logger = logger;
_AppSettings = appSettings;
_HttpClientFactory = httpClientFactory;
logger.LogInformation("{buildNumber}-{gitCommitSeven}", _AppSettings.BuildNumber, _AppSettings.GitCommitSeven);
logger.LogInformation(string.Join(Environment.NewLine, collection));
try
{ logger.LogInformation("<{folder}>", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)); }
catch (Exception) { }
@ -35,18 +35,18 @@ public partial class Worker : BackgroundService
private void BodyInner(CancellationToken cancellationToken)
{
_Logger.LogInformation("A) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt"));
_Logger.LogInformation("A) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.FileWatcherConfiguration.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt"));
if (_First is null || _First.Value)
{
_First = false;
if (_AppSettings.Helper == nameof(Helpers.HelperCamstarOracle))
if (_AppSettings.FileWatcherConfiguration.Helper == nameof(Helpers.HelperCamstarOracle))
Helpers.HelperCamstarOracle.Heartbeat(_AppSettings, _HttpClientFactory, _Logger, Infineon.Monitoring.MonA.State.Up, cancellationToken);
}
if (!Directory.Exists(_AppSettings.WatchDirectory))
_ = Directory.CreateDirectory(_AppSettings.WatchDirectory);
if (!Directory.Exists(_AppSettings.FileWatcherConfiguration.WatchDirectory))
_ = Directory.CreateDirectory(_AppSettings.FileWatcherConfiguration.WatchDirectory);
else
{
_ = _AppSettings.Helper switch
_ = _AppSettings.FileWatcherConfiguration.Helper switch
{
nameof(Helpers.HelperNuget) => Helpers.HelperNuget.Sync(_AppSettings, _Logger),
nameof(Helpers.HelperTCP) => Helpers.HelperTCP.ReadWrite(_AppSettings, _Logger),
@ -64,28 +64,28 @@ public partial class Worker : BackgroundService
_ => throw new NotSupportedException()
};
}
_Logger.LogInformation("B) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt"));
_Logger.LogInformation("B) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.FileWatcherConfiguration.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt"));
}
private async Task Body(CancellationToken cancellationToken)
{
if (!_IsWindowsService)
{
_Logger.LogInformation("Set break point and skip to run {_AppSettings.Helper}!", _AppSettings.Helper);
throw new EvaluateException($"Set break point and skip to run {_AppSettings.Helper}!");
_Logger.LogInformation("Set break point and skip to run {_AppSettings.FileWatcherConfiguration.Helper}!", _AppSettings.FileWatcherConfiguration.Helper);
throw new EvaluateException($"Set break point and skip to run {_AppSettings.FileWatcherConfiguration.Helper}!");
}
if (!_IsWindowsService)
{
for (int i = 0; i < int.MaxValue; i++)
{
BodyInner(cancellationToken);
Thread.Sleep(_AppSettings.MillisecondsDelay);
Thread.Sleep(_AppSettings.FileWatcherConfiguration.MillisecondsDelay);
}
}
while (_IsWindowsService && !cancellationToken.IsCancellationRequested)
{
BodyInner(cancellationToken);
await Task.Delay(_AppSettings.MillisecondsDelay, cancellationToken);
await Task.Delay(_AppSettings.FileWatcherConfiguration.MillisecondsDelay, cancellationToken);
}
}

35
package-lock.json generated
View File

@ -1,35 +0,0 @@
{
"name": "File-Watcher",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"devDependencies": {
"prettier": "3.0.0"
}
},
"node_modules/prettier": {
"version": "3.0.0",
"resolved": "http://localhost:4873/prettier/-/prettier-3.0.0.tgz",
"integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==",
"dev": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
}
},
"dependencies": {
"prettier": {
"version": "3.0.0",
"resolved": "http://localhost:4873/prettier/-/prettier-3.0.0.tgz",
"integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==",
"dev": true
}
}
}

View File

@ -1,10 +0,0 @@
{
"scripts": {
"prettier.check": "prettier . --check",
"prettier.write": "prettier . --write",
"garbage-collect": "git gc"
},
"devDependencies": {
"prettier": "3.0.0"
}
}