1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Reflection;
5: using System.Text.Json;
6: using System.Text.RegularExpressions;
7: using System.Threading.Tasks;
8: using System.Web.UI.WebControls;
9:
10: namespace Ia.Ngn.Cl.Model.Business
11: {
12: ////////////////////////////////////////////////////////////////////////////
13:
14: /// <summary publish="true">
15: /// Heartbeat information support class for the Optical Fiber Network business model
16: /// </summary>
17: ///
18: /// <remarks>
19: /// Copyright © 2006-2022 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
20: ///
21: /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
22: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
23: ///
24: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
25: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
26: ///
27: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
28: ///
29: /// Copyright notice: This notice may not be removed or altered from any source distribution.
30: /// </remarks>
31: public class Heartbeat
32: {
33: private static Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary = new Dictionary<string, DateTime>();
34:
35: private static readonly object objectLock = new object();
36:
37: ////////////////////////////////////////////////////////////////////////////
38:
39: /// <summary>
40: ///
41: /// </summary>
42: public static Dictionary<string, DateTime> AssemblyNameToCreatedDateTimeDictionary
43: {
44: get { return assemblyNameToCreatedDateTimeDictionary; }
45:
46: set { assemblyNameToCreatedDateTimeDictionary = value; }
47: }
48:
49: ////////////////////////////////////////////////////////////////////////////
50:
51: /// <summary>
52: ///
53: /// </summary>
54: public Heartbeat() { }
55:
56: ////////////////////////////////////////////////////////////////////////////
57:
58: /// <summary>
59: ///
60: /// </summary>
61: public static void Create(Ia.Ngn.Cl.Model.Business.Msmq.Application application)
62: {
63: if (!string.IsNullOrEmpty(application.Assembly))
64: {
65: assemblyNameToCreatedDateTimeDictionary[application.Assembly] = DateTime.UtcNow.AddHours(3);
66: }
67: else
68: {
69: }
70: }
71:
72: ////////////////////////////////////////////////////////////////////////////
73:
74: /// <summary>
75: ///
76: /// </summary>
77: public static List<string> MissingAssemblyNameList(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary)
78: {
79: bool assemblyWasSeen;
80:
81: var list = new List<string>();
82:
83: var assemblyNameList = (from h in assemblyNameToCreatedDateTimeDictionary
84: select h.Key).ToList();
85:
86: var text = string.Empty;
87: string applicationName, assemblyName;
88:
89: foreach (KeyValuePair<string, string> keyValuePair in Ia.Ngn.Cl.Model.Business.Default.ApplicationAssemblyNameToApplicationName)
90: {
91: assemblyName = keyValuePair.Key;
92: applicationName = keyValuePair.Value;
93:
94: applicationName = applicationName.Replace("Optical Fiber Network's Operations Support System ", "");
95:
96: if (assemblyName == "ia.ngn.netm.ca" || assemblyName == "ia.ngn.citrixguistarter.ca")
97: {
98: // skip
99: //text += applicationName + " (" + assembly + @") Active?: [<span style=""color:Orange"">Unknown</span>]<br/>";
100: }
101: else if (assemblyName == "ia.mdaa.ca")
102: {
103: // skip
104: }
105: else
106: {
107: assemblyWasSeen = assemblyNameList.Contains(assemblyName);
108:
109: if (!assemblyWasSeen) list.Add(assemblyName);
110: }
111: }
112:
113: return list;
114: }
115:
116: ////////////////////////////////////////////////////////////////////////////
117:
118: /// <summary>
119: ///
120: /// </summary>
121: public static List<string> WithinLastNMinuteAssemblyNameList(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary, int withinLastNMinute)
122: {
123: bool assemblyIsActive;
124:
125: var list = new List<string>();
126:
127: var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
128:
129: var assemblyNameWithinLastNMinuteList = (from h in assemblyNameToCreatedDateTimeDictionary
130: where h.Value >= dateTime
131: select h.Key).ToList();
132:
133: var text = string.Empty;
134: string applicationName, assemblyName;
135:
136: foreach (KeyValuePair<string, string> keyValuePair in Ia.Ngn.Cl.Model.Business.Default.ApplicationAssemblyNameToApplicationName)
137: {
138: assemblyName = keyValuePair.Key;
139: applicationName = keyValuePair.Value;
140:
141: applicationName = applicationName.Replace("Optical Fiber Network's Operations Support System ", "");
142:
143: if (assemblyName == "ia.ngn.netm.ca" || assemblyName == "ia.ngn.citrixguistarter.ca")
144: {
145: //text += applicationName + " (" + assemblyName + ") Active?: Unknown\r\n\r\n";
146: }
147: else
148: {
149: assemblyIsActive = assemblyNameWithinLastNMinuteList.Contains(assemblyName);
150:
151: if (assemblyIsActive) list.Add(assemblyName);
152: }
153: }
154:
155: return list;
156: }
157:
158: ////////////////////////////////////////////////////////////////////////////
159:
160: /// <summary>
161: ///
162: /// </summary>
163: public static string WithinLastNMinuteTextTable(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary, int withinLastNMinute)
164: {
165: // see below
166:
167: bool assemblyIsActive;
168:
169: var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
170:
171: var assemblyNameWithinLastNMinuteList = (from h in assemblyNameToCreatedDateTimeDictionary
172: where h.Value >= dateTime
173: select h.Key).ToList();
174:
175: var text = string.Empty;
176: string applicationName, assembly;
177:
178: foreach (KeyValuePair<string, string> keyValuePair in Ia.Ngn.Cl.Model.Business.Default.ApplicationAssemblyNameToApplicationName)
179: {
180: assembly = keyValuePair.Key;
181: applicationName = keyValuePair.Value;
182:
183: applicationName = applicationName.Replace("Optical Fiber Network's Operations Support System ", "");
184:
185: if (assembly == "ia.ngn.netm.ca" || assembly == "ia.ngn.citrixguistarter.ca")
186: {
187: text += applicationName + " (" + assembly + ") Active?: Unknown\r\n\r\n";
188: }
189: else
190: {
191: assemblyIsActive = assemblyNameWithinLastNMinuteList.Contains(assembly);
192:
193: text += applicationName + " (" + assembly + ") Active?: " + Ia.Cl.Model.Default.YesNoText(assemblyIsActive) + "\r\n\r\n";
194: }
195: }
196:
197: return text.Trim();
198: }
199:
200: ////////////////////////////////////////////////////////////////////////////
201:
202: /// <summary>
203: ///
204: /// </summary>
205: public static string WithinLastNMinuteHtmlTable(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary, int withinLastNMinute)
206: {
207: // see above
208:
209: bool assemblyIsActive;
210:
211: var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
212:
213: var assemblyNameWithinLastNMinuteList = (from h in assemblyNameToCreatedDateTimeDictionary
214: where h.Value >= dateTime
215: select h.Key).ToList();
216:
217: var text = string.Empty;
218: string applicationName, assembly;
219:
220: foreach (KeyValuePair<string, string> keyValuePair in Ia.Ngn.Cl.Model.Business.Default.ApplicationAssemblyNameToApplicationName)
221: {
222: assembly = keyValuePair.Key;
223: applicationName = keyValuePair.Value;
224:
225: applicationName = applicationName.Replace("Optical Fiber Network's Operations Support System ", "");
226:
227: if (assembly == "ia.ngn.netm.ca" || assembly == "ia.ngn.citrixguistarter.ca")
228: {
229: text += applicationName + " (" + assembly + @") Active?: [<span style=""color:Orange"">Unknown</span>]<br/>";
230: }
231: else
232: {
233: assemblyIsActive = assemblyNameWithinLastNMinuteList.Contains(assembly);
234:
235: text += applicationName + " (" + assembly + ") Active?: [" + Ia.Cl.Model.Default.YesNo(assemblyIsActive) + "]<br/>";
236: }
237: }
238:
239: return text.Trim();
240: }
241:
242: ////////////////////////////////////////////////////////////////////////////
243:
244: /// <summary>
245: ///
246: /// </summary>
247: public static string MissingOrInactiveWithinLastNMinuteApplicationNameListText(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary, int withinLastNMinute)
248: {
249: // see above
250:
251: var missingAssemblyNameList = MissingAssemblyNameList(assemblyNameToCreatedDateTimeDictionary);
252:
253: var heartbeatsWithinLastNMinuteAssemblyNameList = WithinLastNMinuteAssemblyNameList(assemblyNameToCreatedDateTimeDictionary, withinLastNMinute);
254:
255: bool missingOrInactiveAssemblyName;
256:
257: var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
258:
259: var assemblyNameNotWithinLastNMinuteList = (from h in assemblyNameToCreatedDateTimeDictionary
260: where h.Value < dateTime
261: select h.Key).ToList();
262:
263: var missingOrInactiveAssemblyNameList = missingAssemblyNameList.Union(assemblyNameNotWithinLastNMinuteList).ToList();
264:
265: var text = string.Empty;
266: string applicationName, assembly;
267:
268: foreach (KeyValuePair<string, string> keyValuePair in Ia.Ngn.Cl.Model.Business.Default.ApplicationAssemblyNameToApplicationName)
269: {
270: assembly = keyValuePair.Key;
271: applicationName = keyValuePair.Value;
272:
273: applicationName = applicationName.Replace("Optical Fiber Network's Operations Support System ", "");
274:
275: if (assembly == "ia.ngn.netm.ca" || assembly == "ia.ngn.citrixguistarter.ca")
276: {
277: // skip
278: //text += applicationName + " (" + assembly + @") Active?: [<span style=""color:Orange"">Unknown</span>]<br/>";
279: }
280: else if (assembly == "ia.mdaa.ca")
281: {
282: // skip
283: }
284: else
285: {
286: missingOrInactiveAssemblyName = missingOrInactiveAssemblyNameList.Contains(assembly);
287:
288: if (missingOrInactiveAssemblyName)
289: {
290: text += applicationName + " (" + assembly + ") ";// Active?: [" + Ia.Cl.Model.Default.YesNo(assemblyIsActive) + "]<br/>";
291: }
292: }
293: }
294:
295: return text.Trim();
296: }
297:
298: ////////////////////////////////////////////////////////////////////////////
299:
300: /// <summary>
301: ///
302: /// </summary>
303: public static bool AxeAndEwsdAreActive(Dictionary<string, DateTime> assemblyNameToCreatedDateTimeDictionary, int withinLastNMinute)
304: {
305: bool areActive;
306:
307: var axe = "ia.ngn.axe.ca";
308: var ewsd = "ia.ngn.netmanager.ca";
309:
310: var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
311:
312: var list0 = (from h in assemblyNameToCreatedDateTimeDictionary
313: where h.Value >= dateTime
314: select h.Key).ToList();
315:
316: areActive = list0.Contains(axe) && list0.Contains(ewsd);
317:
318: return areActive;
319: }
320:
321: ////////////////////////////////////////////////////////////////////////////
322: ////////////////////////////////////////////////////////////////////////////
323:
324:
325:
326:
327: ////////////////////////////////////////////////////////////////////////////
328: ////////////////////////////////////////////////////////////////////////////
329:
330: /// <summary>
331: ///
332: /// </summary>
333: public static async Task<List<Ia.Cl.Model.Heartbeat>> HearbeatsAsync()
334: {
335: var heartbeats = await Ia.Cl.Model.Http.GetAsync<List<Ia.Cl.Model.Heartbeat>>("https://api.ia.com.kw", "api/heartbeats");
336:
337: return heartbeats;
338: }
339:
340: ////////////////////////////////////////////////////////////////////////////
341:
342: /// <summary>
343: ///
344: /// </summary>
345: public static async Task<string> HearbeatsWithinLastNMinutesTextAsync(int withinLastNMinute)
346: {
347: // see below
348:
349: bool assemblyIsActive;
350:
351: var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
352:
353: var heartbeats = await Ia.Ngn.Cl.Model.Business.Heartbeat.HearbeatsAsync();
354:
355: var list = (from h in heartbeats where h.Created > dateTime select h.Name).Distinct().ToList();
356:
357: var text = string.Empty;
358: string applicationName, assembly;
359:
360: foreach (KeyValuePair<string, string> keyValuePair in Ia.Ngn.Cl.Model.Business.Default.ApplicationAssemblyNameToApplicationName)
361: {
362: assembly = keyValuePair.Key;
363: applicationName = keyValuePair.Value;
364:
365: applicationName = applicationName.Replace("Optical Fiber Network's Operations Support System ", "");
366:
367: if (assembly == "ia.ngn.netm.ca" || assembly == "ia.ngn.citrixguistarter.ca")
368: {
369: text += applicationName + " (" + assembly + ") Active?: Unknown\r\n\r\n";
370: }
371: else
372: {
373: assemblyIsActive = list.Contains(assembly);
374:
375: text += applicationName + " (" + assembly + ") Active?: " + Ia.Cl.Model.Default.YesNoText(assemblyIsActive) + "\r\n\r\n";
376: }
377: }
378:
379: return text.Trim();
380: }
381:
382: ////////////////////////////////////////////////////////////////////////////
383:
384: /// <summary>
385: ///
386: /// </summary>
387: public static async Task<string> HearbeatsWithinLastNMinuteHtmlAsync(int withinLastNMinute)
388: {
389: // see above
390:
391: bool assemblyIsActive;
392:
393: var heartbeats = await Ia.Ngn.Cl.Model.Business.Heartbeat.HearbeatsAsync();
394:
395: var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinute);
396:
397: var list = (from h in heartbeats where h.Created > dateTime select h.Name).Distinct().ToList();
398:
399: var text = string.Empty;
400: string applicationName, assembly;
401:
402: foreach (KeyValuePair<string, string> keyValuePair in Ia.Ngn.Cl.Model.Business.Default.ApplicationAssemblyNameToApplicationName)
403: {
404: assembly = keyValuePair.Key;
405: applicationName = keyValuePair.Value;
406:
407: applicationName = applicationName.Replace("Optical Fiber Network's Operations Support System ", "");
408:
409: if (assembly == "ia.ngn.netm.ca" || assembly == "ia.ngn.citrixguistarter.ca")
410: {
411: text += applicationName + " (" + assembly + @") Active?: [<span style=""color:Orange"">Unknown</span>]<br/>";
412: }
413: else
414: {
415: assemblyIsActive = list.Contains(assembly);
416:
417: text += applicationName + " (" + assembly + ") Active?: [" + Ia.Cl.Model.Default.YesNo(assemblyIsActive) + "]<br/>";
418: }
419: }
420:
421: return text.Trim();
422: }
423:
424: ////////////////////////////////////////////////////////////////////////////
425: ////////////////////////////////////////////////////////////////////////////
426: }
427:
428: ////////////////////////////////////////////////////////////////////////////
429: ////////////////////////////////////////////////////////////////////////////
430: }