/
Program.cs
161 lines (135 loc) · 6.14 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
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System.IO;
namespace icm
{
public class Program
{
public static Task Main(string[] args)
{
ICM.pingServersResult pingsResults;
ICMConfiguration conf = LoadConfiguration(args);
while (true)
{
var now = DateTime.Now.ToLocalTime();
pingsResults = ICM.pingServers(conf.servers);
if (pingsResults.AtLeastOneServerReachable)
{
OutputOkPingsResults(pingsResults, now, conf);
}
else
{
var disconnectionDuration = LoopWhileNoConnection(now, conf);
OutputReconnection(now, disconnectionDuration, conf);
}
LetWaitFewSeconds(conf);
}
static void OutputOkPingsResults(ICM.pingServersResult pingsResults, DateTime now, ICMConfiguration conf)
{
var pingRoundtripsTimeOutput = "";
foreach (var serverResult in pingsResults.pingServersResults)
{
pingRoundtripsTimeOutput += serverResult.RoundtripTime == 0 ? "---" : serverResult.RoundtripTime.ToString().PadLeft(3, ' ');
pingRoundtripsTimeOutput += "|";
}
var outputString = $"{now}|OK |{pingRoundtripsTimeOutput}";
Console.WriteLine(outputString);
if (conf.loginfile) outputInFile(outputString);
}
static void ConsoleBackToBeginningOfTheLine()
{
try
{
Console.CursorLeft = 0;
Console.CursorTop -= 1;
}
catch (System.Exception)
{
// debugging console raise error with cursorleft
}
}
static void outputInFile(string outputString)
{
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
var fileName = System.IO.Path.GetDirectoryName(path)
+ "\\icm."
+ DateTime.Now.Year.ToString()
+ DateTime.Now.Month.ToString().PadLeft(2, '0')
+ DateTime.Now.Day.ToString().PadLeft(2, '0')
+ ".csv";
try
{
File.AppendAllText(fileName, outputString + Environment.NewLine);
}
catch (Exception Ex)
{
Console.WriteLine(Ex.ToString());
}
}
static void OutputNoConnection(DateTime nowDisconnected, TimeSpan durationDisconnection, ICMConfiguration conf)
{
var outputString = $"{nowDisconnected}|KO |pings are failing, disconnected since: {durationDisconnection.ToHumanReadableString()}";
Console.WriteLine(outputString);
ConsoleBackToBeginningOfTheLine();
if (conf.loginfiledisconnected) outputInFile(outputString);
}
static void LetWaitFewSeconds(ICMConfiguration conf)
{
System.Threading.Thread.Sleep(conf.frequency);
}
static ICMConfiguration LoadConfiguration(string[] args)
{
// default configuration
ICMConfiguration conf = new ICMConfiguration { };
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, configuration) =>
{
configuration.Sources.Clear();
IHostEnvironment env = hostingContext.HostingEnvironment;
configuration
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true);
IConfigurationRoot configurationRoot = configuration.Build();
ICMConfiguration options = new();
configurationRoot.GetSection("ping").Bind(options);
conf = options;
})
.Build();
return conf;
}
static TimeSpan LoopWhileNoConnection(DateTime disconnectionStartTime, ICMConfiguration conf)
{
var disconnected = true;
TimeSpan durationDisconnection = TimeSpan.Zero;
while (disconnected)
{
var nowDisconnected = DateTime.Now.ToLocalTime();
durationDisconnection = nowDisconnected - disconnectionStartTime;
var pingsResults = ICM.pingServers(conf.servers);
disconnected = !pingsResults.AtLeastOneServerReachable;
OutputNoConnection(nowDisconnected, durationDisconnection, conf);
LetWaitFewSeconds(conf);
}
return durationDisconnection;
}
static void OutputReconnection(DateTime now, TimeSpan disconnectionDuration, ICMConfiguration conf)
{
ClearCurrentConsoleLine();
var outputString = $"{now}|RECONNECTED|{disconnectionDuration.Seconds.ToString().PadLeft(3, ' ')}|Disconnected during : {disconnectionDuration.ToHumanReadableString()}";
Console.WriteLine(outputString);
if (conf.loginfile) outputInFile(outputString);
}
static void ClearCurrentConsoleLine()
{
int currentLineCursor = Console.CursorTop;
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(new string(' ', Console.WindowWidth));
Console.SetCursorPosition(0, currentLineCursor);
}
}
}
}