Пример #1
0
 private bool SourceMatch(string sources, AlarmOrEvent alarm)
 {
     if (string.IsNullOrEmpty(sources))
     {
         return(false);
     }
     if (sources == "*")
     {
         return(true);
     }
     string[] ss = sources.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(s => s.ToLowerInvariant().Trim()).ToArray();
     if (alarm.IsSystem && ss.Contains("system"))
     {
         return(true);
     }
     if (ss.Contains(alarm.ModuleID.ToLowerInvariant()))
     {
         return(true);
     }
     if (ss.Contains(alarm.ModuleName.ToLowerInvariant()))
     {
         return(true);
     }
     return(false);
 }
Пример #2
0
 public void AggreagteWith(AlarmOrEvent e)
 {
     TimeLast  = e.Time;
     Count    += 1;
     Initiator = e.Initiator;
     Message   = e.Message;
     Details   = e.Details;
 }
Пример #3
0
        private async Task OnAlarmOrEvent(AlarmOrEvent alarmOrEvent)
        {
            if (!running)
            {
                initBuffer.Add(alarmOrEvent);
                return;
            }

            AggregatedEvent?aggEvent = null;

            for (int i = aggregatedWarningsAndAlarms.Count - 1; i >= 0; i--)
            {
                var e = aggregatedWarningsAndAlarms[i];
                if (e.CanAggregateWith(alarmOrEvent))
                {
                    aggEvent = e;
                    break;
                }
            }

            if (aggEvent != null)
            {
                aggEvent.AggregateWith(alarmOrEvent);

                if (aggEvent.ReturnedToNormal && aggEvent.State == EventState.Ack)
                {
                    aggregatedWarningsAndAlarms.Remove(aggEvent);
                }

                DataValue data = DataValue.FromObject(aggEvent);
                VTQ       vtq  = new VTQ(aggEvent.TimeFirst, Quality.Good, data);
                await connection.HistorianModify(GetVar(), ModifyMode.Update, vtq);
            }
            else if (!alarmOrEvent.ReturnToNormal)
            {
                aggEvent = AggregatedEvent.FromEvent(alarmOrEvent);
                if (aggEvent.TimeFirst <= latestUsedTimestamp)
                {
                    Timestamp t = latestUsedTimestamp.AddMillis(1);
                    aggEvent.TimeFirst = t;
                    aggEvent.TimeLast  = t;
                }
                if (aggEvent.IsWarningOrAlarm())
                {
                    aggregatedWarningsAndAlarms.Add(aggEvent);
                }
                latestUsedTimestamp = aggEvent.TimeFirst;

                DataValue data = DataValue.FromObject(aggEvent);
                VTQ       vtq  = new VTQ(aggEvent.TimeFirst, Quality.Good, data);
                await connection.HistorianModify(GetVar(), ModifyMode.Insert, vtq);

                if (alarmOrEvent.Severity == Severity.Warning || alarmOrEvent.Severity == Severity.Alarm)
                {
                    NotifyAlarm(alarmOrEvent);
                }
            }
        }
Пример #4
0
 private void NotifyAlarm(AlarmOrEvent alarm)
 {
     foreach (var no in model.MailNotificationSettings.Notifications)
     {
         if (no.Enabled && SourceMatch(no.Sources, alarm))
         {
             _ = SendMail(alarm, no, model.MailNotificationSettings.SmtpSettings);
         }
     }
 }
Пример #5
0
        private async Task SendMail(AlarmOrEvent alarm, MailNotification no, SmtpSettings settings)
        {
            try {
                string source = alarm.IsSystem ? "System" : alarm.ModuleName;

                var msg = new StringBuilder();
                msg.AppendLine($"Severity: {alarm.Severity}");
                msg.AppendLine($"Message:  {alarm.Message}");
                msg.AppendLine($"Source:   {source}");
                msg.AppendLine($"Time UTC: {alarm.Time}");
                msg.AppendLine($"Time:     {alarm.Time.ToDateTime().ToLocalTime()}");
                if (!string.IsNullOrEmpty(alarm.Details))
                {
                    msg.AppendLine($"Details:  {alarm.Details}");
                }

                string subject = no.Subject
                                 .Replace("{severity}", alarm.Severity.ToString())
                                 .Replace("{message}", alarm.Message)
                                 .Replace("{source}", source);

                var messageToSend = new MimeMessage(
                    from: new InternetAddress[] { InternetAddress.Parse(settings.From) },
                    to: InternetAddressList.Parse(no.To),
                    subject: subject,
                    body: new TextPart(MimeKit.Text.TextFormat.Plain)
                {
                    Text = msg.ToString()
                }
                    );

                using (var smtp = new MailKit.Net.Smtp.SmtpClient()) {
                    smtp.MessageSent += (sender, args) => { /* args.Response */ };
                    smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;
                    await smtp.ConnectAsync(settings.Server, settings.Port, (SecureSocketOptions)settings.SslOptions);

                    if (!string.IsNullOrEmpty(settings.AuthUser) || !string.IsNullOrEmpty(settings.AuthPass))
                    {
                        await smtp.AuthenticateAsync(settings.AuthUser, settings.AuthPass);
                    }
                    await smtp.SendAsync(messageToSend);

                    await smtp.DisconnectAsync(quit : true);

                    Console.Out.WriteLine($"Sent notification mail (to: {no.To}, subject: {subject})");
                }
            }
            catch (Exception exp) {
                Console.Error.WriteLine("Failed to send notification mail: " + exp.Message);
            }
        }
