Exemple #1
0
        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);
        }
Exemple #3
0
        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) {
        }
Exemple #4
0
        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) {
        }
Exemple #5
0
        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");
                    //}
                }
            }
        }