-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
135 lines (119 loc) · 4.37 KB
/
Copy pathProgram.cs
File metadata and controls
135 lines (119 loc) · 4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using System.Runtime.InteropServices;
using DotNetEnv;
using FanucFocasConsole.DB;
using FanucFocasConsole.Interop;
using FanucFocasConsole.Services;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Events;
// Load .env (if present) before building the configuration.
Env.Load();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.Console(outputTemplate:
"[{Timestamp:HH:mm:ss} {Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}")
.WriteTo.File("logs/fanuc-test-.log",
rollingInterval: RollingInterval.Day,
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}")
.CreateLogger();
try
{
Log.Information("=== FanucFocasConsole starting ===");
Log.Information("Platform: {Platform}", RuntimeInformation.OSDescription);
var host = Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
config.AddEnvironmentVariables();
})
.UseSerilog()
.ConfigureServices((context, services) =>
{
services.AddSingleton<IFocasNative>(FocasNativeFactory.Create());
var connString = context.Configuration.GetConnectionString("DefaultConnection");
if (string.IsNullOrWhiteSpace(connString))
{
throw new InvalidOperationException(
"ConnectionStrings:DefaultConnection is not set. Cannot start.");
}
services.AddSingleton<FanucRepository>(sp =>
new FanucRepository(connString, sp.GetRequiredService<ILogger<FanucRepository>>()));
services.AddTransient<FanucDataService>();
})
.Build();
// Database is optional. Failure here does not stop FOCAS polling.
var repo = host.Services.GetRequiredService<FanucRepository>();
bool dbAvailable = true;
try
{
await repo.EnsureDatabaseExistsAsync();
await repo.EnsureCreatedAsync();
Log.Information("Database and tables are ready.");
}
catch (Exception ex)
{
dbAvailable = false;
Log.Error(ex, "Failed to initialize the database. Continuing without persistence.");
}
var service = host.Services.GetRequiredService<FanucDataService>();
// Resolve machine IPs: command line > env vars > interactive prompt.
List<string> ips = new();
if (args.Length > 0)
{
ips.AddRange(args);
}
else
{
var ipsEnv = Environment.GetEnvironmentVariable("MACHINE_IPS");
if (!string.IsNullOrWhiteSpace(ipsEnv))
{
ips.AddRange(ipsEnv.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries));
}
else
{
var ipEnv = Environment.GetEnvironmentVariable("MACHINE_IP");
if (!string.IsNullOrWhiteSpace(ipEnv))
ips.Add(ipEnv);
}
}
if (ips.Count == 0)
{
Console.Write("Enter machine IP (or several, comma-separated): ");
var input = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(input))
ips.AddRange(input.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries));
}
if (ips.Count == 0)
{
Log.Error("No machine IP provided. Use command-line args, MACHINE_IPS env var, or interactive input.");
return;
}
ushort port = ushort.TryParse(Environment.GetEnvironmentVariable("MACHINE_PORT"), out var p) ? p : (ushort)8193;
int timeout = int.TryParse(Environment.GetEnvironmentVariable("MACHINE_TIMEOUT"), out var t) ? t : 10;
foreach (var ip in ips)
{
Log.Information("--- Processing machine {Ip} ---", ip);
try
{
await service.RunTestAsync(ip, port, timeout, dbAvailable);
}
catch (Exception ex)
{
Log.Error(ex, "Error while polling machine {Ip}", ip);
}
}
Log.Information("Application finished.");
}
catch (Exception ex)
{
Log.Fatal(ex, "Fatal application error");
}
finally
{
Log.CloseAndFlush();
}