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); }
public void AggreagteWith(AlarmOrEvent e) { TimeLast = e.Time; Count += 1; Initiator = e.Initiator; Message = e.Message; Details = e.Details; }
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); } } }
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); } } }
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); } }
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); } }
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 };
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; } }
void EventListener.OnAlarmOrEvent(AlarmOrEvent alarmOrEvent) { currentView?.OnAlarmOrEvent(alarmOrEvent); }
public virtual void OnAlarmOrEvent(AlarmOrEvent alarmOrEvent) { }
public bool CanAggregateWith(AlarmOrEvent e) => Type == e.Type && Severity == e.Severity && ModuleID == e.ModuleID && System == e.IsSystem && Arrays.Equals(Objects, e.AffectedObjects);