//--------------------------------------------------- public IEnumerable <CAgentFinderFromKey> GetAgentFindersAAppliquer(CTrapInstance trap) { List <CAgentFinderFromKey> lstFinders = new List <CAgentFinderFromKey>(); if (trap != null) { foreach (CAgentFinderFromKey finder in AgentFinders) { if (finder.ShouldApply(trap)) { //handler = handler.PrepareForAlarmCreation(this); lstFinders.Add(finder); } } } return(lstFinders.ToArray()); }
//--------------------------------------------------- public IEnumerable <CTrapHandler> GetTrapsHandlersAAppliquer(CTrapInstance trap) { List <CTrapHandler> lstTraps = new List <CTrapHandler>(); if (trap != null) { foreach (CTrapHandler handler in Handlers) { if (handler.ShouldDeclenche(trap)) { //handler = handler.PrepareForAlarmCreation(this); lstTraps.Add(handler); } } } return(lstTraps.ToArray()); }
public void OnReceiveMessage(MessageReceivedEventArgs e) { DateTime dt = DateTime.Now; ListViewItem item = new ListViewItem(e.ToString()); item.Tag = e.Message; if (m_wndListView.Items.Count > 0) { m_wndListView.Items.Insert(0, item); } else { m_wndListView.Items.Add(item); } CTrapInstance trap = CTrapInstance.FromMessage( e.Message, CBaseTypesAlarmes.Instance.BaseTraps); if (trap != null) { IEnumerable <CTrapHandler> lstTrapsHandlers = CBaseTypesAlarmes.Instance.BaseTraps.GetTrapsHandlersAAppliquer(trap); foreach (CTrapHandler handler in lstTrapsHandlers) { handler.CreateAlarmesOnTrap(trap); } foreach (CAlarmeACreer creation in trap.AlarmesACreer) { m_gestionnaireAlarmes.CreateAlarme(creation); } TimeSpan sp = DateTime.Now - dt; System.Console.WriteLine("Durée traitement : " + sp.TotalMilliseconds.ToString()); RefreshListeAlarmes(); } }
//----------------------------------------------- private IEnumerable <CAgentSnmpPourSupervision> GetAgentsForTrap(CTrapInstance trap, string strTrapOriginIP) { /*Principe de fonctionnement : * On tente tout d'abord de trouver les agents qui ont l'ip transmise par le trap. * Si on en trouve * On vérifie s'il y a des finders pour ce trap et cet agent, et si oui, * on vérifie que la clé correspond. * Si elle correspond, on garde l'agent * Sinon, on le supprime de la liste des agents valides * Sinon (on n'a pas trouvé d'agent par l'IP ou bien la liste est vide suite à la passe 1) * Chercher via TOUS les finders de la base des agents qui correspondraient */ List <CAgentSnmpPourSupervision> listeAgentsFromIp = new List <CAgentSnmpPourSupervision>( m_configuration.GetAgentsForIp(strTrapOriginIP)); if (listeAgentsFromIp.Count > 0) { foreach (CAgentSnmpPourSupervision agent in listeAgentsFromIp.ToArray()) { IEnumerable <CAgentFinderFromKey> lstFinders = agent.TypeAgent.GetAgentFindersAAppliquer(trap); if (lstFinders.Count() == 0) { continue;//Pas de finder à appliquer, on conserve donc l'agent } bool bOneMatch = false; foreach (CAgentFinderFromKey finder in lstFinders) { if (finder.MatchAgent(trap, agent)) { bOneMatch = true; break; } } if (!bOneMatch)//Aucun finder ne colle avec l'agent, il n'est donc pas valide { listeAgentsFromIp.Remove(agent); } } if (listeAgentsFromIp.Count() > 0) { return(listeAgentsFromIp.AsReadOnly()); } } HashSet <CAgentSnmpPourSupervision> lstAgents = new HashSet <CAgentSnmpPourSupervision>(); //On n'a pas trouvé d'agent via l'IP CListeEntitesDeMemoryDb <CAgentFinderFromKey> lstFindersFromDb = new CListeEntitesDeMemoryDb <CAgentFinderFromKey>(m_configuration.DataBase); foreach (CAgentFinderFromKey finder in lstFindersFromDb) { if (finder.ShouldApply(trap)) { foreach (CAgentSnmpPourSupervision agent in finder.GetAgentsFromKey(trap)) { if (strTrapOriginIP != null && strTrapOriginIP.Length > 0) { if (finder.AutoUpdateIpOnMediationServices) { agent.Ip = strTrapOriginIP; } if (finder.AutoUpdateIpOnMediationServices || finder.AutoUpdateIpOnTimosDatabase) { UpdateAgentIpFromMediation(agent.Id, strTrapOriginIP, finder.AutoUpdateIpOnTimosDatabase); } } lstAgents.Add(agent); } } } return(lstAgents); }
//----------------------------------------------- private void TraiteMessagesATraiter() { if (m_nWaitingCounter > 5) { return; } m_nWaitingCounter++; lock (typeof(CLockerTraiteMessage)) { m_nWaitingCounter--; List <ISnmpMessage> lstMessages = new List <ISnmpMessage>(); lock (m_listeMessagesATraiter) { lstMessages.AddRange(m_listeMessagesATraiter); m_listeMessagesATraiter.Clear(); } foreach (ISnmpMessage message in lstMessages) { m_nNbMessages++; DateTime dtChrono = DateTime.Now; string strIpAgent = ""; TrapV1Message trapV1 = message as TrapV1Message; TrapV2Message trapV2 = message as TrapV2Message; if (trapV1 != null) { m_gestionnaireAlarmes.Trace.Write( "Trap received : " + trapV1.GetTraceInfo(), ALTRACE.TRACE, ALTRACE.DEBUG); strIpAgent = trapV1.AgentAddress.ToString(); StringBuilder bl = new StringBuilder(); foreach (Variable valeur in trapV1.Variables()) { bl.Append(valeur.Id.ToString()); bl.Append("="); bl.Append(valeur.Data.ToString()); bl.Append("\r\n"); } m_gestionnaireAlarmes.Trace.Write( "Trap fields : \r\n" + bl.ToString(), ALTRACE.TRACE, ALTRACE.DEBUG); } else if (trapV2 != null) { m_gestionnaireAlarmes.Trace.Write( "Trap received : " + trapV2.GetTraceInfo(), ALTRACE.TRACE, ALTRACE.DEBUG); if (trapV2.SenderIP != null) { strIpAgent = trapV2.SenderIP.ToString(); } StringBuilder bl = new StringBuilder(); foreach (Variable valeur in trapV2.Variables()) { bl.Append(valeur.Id.ToString()); bl.Append("="); bl.Append(valeur.Data.ToString()); bl.Append("\r\n"); } m_gestionnaireAlarmes.Trace.Write( "Trap fields : \r\n" + bl.ToString(), ALTRACE.TRACE, ALTRACE.DEBUG); } try { CTrapInstance trapTmp = CTrapInstance.FromMessage(message, null); if (trapTmp == null) { m_gestionnaireAlarmes.Trace.Write( "Can not interpret message " + message.ToString(), ALTRACE.TRACE, ALTRACE.DEBUG); continue; } IEnumerable <CAgentSnmpPourSupervision> lstAgents = GetAgentsForTrap(trapTmp, strIpAgent); bool bHasAgent = false; foreach (CAgentSnmpPourSupervision agent in lstAgents) { m_gestionnaireAlarmes.Trace.Write( "Trap managed by agent " + agent.Id, ALTRACE.DEBUG); CTypeAgentPourSupervision typeAgent = agent.TypeAgent; if (typeAgent != null) { CTrapInstance trap = CTrapInstance.FromMessage( message, agent); if (trap != null) { IEnumerable <CTrapHandler> lstTrapsHandlers = typeAgent.GetTrapsHandlersAAppliquer(trap); foreach (CTrapHandler handler in lstTrapsHandlers) { m_gestionnaireAlarmes.Trace.Write("Apply trap handler " + handler.Libelle, ALTRACE.DEBUG); handler.CreateAlarmesOnTrap(trap, m_gestionnaireAlarmes.Trace); } if (lstTrapsHandlers.Count() == 0) { m_gestionnaireAlarmes.Trace.Write( "No trap handler for this trap", ALTRACE.DEBUG); } foreach (CAlarmeACreer creation in trap.AlarmesACreer) { m_gestionnaireAlarmes.CreateAlarme(creation, EModeRemonteeAlarmes.InscrireARemonterMaisNePasLeFaire); } if (trap.AlarmesACreer.Count() == 0) { m_gestionnaireAlarmes.Trace.Write("No alarm creator for this trap", ALTRACE.DEBUG); } } } } if (!bHasAgent) { m_gestionnaireAlarmes.Trace.Write( "No agent for this trap", ALTRACE.DEBUG); } } catch (Exception ex) { m_gestionnaireAlarmes.Trace.Write( "Exception : " + ex.Message, ALTRACE.DEBUG); lock (m_listeMessagesATraiter) { m_listeMessagesATraiter.InsertRange(0, lstMessages); } break; } TimeSpan sp = DateTime.Now - dtChrono; if (m_nNbMessages % 100 == 0) { Console.WriteLine("Traite alrm (" + m_nNbMessages + "): " + sp.TotalMilliseconds); } } } m_gestionnaireAlarmes.SendAlarmes(); }