AlarmFilter added

This commit is contained in:
Richard Frith-Macdonald 2021-12-22 10:37:52 +00:00
parent d0cc16935b
commit 7a3ce7697a
2 changed files with 106 additions and 38 deletions

View file

@ -1,3 +1,8 @@
2021-12-22 Richard Frith-Macdonald <rfm@gnu.org>
* EcControl.m: Add AlamrFilter as a config option to provide a
regular expression to filter out alarms to be ignored.
2021-12-19 Richard Frith-Macdonald <rfm@gnu.org>
* EcAlarmDestination.h:

View file

@ -352,6 +352,7 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
unsigned consolePingPosition;
NSString *configFailed;
NSString *configIncludeFailed;
NSRegularExpression *alarmFilter;
EcAlerter *alerter;
}
- (NSFileHandle*) openLog: (NSString*)lname;
@ -377,6 +378,7 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
type: (EcLogType)t
to: (NSString*)to
from: (NSString*)from;
- (NSString*) messageForAlarm: (EcAlarm*)alarm;
- (NSData*) registerCommand: (id<Command>)c
name: (NSString*)n;
- (NSString*) registerConsole: (id<Console>)c
@ -384,7 +386,8 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
pass: (NSString*)p;
- (void) reply: (NSString*) msg to: (NSString*)n from: (NSString*)c;
- (void) reportAlarm: (EcAlarm*)alarm
severity: (EcAlarmSeverity)severity
withMessage: (NSString*)message
isCleared: (BOOL)cleared
reminder: (int)reminder;
- (void) reportAlarms;
- (void) servers: (NSData*)d
@ -404,6 +407,7 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
{
EcAlarmSeverity severity;
EcAlarm *old;
NSString *mesg;
NSString *desc;
NSRange range;
@ -418,12 +422,33 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
severity = [alarm perceivedSeverity];
old = [sink latest: alarm];
if (old)
if (old
&& (EcAlarmSeverityCleared == severity
&& [old perceivedSeverity] == severity))
{
if (EcAlarmSeverityCleared == severity
&& [old perceivedSeverity] == severity)
return; // Duplicate clear ignored.
}
else
{
NSRegularExpression *re;
[self ecDoLock];
re = AUTORELEASE(RETAIN(alarmFilter));
[self ecUnLock];
mesg = [self messageForAlarm: alarm];
if (re != nil)
{
return; // Duplicate clear ignored.
NSRange r;
r = [re rangeOfFirstMatchInString: mesg
options: 0
range: NSMakeRange(0, [mesg length])];
if (r.length > 0)
{
NSLog(@"AlarmFilter config removes alarm: %@", mesg);
return;
}
}
}
@ -504,13 +529,25 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
int reminder;
key = [NSString stringWithFormat: @"%d", notificationID];
mesg = [self messageForAlarm: old];
if (nil == (info = [lastAlertInfo objectForKey: key]))
{
BOOL cleared;
/* Alarm not yet reported ... report it before clearing.
*/
if ([old perceivedSeverity] == EcAlarmSeverityCleared)
{
cleared = YES;
}
else
{
cleared = NO;
}
[self reportAlarm: old
severity: [alarm perceivedSeverity]
withMessage: mesg
isCleared: cleared
reminder: 0];
}
@ -519,7 +556,8 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
reminder = [[info objectForKey: @"Reminder"] intValue];
[lastAlertInfo removeObjectForKey: key];
[self reportAlarm: old
severity: EcAlarmSeverityCleared
withMessage: mesg
isCleared: YES
reminder: reminder];
}
}
@ -569,6 +607,25 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
return lf;
}
- (void) cmdDefaultsChanged: (NSNotification*)n
{
NSRegularExpression *re = nil;
NSString *str;
[super cmdDefaultsChanged: n];
str = [[self cmdDefaults] stringForKey: @"AlarmFilter"];
if (str)
{
re = [[NSRegularExpression alloc] initWithPattern: str
options: 0
error: NULL];
}
[self ecDoLock];
ASSIGN(alarmFilter, re);
[self ecUnLock];
}
- (oneway void) cmdGnip: (id <CmdPing>)from
sequence: (unsigned)num
extra: (NSData*)data
@ -1743,6 +1800,7 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
DESTROY(consoles);
DESTROY(configFailed);
DESTROY(configIncludeFailed);
DESTROY(alarmFilter);
[super dealloc];
}
@ -2262,14 +2320,11 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
[self information: msg type: LT_CONSOLE to: n from: c];
}
- (void) reportAlarm: (EcAlarm*)alarm
severity: (EcAlarmSeverity)severity
reminder: (int)reminder
- (NSString*) messageForAlarm: (EcAlarm*)alarm
{
NSString *additional;
NSString *component;
NSString *connector;
NSString *identifier;
NSString *instance;
NSString *message;
NSString *repair;
@ -2319,20 +2374,42 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
spacing2 = @", ";
}
message = [NSString stringWithFormat: @"%@%@%@%@%@ - '%@%@%@%@' on %@",
[alarm specificProblem], spacing1,
additional, spacing2, repair,
[alarm moProcess], connector, instance,
component, [alarm moHost]];
return message;
}
- (void) reportAlarm: (EcAlarm*)alarm
withMessage: (NSString*)message
isCleared: (BOOL)cleared
reminder: (int)reminder
{
NSString *identifier;
identifier = [NSString stringWithFormat: @"%d", [alarm notificationID]];
if (cleared)
{
message = [NSString stringWithFormat: @"Clear %@ (%@)\n%@",
identifier,
[EcAlarm stringFromSeverity: [alarm perceivedSeverity]],
message];
}
else
{
message = [NSString stringWithFormat: @"Alarm %@ (%@)\n%@",
identifier,
[EcAlarm stringFromSeverity: [alarm perceivedSeverity]],
message];
}
alarm = [[alarm copy] autorelease];
if (EcAlarmSeverityCleared == severity)
if (cleared)
{
[alarm setExtra: @"Clear"];
message = [NSString stringWithFormat:
@"Clear %@ (%@)\n%@%@%@%@%@ - '%@%@%@%@' on %@",
identifier, [EcAlarm stringFromSeverity: [alarm perceivedSeverity]],
[alarm specificProblem], spacing1,
additional, spacing2, repair,
[alarm moProcess], connector, instance,
component, [alarm moHost]];
[alarm setExtra: @"Clear"];
}
else
{
@ -2344,21 +2421,6 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
{
[alarm setExtra: @"Alarm"];
}
message = [NSString stringWithFormat:
@"Alarm %@ (%@)\n%@%@%@%@%@ - '%@%@%@%@' on %@",
identifier, [EcAlarm stringFromSeverity: [alarm perceivedSeverity]],
[alarm specificProblem], spacing1,
additional, spacing2, repair,
[alarm moProcess], connector, instance,
component, [alarm moHost]];
if (reminder > 0)
{
[alarm setExtra: @"Reminder"];
}
else
{
[alarm setExtra: @"Alarm"];
}
}
[alerter handleEvent: message
@ -2420,9 +2482,10 @@ static NSString* cmdWord(NSArray* a, unsigned int pos)
{
alarmsAlerted++;
}
[self reportAlarm: alarm
severity: [alarm perceivedSeverity]
reminder: reminder];
[self reportAlarm: alarm
withMessage: [self messageForAlarm: alarm]
isCleared: (EcAlarmSeverityCleared == severity)
reminder: 0];
}
else
{