private static void Initialize() { #region EventCategories var eventDescriptionsFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EventDescriptions.xml"); if (File.Exists(eventDescriptionsFilePath)) { var eventDescriptions = new List <EventDescription>(); using (var fileStream = new FileStream(eventDescriptionsFilePath, FileMode.Open, FileAccess.Read)) { var xmlSerializer = new XmlSerializer(typeof(List <EventDescription>)); eventDescriptions = xmlSerializer.Deserialize(fileStream) as List <EventDescription>; } foreach (var eventDescription in eventDescriptions) { if (!eventDescription.IsValid()) { throw new ApplicationException($"EventDescription is not valid: {eventDescription}"); } var key = $"{eventDescription.EventLog.Trim()}-Id-{eventDescription.EventId}"; if (!EventDescriptions.ContainsKey(key)) { EventDescriptions.Add(key, eventDescription); } else { throw new ApplicationException($"EventDescriptions already contains entry for: {eventDescription}"); } } Console.WriteLine("EventDescriptions:"); foreach (var eventDescription in EventDescriptions.Values) { Console.WriteLine($" - {eventDescription}"); } } #endregion #region EventLogQueryReverseDirection if (ConfigurationManager.AppSettings["EventLogQueryReverseDirection"] != null) { EventLogQueryReverseDirection = Convert.ToBoolean(ConfigurationManager.AppSettings["EventLogQueryReverseDirection"]); } else { EventLogQueryReverseDirection = true; } Console.WriteLine($"EventLogQueryReverseDirection: {EventLogQueryReverseDirection}"); #endregion }
/// <summary> /// Gets a list of invalid exception items. /// </summary> /// <param name="meterTables">The table structure for the meter.</param> /// <param name="programTables">The table structure for the program.</param> /// <returns>The list of invalid items.</returns> // Revision History // MM/DD/YY Who Version Issue# Description // -------- --- ------- ------ ------------------------------------------- // 07/08/10 AF 2.42.03 Created // 03/06/12 AF 2.53.48 193820 We can no longer assume that the meter and program items will // be in the same order. We have to search both lists for mismatches // protected virtual List <ProgramValidationItem> GetInvalidExceptionItems(GatewayTables meterTables, GatewayTables programTables) { List <ProgramValidationItem> InvalidItems = new List <ProgramValidationItem>(); ProgramValidationItem ValidationItem = null; object objMeterValue; object objProgramValue; ushort usMeterHosts; ushort usProgramHosts; ushort usMeterEvents; ushort usProgramEvents; ushort usMaxHosts; ushort usMaxEvents; // We shouldn't validate this if Table 123 is not cached in the program. if (programTables.IsAllCached(123)) { // Get the number of exception hosts meterTables.GetValue(StdTableEnum.STDTBL121_NBR_EXCEPTION_HOSTS, null, out objMeterValue); programTables.GetValue(StdTableEnum.STDTBL121_NBR_EXCEPTION_HOSTS, null, out objProgramValue); usMeterHosts = (ushort)objMeterValue; usProgramHosts = (ushort)objProgramValue; // Get the number of exception events meterTables.GetValue(StdTableEnum.STDTBL121_NBR_EXCEPTION_EVENTS, null, out objMeterValue); programTables.GetValue(StdTableEnum.STDTBL121_NBR_EXCEPTION_EVENTS, null, out objProgramValue); usMeterEvents = (ushort)objMeterValue; usProgramEvents = (ushort)objProgramValue; // Determine the maximum values. if (usMeterHosts >= usProgramHosts) { usMaxHosts = usMeterHosts; } else { usMaxHosts = usProgramHosts; } if (usMeterEvents >= usProgramEvents) { usMaxEvents = usMeterEvents; } else { usMaxEvents = usProgramEvents; } // Verify each of the hosts for (int iHost = 0; iHost < usMaxHosts; iHost++) { bool meterValidHost = iHost < usMeterHosts; bool programValidHost = iHost < usProgramHosts; List <ushort> meterEventsList = new List <ushort>(); List <ushort> programEventsList = new List <ushort>(); List <ushort> invalidMeterItemsList = new List <ushort>(); List <ushort> invalidProgramItemsList = new List <ushort>(); // the event number is just an index used for labeling the invalid item int iEventNumber = 1; int[] iIndexer = { iHost }; string strCategory = "Exception Host " + (iHost + 1).ToString(CultureInfo.CurrentCulture); ValidationItem = ValidateItem(new EDLValidationItem((long)StdTableEnum.STDTBL123_APTITLE_NOTIFY, iIndexer, "Exception Host Aptitle", strCategory), meterTables, programTables); if (ValidationItem != null) { InvalidItems.Add(ValidationItem); } ValidationItem = ValidateItem(new EDLValidationItem((long)StdTableEnum.STDTBL123_MAX_NUMBER_OF_RETRIES, iIndexer, "Max Number of Retries", strCategory), meterTables, programTables); if (ValidationItem != null) { InvalidItems.Add(ValidationItem); } ValidationItem = ValidateItem(new EDLValidationItem((long)StdTableEnum.STDTBL123_RETRY_DELAY, iIndexer, "Retry Delay", strCategory), meterTables, programTables); if (ValidationItem != null) { InvalidItems.Add(ValidationItem); } ValidationItem = ValidateItem(new EDLValidationItem((long)StdTableEnum.STDTBL123_EXCLUSION_PERIOD, iIndexer, "Exclusion Period", strCategory), meterTables, programTables); if (ValidationItem != null) { InvalidItems.Add(ValidationItem); } if (meterValidHost == true) { for (int iEvent = 0; iEvent < usMeterEvents; iEvent++) { meterTables.GetValue(StdTableEnum.STDTBL123_EVENT_REPORTED, new int[] { iHost, iEvent }, out objMeterValue); meterEventsList.Add((ushort)objMeterValue); } } if (programValidHost == true) { for (int iEvent = 0; iEvent < usProgramEvents; iEvent++) { programTables.GetValue(StdTableEnum.STDTBL123_EVENT_REPORTED, new int[] { iHost, iEvent }, out objProgramValue); programEventsList.Add((ushort)objProgramValue); } } foreach (ushort item in meterEventsList) { if (!programEventsList.Contains(item)) { invalidMeterItemsList.Add(item); } } foreach (ushort item in invalidMeterItemsList) { string strMeterException = ""; if (EventDescriptions.TryGetValue((int)item, out strMeterException) == false) { // The TryGetValue failed so say it is an unknown event. strMeterException = "Unknown Event " + item.ToString(CultureInfo.InvariantCulture); } // We don't know which program item this belongs with so just make the program item blank InvalidItems.Add(new ProgramValidationItem(strCategory, "Event " + iEventNumber.ToString(CultureInfo.CurrentCulture), "", strMeterException)); iEventNumber++; } foreach (ushort item in programEventsList) { if (!meterEventsList.Contains(item)) { invalidProgramItemsList.Add(item); } } foreach (ushort item in invalidProgramItemsList) { string strProgramException = ""; if (EventDescriptions.TryGetValue((int)item, out strProgramException) == false) { // The TryGetValue failed so say it is an unknown event. strProgramException = "Unknown Event " + item.ToString(CultureInfo.InvariantCulture); } // We don't know which meter item this belongs with so just make the meter item blank InvalidItems.Add(new ProgramValidationItem(strCategory, "Event " + iEventNumber.ToString(CultureInfo.CurrentCulture), strProgramException, "")); iEventNumber++; } } } return(InvalidItems); }
private static void CreateCSVReport(string reportFileBasePath) { Console.WriteLine($"{DateTime.Now.YMDHMSFriendly()} - {ObjectExtensions.CurrentMethodName()}"); #region Validation if (string.IsNullOrWhiteSpace(reportFileBasePath)) { throw new ArgumentNullException("reportFileBasePath"); } #endregion foreach (var kvpEventData in EventData) { Console.WriteLine($" - EventId: {kvpEventData.Key} Events: {kvpEventData.Value.Count}"); var lines = new List <string>(); var headerLine = new StringBuilder(); #region Column headers for all events headerLine.Append("EventId,"); headerLine.Append("EventRecordId,"); headerLine.Append("EventSourceMachine,"); headerLine.Append("DateTimeUTC,"); headerLine.Append("Channel,"); headerLine.Append("Level,"); #endregion foreach (var kvpColumnName in EventColumns[kvpEventData.Key]) { headerLine.Append($"{kvpColumnName.Key},"); } lines.Add(headerLine.ToString()); var firstEvent = DateTime.MaxValue; var lastEvent = DateTime.MinValue; foreach (var eventBase in kvpEventData.Value) { if (eventBase.DateTimeUTC < firstEvent) { firstEvent = eventBase.DateTimeUTC; } if (eventBase.DateTimeUTC > lastEvent) { lastEvent = eventBase.DateTimeUTC; } var line = new StringBuilder(); #region Column values for all events/lines line.Append($"{eventBase.EventId},"); line.Append($"{eventBase.EventRecordId},"); line.Append($"{eventBase.EventSourceMachine ?? string.Empty},"); line.Append($"{eventBase.DateTimeUTC.YMDHMSFFFFFFFFriendly()},"); line.Append($"{eventBase.Channel},"); line.Append($"{eventBase.Level},"); #endregion #region Get column values for the line foreach (var columnName in EventColumns[eventBase.EventKey].Keys) { var columnValue = "N/A,"; if ((eventBase.EventDataNameElements != null) && (eventBase.EventDataNameElements.Count > 0)) { var columnElement = eventBase.EventDataNameElements .Where(x => x.Attributes() .Any(y => (y != null) && (y.Name != null) && !string.IsNullOrWhiteSpace(y.Name.LocalName) && string.Equals(y.Name.LocalName, "Name", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(y.Value) && string.Equals(y.Value, columnName, StringComparison.OrdinalIgnoreCase))) .FirstOrDefault(); if ((columnElement != null) && (columnElement.Value != null)) { columnValue = columnElement.Value.Trim(); } } line.Append($"\"{columnValue}\","); } #endregion lines.Add(line.ToString()); } // foreach (var eventBase in kvpEventData.Value) { #region Create report for the specific event id var eventDescription = string.Empty; if (EventDescriptions.ContainsKey(kvpEventData.Key)) { eventDescription = $"-{EventDescriptions[kvpEventData.Key].Description}"; } var reportFileName = $"EventId-{kvpEventData.Key.Replace("/","-")}{eventDescription}-{firstEvent.YMDHMFriendly().Replace(":", "-").Replace(" ", "-")}-{lastEvent.YMDHMFriendly().Replace(":", "-").Replace(" ", "-")}.csv"; var reportFilePath = Path.Combine(reportFileBasePath, reportFileName); try { Console.WriteLine($"{DateTime.Now.YMDHMSFriendly()} - {ObjectExtensions.CurrentMethodName()} Writing: {lines.Count} lines to file: {reportFilePath}"); File.WriteAllLines(reportFilePath, lines, Encoding.UTF8); } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error parsing events"); Console.WriteLine(e.VerboseExceptionString()); Console.ResetColor(); } #endregion } // foreach (var kvpEventData in EventData) { }
private static void CreateXMLReport(string reportFileBasePath) { Console.WriteLine($"{DateTime.Now.YMDHMSFriendly()} - {ObjectExtensions.CurrentMethodName()}"); #region Validation if (string.IsNullOrWhiteSpace(reportFileBasePath)) { throw new ArgumentNullException("reportFileBasePath"); } #endregion foreach (var kvpEventData in EventData) { Console.WriteLine($" - EventId: {kvpEventData.Key} Events: {kvpEventData.Value.Count}"); var rootElement = new XElement($"ArrayOfEventId{kvpEventData.Key.Replace("/", "-").Replace("+", "-")}"); var firstEvent = DateTime.MaxValue; var lastEvent = DateTime.MinValue; foreach (var eventBase in kvpEventData.Value) { if (eventBase.DateTimeUTC < firstEvent) { firstEvent = eventBase.DateTimeUTC; } if (eventBase.DateTimeUTC > lastEvent) { lastEvent = eventBase.DateTimeUTC; } #region Element values for all events/lines var eventChildElement = new XElement("Event"); eventChildElement.Add(new XElement("EventId", eventBase.EventId)); eventChildElement.Add(new XElement("EventRecordId", eventBase.EventRecordId)); eventChildElement.Add(new XElement("EventSourceMachine", eventBase.EventSourceMachine ?? "NULL")); eventChildElement.Add(new XElement("DateTimeUTC", eventBase.DateTimeUTC.YMDHMSFriendly())); eventChildElement.Add(new XElement("Channel", eventBase.Channel)); eventChildElement.Add(new XElement("Level", eventBase.Level)); #endregion #region Get element values unique for the event foreach (var elementName in EventColumns[eventBase.EventKey].Keys) { var elementValue = "N/A"; if ((eventBase.EventDataNameElements != null) && (eventBase.EventDataNameElements.Count > 0)) { var columnElement = eventBase.EventDataNameElements .Where(x => x.Attributes() .Any(y => (y != null) && (y.Name != null) && !string.IsNullOrWhiteSpace(y.Name.LocalName) && string.Equals(y.Name.LocalName, "Name", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(y.Value) && string.Equals(y.Value, elementName, StringComparison.OrdinalIgnoreCase))) .FirstOrDefault(); if ((columnElement != null) && (columnElement.Value != null)) { elementValue = columnElement.Value.Trim(); if (string.IsNullOrWhiteSpace(elementValue)) { elementValue = "N/A"; } } } eventChildElement.Add(new XElement(elementName, elementValue)); } #endregion rootElement.Add(eventChildElement); } // foreach (var eventBase in kvpEventData.Value) { #region Create report for the specific event id var eventDescription = string.Empty; if (EventDescriptions.ContainsKey(kvpEventData.Key)) { eventDescription = $"-{EventDescriptions[kvpEventData.Key].Description}"; } var reportFileName = $"Event-{kvpEventData.Key.Replace("/","-")}{eventDescription}-{firstEvent.YMDHMFriendly().Replace(":", "-").Replace(" ", "-")}-{lastEvent.YMDHMFriendly().Replace(":", "-").Replace(" ", "-")}.xml"; var reportFilePath = Path.Combine(reportFileBasePath, reportFileName); var xDocument = new XDocument(new XDeclaration("1.0", "UTF-8", string.Empty), rootElement); try { Console.WriteLine($"{DateTime.Now.YMDHMSFriendly()} - {ObjectExtensions.CurrentMethodName()} Writing: {rootElement.Elements().Count()} events to file: {reportFilePath}"); xDocument.Save(reportFilePath); } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error parsing events"); Console.WriteLine(e.VerboseExceptionString()); Console.ResetColor(); } #endregion } // foreach (var kvpEventData in EventData) { }
private void PopulateEventList() { lock (Lock) { if (EventList.Count > 0) { return; } //var curDir = System.Web.HttpRuntime.AppDomainAppPath; //var dlls = Directory.GetFiles(curDir, "*.dll", SearchOption.AllDirectories); var types = new List <Type>(); var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (var assembly in allAssemblies) { var tmpBaseTypes = assembly.GetTypes() .Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(Event))) .ToList(); types.AddRange(tmpBaseTypes); } // This seems to work better than loading all dlls in current domain path. //var appDomain = AppDomain.CreateDomain("tmpDomainForWebTemplate"); //foreach (var dll in dlls) //{ // if (dll.Contains("\\roslyn\\")) // { // continue; // } // try // { // var assembly = appDomain.Load(File.ReadAllBytes(dll)); // var eventTypes = assembly.GetTypes() // .Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(Event))) // .ToList(); // if (eventTypes.Count > 0) // { // types.AddRange(eventTypes); // } // } // catch (BadImageFormatException ex) // { // Console.WriteLine(ex.Message); // } // catch (ReflectionTypeLoadException ex) // { // Console.WriteLine(ex.Message); // } // catch (FileNotFoundException ex) // { // Console.WriteLine(ex.Message); // } //} //AppDomain.Unload(appDomain); foreach (var type in types) { //if (type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(Event))) //{ if (type == typeof(BasicCrudModify <>)) { continue; } if (type == typeof(BasicCrudView <>)) { continue; } if (type == typeof(BasicCrudDelete <>)) { continue; } if (type.GetInterface("IBasicCrudMenuItem") != null) { var subType = (IBasicCrudMenuItem)Container.Resolve(type); var d1 = typeof(BasicCrudView <>); Type[] typeArgs1 = { subType.InnerType }; var viewType = d1.MakeGenericType(typeArgs1); var viewInstance = (IBasicCrudView)Container.Resolve(viewType); viewInstance.Id = subType.GetBaseMenuId(); viewInstance.ItemName = subType.GetBaseItemName(); viewInstance.ColumnsToShowInView = subType.GetColumnsToShowInView(); viewInstance.OrderQuery = subType.OrderQueryInternal; var columnConfig = new ColumnConfiguration(); subType.ConfigureAdditionalColumns(columnConfig); viewInstance.AdditionalColumns = columnConfig.GetColumns(); if (!EventList.ContainsKey(viewInstance.GetId())) { EventList.Add(viewInstance.GetId(), viewInstance.GetType()); EventDescriptions.Add(viewInstance.GetId(), viewInstance.Description); EventMenuList.Add(viewInstance.GetId(), viewInstance); SubTypes.Add(viewInstance.GetId(), type); } var d2 = typeof(BasicCrudModify <>); Type[] typeArgs2 = { subType.InnerType }; var modifyType = d2.MakeGenericType(typeArgs2); var modifyInstance = (IBasicCrudModify)Container.Resolve(modifyType); modifyInstance.Id = subType.GetBaseMenuId() + 1; modifyInstance.ItemName = subType.GetBaseItemName(); modifyInstance.InputProperties = subType.GetInputProperties(); modifyInstance.UniquePropertyName = subType.UniquePropertyName; modifyInstance.OnModifyInternal = subType.OnModifyInternal; if (!EventList.ContainsKey(modifyInstance.GetId())) { EventList.Add(modifyInstance.GetId(), modifyInstance.GetType()); EventDescriptions.Add(modifyInstance.GetId(), modifyInstance.Description); EventMenuList.Add(modifyInstance.GetId(), modifyInstance); SubTypes.Add(modifyInstance.GetId(), type); } var d3 = typeof(BasicCrudDelete <>); Type[] typeArgs3 = { subType.InnerType }; var deleteType = d3.MakeGenericType(typeArgs2); var deleteInstance = (IBasicCrudDelete)Container.Resolve(deleteType); deleteInstance.Id = subType.GetBaseMenuId() + 2; deleteInstance.ItemName = subType.GetBaseItemName(); deleteInstance.OnDeleteInternal = subType.OnDeleteInternal; if (!EventList.ContainsKey(deleteInstance.GetId())) { EventList.Add(deleteInstance.GetId(), deleteInstance.GetType()); EventDescriptions.Add(deleteInstance.GetId(), deleteInstance.Description); EventMenuList.Add(deleteInstance.GetId(), deleteInstance); SubTypes.Add(deleteInstance.GetId(), type); } } else if (type != typeof(BasicCrudMenuItem <>)) { //if (System.Diagnostics.Debugger.IsAttached == false) System.Diagnostics.Debugger.Launch(); var instance = (IEvent)Container.Resolve(type); if (!(instance is BackgroundEvent) && !EventList.ContainsKey(instance.GetId())) { EventList.Add(instance.GetId(), instance.GetType()); EventDescriptions.Add(instance.GetId(), instance.Description); EventMenuList.Add(instance.GetId(), instance); } else if (instance is BackgroundEvent && !BackgroundEventList.ContainsKey(instance.GetId())) { BackgroundEventList.Add(instance.GetId(), instance as BackgroundEvent); } } //} //else //{ // Console.WriteLine("X"); //} } } }