Пример #6
0
        public async void OnAlarmOrEvent(AlarmOrEvent alarmOrEvent)
        {
            if (!running)
            {
                initBuffer.Add(alarmOrEvent);
                return;
            }

            AggregatedEvent aggEvent = null;

            for (int i = aggregatedWarningsAndAlarms.Count - 1; i >= 0; i--)
            {
                var e = aggregatedWarningsAndAlarms[i];
                if (e.CanAggregateWith(alarmOrEvent))
                {
                    aggEvent = e;
                    break;
                }
            }

            if (aggEvent != null)
            {
                aggEvent.AggreagteWith(alarmOrEvent);

                DataValue data = DataValue.FromObject(aggEvent);
                VTQ       vtq  = new VTQ(aggEvent.TimeFirst, Quality.Good, data);
                await connection.HistorianModify(GetVar(), ModifyMode.Update, vtq);
            }
            else
            {
                aggEvent = AggregatedEvent.FromEvent(alarmOrEvent);
                if (aggEvent.TimeFirst <= latestUsedTimestamp)
                {
                    Timestamp t = latestUsedTimestamp.AddMillis(1);
                    aggEvent.TimeFirst = t;
                    aggEvent.TimeLast  = t;
                }
                if (aggEvent.IsWarningOrAlarm())
                {
                    aggregatedWarningsAndAlarms.Add(aggEvent);
                }
                latestUsedTimestamp = aggEvent.TimeFirst;

                DataValue data = DataValue.FromObject(aggEvent);
                VTQ       vtq  = new VTQ(aggEvent.TimeFirst, Quality.Good, data);
                await connection.HistorianModify(GetVar(), ModifyMode.Insert, vtq);
            }
        }
Пример #7
0
 public static AggregatedEvent FromEvent(AlarmOrEvent e) => new AggregatedEvent()
 {
     TimeFirst  = e.Time,
     TimeLast   = e.Time,
     Count      = 1,
     State      = EventState.New,
     Severity   = e.Severity,
     ModuleID   = e.ModuleID,
     ModuleName = e.ModuleName,
     System     = e.IsSystem,
     Type       = e.Type,
     Objects    = e.AffectedObjects,
     Initiator  = e.Initiator,
     Message    = e.Message,
     Details    = e.Details
 };
Пример #8
0
 public void AggregateWith(AlarmOrEvent e)
 {
     if (e.ReturnToNormal)
     {
         ReturnedToNormal = true;
         InfoRTN          = new InfoRTN()
         {
             Time    = e.Time,
             Message = e.Message,
         };
     }
     else
     {
         ReturnedToNormal = false;
         // InfoRTN = null;
         Severity  = e.Severity;
         TimeLast  = e.Time;
         Count    += 1;
         Initiator = e.Initiator;
         Message   = e.Message;
         Details   = e.Details;
     }
 }
Пример #9
0
 void EventListener.OnAlarmOrEvent(AlarmOrEvent alarmOrEvent)
 {
     currentView?.OnAlarmOrEvent(alarmOrEvent);
 }
Пример #10
0
 public virtual void OnAlarmOrEvent(AlarmOrEvent alarmOrEvent)
 {
 }
Пример #11
0
 public bool CanAggregateWith(AlarmOrEvent e) =>
 Type == e.Type &&
 Severity == e.Severity &&
 ModuleID == e.ModuleID &&
 System == e.IsSystem &&
 Arrays.Equals(Objects, e.AffectedObjects);