)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Skip Navigation Links

Public general use code classes and xml files that we've compiled and used over the years:

Heartbeat information support class for the Optical Fiber Network business model

    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: }