-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
233 lines (198 loc) · 11.4 KB
/
Program.cs
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
using LicenseVerify;
using Microsoft.AspNetCore;
using NuGet.Packaging;
using System.Runtime.InteropServices;
[assembly: AssemblyVersion("2.0.*")]
namespace EasyITCenter {
/// <summary>
/// Server Main Definition Starting Point Of Project
/// </summary>
public class EICServer {
private static SrvConfig _srvConfig = new();
private static readonly SrvRuntime _srvRuntime = new();
internal static readonly string SwaggerDesc = "Full Backend Server DB & API & WebSocket model";
/// <summary>
/// Startup Server Initialization Server Setting Data
/// </summary>
public static readonly SrvConfig SrvConfig = _srvConfig;
/// <summary>
/// Startup Server Initialization Server Runtime Data
/// </summary>
public static readonly SrvRuntime SrvRuntime = _srvRuntime;
/// <summary>
/// Server Startup Process
/// </summary>
/// <param name="args"></param>
public static async Task Main(string[] args) {
SrvRuntime.ServerArgs = args;
await StartServer();
//Restart Server Control
while (SrvRuntime.SrvRestartReq) {
SrvRuntime.SrvRestartReq = false;
await StartServer();
}
}
/// <summary>
/// Server Restart Controller
/// </summary>
public static void RestartServer() {
SrvRuntime.SrvRestartReq = true;
SrvRuntime.ServerCancelToken.Cancel();
}
/// <summary>
/// Server Start Controller
/// </summary>
private static async Task StartServer() {
try {
CheckLicense();
SrvRuntime.ServerCancelToken = new CancellationTokenSource();
FileOperations.LoadOrCreateSettings();
IHostBuilder? hostBuilder = BuildWebHost(SrvRuntime.ServerArgs);
if (CoreOperations.SrvOStype.IsWindows()) {
hostBuilder.UseWindowsService(options => {
options.ServiceName = SrvConfig.ConfigCoreServerRegisteredName;
});
}
//Process Server Configuration
IHost? Ihost = hostBuilder.Build();
//Databse Migration Control
/*
if (SrvConfig.DatabaseMigrationEnabled) {
using (IServiceScope? scope = Ihost.Services.CreateScope()) {
EasyITCenterContext? myDbContext = scope.ServiceProvider.GetRequiredService<EasyITCenterContext>();
await myDbContext.Database.MigrateAsync();
}
}*/
//Load DB Local AutoUpdate Dials Tables to Memory
if (SrvConfig.ServiceUseDbLocalAutoupdatedDials) { ServerStartupDbDataLoading(); }
//Start Server
await Ihost.RunAsync(SrvRuntime.ServerCancelToken.Token);
} catch (Exception Ex) {
CoreOperations.SendEmail(new SendMailRequest() { Content = DataOperations.GetErrMsg(Ex) });
Console.WriteLine("Server Startup Error: " + DataOperations.GetErrMsg(Ex));
Environment.Exit(3);
}
}
/// <summary>
/// Final Preparing Server HostBuilder Definition
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
private static IHostBuilder BuildWebHost(string[] args) {
LoadConfigurationFromFile();LoadConfigurationFromDb();
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
if (SrvConfig.ConfigServerStartupOnHttps || SrvConfig.ConfigServerStartupHTTPAndHTTPS) {
webBuilder.ConfigureKestrel(options => {
options.AddServerHeader = true;
options.ListenAnyIP(SrvConfig.ConfigServerStartupHttpsPort, opt => {
opt.Protocols = HttpProtocols.Http1AndHttp2;
opt.KestrelServerOptions.AllowAlternateSchemes = true;
if (!SrvConfig.ConfigServerGetLetsEncrypt) {
opt.UseHttps(SrvConfig.ConfigCertificatePath.Length > 0
? CoreOperations.GetSelfSignedCertificateFromFile(SrvConfig.ConfigCertificatePath)
: CoreOperations.GetSelfSignedCertificate(SrvConfig.ConfigCertificatePassword),
cfg => {
cfg.SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls | System.Security.Authentication.SslProtocols.Ssl2 | System.Security.Authentication.SslProtocols.Ssl3;
cfg.ClientCertificateMode = ClientCertificateMode.NoCertificate;
cfg.AllowAnyClientCertificate();
});
}
});
});
}
//Lets Encrypt
if (SrvConfig.ConfigServerStartupOnHttps && SrvConfig.ConfigServerGetLetsEncrypt) {
webBuilder.UseKestrel(options => {
IServiceProvider? appServices = options.ApplicationServices;
options.ConfigureHttpsDefaults(h => {
h.SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls | System.Security.Authentication.SslProtocols.Ssl2 | System.Security.Authentication.SslProtocols.Ssl3;
h.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
h.UseLettuceEncrypt(appServices);//.UseServerCertificateSelector;
});
});
}
//udelat seznam naslouchani na urcitych portech portal=1,moduly=2 udelat v tom poradek
//webBuilder.UseUrls(new string[] { "http://*:5000", "https://*:5001" });
if (SrvConfig.ConfigServerStartupHTTPAndHTTPS) {
webBuilder.UseUrls($"https://*:{SrvConfig.ConfigServerStartupHttpsPort}",$"http://*:{SrvConfig.ConfigServerStartupHttpPort}");
} else {
webBuilder.UseUrls(SrvConfig.ConfigServerStartupOnHttps ? $"https://*:{SrvConfig.ConfigServerStartupHttpsPort}" : $"http://*:{SrvConfig.ConfigServerStartupHttpPort}");
}
//webBuilder.UseModularStartup<AppHost>();
webBuilder.UseStartup<Startup>();
webBuilder.UseWebRoot(SrvRuntime.WebRoot_path);
webBuilder.UseContentRoot(Directory.GetCurrentDirectory());
webBuilder.UseStaticWebAssets();
});
}
/// <summary>
/// Server Startup DB Data loading for minimize DB Connect TO Frequency Dials Without
/// Changes With Full Auto Filling Non Exist Records
/// Example: LanguageList
/// </summary>
private static void ServerStartupDbDataLoading() { DbOperations.LoadOrRefreshStaticDbDials(); }
/// <summary>
/// Checking Valid License on StartUp
/// </summary>
private static void CheckLicense() {
bool licenseStatus = LicenseControlller.VerifyLicense(out LicenseData licenseModel, true);
if (string.IsNullOrEmpty(licenseModel.Status)) { Console.WriteLine("Missing License file in \"Data\" folder"); }
Console.WriteLine("License Info: " + JsonSerializer.Serialize(licenseModel));
if (!licenseStatus) { Console.WriteLine("Server will be in 30 second ShutDown"); Thread.Sleep(30 * 1000);
Environment.Exit(5);
}
}
/// <summary>
/// Server Core: Load Configuration From Config File In Startup Folder/Data/config.json
/// For Linux is Loaded from server FOLder/Data/config.json
/// For Windows sysDrive://ProgramData/EasyITCenter/config.json
/// its Alone Different Setting FOR More Platforms
/// </summary>
private static void LoadConfigurationFromFile() {
try {
//Load From Config File
string json = CoreOperations.SrvOStype.IsWindows()
? File.ReadAllText(Path.Combine(SrvRuntime.Setting_folder, SrvRuntime.ConfigFile), FileOperations.FileDetectEncoding(Path.Combine(SrvRuntime.Setting_folder, SrvRuntime.ConfigFile)))
: File.ReadAllText(Path.Combine(SrvRuntime.Startup_path, "Data", SrvRuntime.ConfigFile), FileOperations.FileDetectEncoding(Path.Combine(SrvRuntime.Startup_path, "Data", SrvRuntime.ConfigFile)))
;
Dictionary<string, object> exportServerSettingList = new Dictionary<string, object>();
exportServerSettingList.AddRange(JsonSerializer.Deserialize<Dictionary<string, object>>(json).ToList());
exportServerSettingList.ToList().ForEach(configItem => {
foreach (PropertyInfo property in _srvConfig.GetType().GetProperties()) {
if (configItem.Key == property.Name) {
try { property.SetValue(_srvConfig, Convert.ChangeType(configItem.Value.ToString(), property.GetValue(SrvConfig).GetType())); } catch { }
}
}
});
} catch (Exception ex) {
CoreOperations.SendEmail(new SendMailRequest() { Content = DataOperations.GetErrMsg(ex) }, true);
Console.WriteLine("LoadConfigurationFromFile Error: " + DataOperations.GetErrMsg(ex));
Environment.Exit(10);
}
}
/// <summary>
/// Server Core: Load Configuration From Database First Must be From File With DB
/// Connection, Others File Settings than DB connection is Optional
/// </summary>
private static void LoadConfigurationFromDb() {
try {
//Load Configuration From Database
List<ServerSettingList> ConfigData = new EasyITCenterContext().ServerSettingLists.ToList();
foreach (PropertyInfo property in _srvConfig.GetType().GetProperties()) {
if (ConfigData.FirstOrDefault(a => a.Key == property.Name) != null) {
property.SetValue(_srvConfig, Convert.ChangeType(ConfigData.First(a => a.Key == property.Name).Value, property.PropertyType), null);
}
}
} catch (Exception ex) {
CoreOperations.SendEmail(new SendMailRequest() { Content = DataOperations.GetErrMsg(ex) });
Console.WriteLine("LoadConfigurationFromDb Error: " + Environment.NewLine
+ "Config File from Folder: "
+ (CoreOperations.SrvOStype.IsWindows() ? Path.Combine(SrvRuntime.Setting_folder, SrvRuntime.ConfigFile) : Path.Combine(SrvRuntime.Startup_path, "Data", SrvRuntime.ConfigFile))
+ "With ConnectionString: " + SrvConfig.DatabaseConnectionString + Environment.NewLine
+ "Has Error: " + DataOperations.GetErrMsg(ex));
Environment.Exit(20);
}
}
}
}