diff --git a/ChangeLog b/ChangeLog index c201c2e..03b16bb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2023-04-07 Richard Frith-Macdonald + + * ECCL.h: + * EcCommand.m: + * EcConsole.m: + * EcControl.m: + * EcProcess.h: + * EcProcess.m: + Add display options 'mark' and 'prompt' to control output format to + make it easier to perform pattern matching when using Console in a + script. + 2023-03-10 Richard Frith-Macdonald * EcCommand.m: diff --git a/ECCL.h b/ECCL.h index cdc925c..ee2bdf1 100644 --- a/ECCL.h +++ b/ECCL.h @@ -122,7 +122,13 @@ If the Control server actively refuses the login, the exit status is 11.
NB. Command line arguments take precedence over environment variables - even if the command line aregument is an empty string. + even if the command line aregument is an empty string.
+ A couple of extra variables alter the format of output as follows:
+ Mark (or the ConsoleMark environment variable) can be set to YES to + specify that each message is marked with a consistent start and end + saying where the message was from.
+ Prompt (or the ConsolePrompt environment variable) can be set to NO + to suppress the normal prompt line at the end of each message.
diff --git a/EcCommand.m b/EcCommand.m index 72dab59..9c547be 100644 --- a/EcCommand.m +++ b/EcCommand.m @@ -5255,7 +5255,7 @@ NSLog(@"Problem %@", localException); m = [NSString stringWithFormat: @"Unknown command - '%@'\n", wd]; } - [self information: m from: t to: f type: LT_CONSOLE]; + [self reply: m to: f from: ecFullName()]; } else { @@ -6109,6 +6109,8 @@ NSLog(@"Problem %@", localException); } else { + NSLog(@"reply: %@ to: %@ from: %@ - discarded (no connection to Control)", + msg, n, c); } } diff --git a/EcConsole.m b/EcConsole.m index 9319e78..720a144 100644 --- a/EcConsole.m +++ b/EcConsole.m @@ -583,7 +583,7 @@ static NSString *originalUserName = nil; } } -- (void) doLine:(NSString *)_line +- (void) doLine: (NSString *)_line { NSAutoreleasePool *arp; NSMutableArray *words; @@ -817,6 +817,9 @@ static NSString *originalUserName = nil; if (user && pass) { + BOOL mark = NO; + BOOL prompt = YES; + interactive = NO; server = [NSConnection rootProxyForConnectionWithRegisteredName: name host: host @@ -835,6 +838,7 @@ static NSString *originalUserName = nil; } [self cmdQuit: 10]; DESTROY(self); + return nil; } else { @@ -863,6 +867,47 @@ static NSString *originalUserName = nil; } } + if ([defs objectForKey: @"Mark"]) + { + mark = [defs boolForKey: @"Mark"]; + } + else + { + if ([env objectForKey: @"ConsoleMark"]) + { + mark = [[env objectForKey: @"ConsoleMark"] boolValue]; + } + } + + /* Tell the Control server to mark start and end of messages + * if required. + */ + if (mark) + { + [self doCommand: [NSMutableArray arrayWithObjects: + @"silent", @"set", @"display", @"mark", nil]]; + } + + if ([defs objectForKey: @"Prompt"]) + { + prompt = [defs boolForKey: @"Prompt"]; + } + else + { + if ([env objectForKey: @"ConsolePrompt"]) + { + prompt = [[env objectForKey: @"ConsolePrompt"] boolValue]; + } + } + + /* Tell the Control server not to prompt if necessary + */ + if (NO == prompt) + { + [self doCommand: [NSMutableArray arrayWithObjects: + @"silent", @"unset", @"display", @"prompt", nil]]; + } + if (nil == (s = [defs stringForKey: @"Line"])) { s = [env objectForKey: @"ConsoleLine"]; diff --git a/EcControl.m b/EcControl.m index 8c36d3b..569ba48 100644 --- a/EcControl.m +++ b/EcControl.m @@ -204,6 +204,8 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) BOOL errors; BOOL alerts; BOOL audits; + BOOL mark; + BOOL prompt; } - (id) initFor: (id)o name: (NSString*)n @@ -215,15 +217,19 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) - (BOOL) getAudits; - (BOOL) getErrors; - (BOOL) getGeneral; +- (BOOL) getMark; +- (BOOL) getPrompt; - (BOOL) getWarnings; - (NSString*) pass; -- (NSString*) promptAfter: (NSString*)msg; +- (NSString*) promptAfter: (NSString*)msg from: (NSString*)sender; - (void) setAlerts: (BOOL)flag; - (void) setAudits: (BOOL)flag; - (void) setConnectedHost: (NSString*)c; - (void) setConnectedServ: (NSString*)c; - (void) setErrors: (BOOL)flag; - (void) setGeneral: (BOOL)flag; +- (void) setMark: (BOOL)flag; +- (void) setPrompt: (BOOL)flag; - (void) setWarnings: (BOOL)flag; @end @@ -267,6 +273,16 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) return general; } +- (BOOL) getMark +{ + return mark; +} + +- (BOOL) getPrompt +{ + return prompt; +} + - (BOOL) getWarnings { return warnings; @@ -288,6 +304,8 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) alerts = YES; audits = NO; errors = YES; + mark = NO; + prompt = YES; } return self; } @@ -297,23 +315,40 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) return pass; } -- (NSString*) promptAfter: (NSString*)msg +- (NSString*) promptAfter: (NSString*)msg from: (NSString*)sender { - if (chost && cserv) + NSString *sMark = @""; + NSString *eMark = @""; + + if (sender && mark) { - return [NSString stringWithFormat: @"%@\n%@:%@> ", msg, chost, cserv]; + sMark = [NSString stringWithFormat: @"[start message from %@]\n", sender]; + eMark = [NSString stringWithFormat: @"\n[end message from %@]", sender]; + } + if (NO == prompt) + { + return [NSString stringWithFormat: @"%@%@%@", + sMark, msg, eMark]; + } + else if (chost && cserv) + { + return [NSString stringWithFormat: @"%@%@%@\n%@:%@> ", + sMark, msg, eMark, chost, cserv]; } else if (chost) { - return [NSString stringWithFormat: @"%@\n%@:> ", msg, chost]; + return [NSString stringWithFormat: @"%@%@%@\n%@:> ", + sMark, msg, eMark, chost]; } else if (cserv) { - return [NSString stringWithFormat: @"%@\n:%@> ", msg, cserv]; + return [NSString stringWithFormat: @"%@%@%@\n:%@> ", + sMark, msg, eMark, cserv]; } else { - return [NSString stringWithFormat: @"%@\nControl> ", msg]; + return [NSString stringWithFormat: @"%@%@%@\nControl> ", + sMark, msg, eMark]; } } @@ -347,6 +382,16 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) general = flag; } +- (void) setMark: (BOOL)flag +{ + mark = (flag ? YES : NO); +} + +- (void) setPrompt: (BOOL)flag +{ + prompt = (flag ? YES : NO); +} + - (void) setWarnings: (BOOL)flag { warnings = flag; @@ -519,7 +564,7 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) NS_DURING { - [[c obj] information: [c promptAfter: desc]]; + [[c obj] information: [c promptAfter: desc from: nil]]; } NS_HANDLER { @@ -689,12 +734,19 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) { NSMutableArray *cmd; ConsoleInfo *console; + BOOL silent = NO; cmd = [NSPropertyListSerialization propertyListWithData: dat options: NSPropertyListMutableContainers format: 0 error: 0]; + if ([[cmd firstObject] isEqual: @"silent"]) + { + silent = YES; + [cmd removeObjectAtIndex: 0]; + } + console = (ConsoleInfo*)[self findIn: consoles byName: f]; if (console == nil) { @@ -1272,6 +1324,10 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) @" displays alert (and critical severity alarm) messages.\n" @" set display audits\n" @" displays audit messages.\n" + @" set display mark\n" + @" marks start and end of messages.\n" + @" set display prompt\n" + @" outputs a prompt at the end of each message.\n" @"\n"; } else if (comp(wd, @"Status") >= 0) @@ -1326,6 +1382,8 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) @" unset display errors\n" @" unset display alerts\n" @" unset display audits\n" + @" unset display mark\n" + @" unset display prompt\n" @"\n"; } } @@ -1533,10 +1591,12 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) { m = [NSString stringWithFormat: @"display settings -\n" @"general: %d warnings: %d errors: %d alerts: %d" - @" alerts: %d\n", + @" audits: %d mark:%@ prompt:%@\n", [console getGeneral], [console getWarnings], [console getErrors], [console getAlerts], - [console getAudits]]; + [console getAudits], + ([console getMark] ? @"yes" : @"no"), + ([console getPrompt] ? @"yes" : @"no")]; } else if (comp(wd, @"alerts") >= 0) { @@ -1554,6 +1614,14 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) { [console setGeneral: YES]; } + else if (comp(wd, @"mark") >= 0) + { + [console setMark: YES]; + } + else if (comp(wd, @"prompt") >= 0) + { + [console setPrompt: YES]; + } else if (comp(wd, @"warnings") >= 0) { [console setWarnings: YES]; @@ -1667,10 +1735,12 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) { m = [NSString stringWithFormat: @"display settings -\n" @"general: %d warnings: %d errors: %d alerts: %d" - @" audits: %d\n", + @" audits: %d mark:%@ prompt:%@\n", [console getGeneral], [console getWarnings], [console getErrors], [console getAlerts], - [console getAudits]]; + [console getAudits], + ([console getMark] ? @"yes" : @"no"), + ([console getPrompt] ? @"yes" : @"no")]; } else if (comp(wd, @"alerts") >= 0) { @@ -1688,6 +1758,14 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) { [console setGeneral: NO]; } + else if (comp(wd, @"mark") >= 0) + { + [console setMark: NO]; + } + else if (comp(wd, @"prompt") >= 0) + { + [console setPrompt: NO]; + } else if (comp(wd, @"warnings") >= 0) { [console setWarnings: NO]; @@ -1707,12 +1785,12 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) m = [NSString stringWithFormat: @"Unknown command - '%@'\n", wd]; } - if (m != nil) + if (m != nil && NO == silent) { [self information: m type: LT_CONSOLE to: [console name] - from: nil]; + from: ecFullName()]; } } } @@ -1998,11 +2076,10 @@ static NSString* cmdWord(NSArray* a, unsigned int pos) NS_DURING { - /* - * Finally - we send the message to the console along with - * a prompt. + /* Finally - we send the message to the console along with + * a prompt. */ - [[c obj] information: [c promptAfter: inf]]; + [[c obj] information: [c promptAfter: inf from: from]]; } NS_HANDLER { diff --git a/EcProcess.h b/EcProcess.h index 51b4651..d8f3fab 100644 --- a/EcProcess.h +++ b/EcProcess.h @@ -323,13 +323,14 @@ typedef enum { /* * Useful functions - */ -extern void cmdSetHome(NSString *home); -extern NSString* cmdDataDir(); -extern NSString* cmdLogsDir(NSString *date); -extern NSString* cmdLogKey(EcLogType t); -extern NSString* cmdLogName(); -extern NSString* cmdLogFormat(EcLogType t, NSString *fmt); -extern void ecSetLogsSubdirectory(NSString *pathComponent); +extern void cmdSetHome(NSString *home); +extern NSString *cmdDataDir(); +extern NSString *cmdLogsDir(NSString *date); +extern NSString *cmdLogKey(EcLogType t); +extern NSString *cmdLogName(); +extern NSString *cmdLogFormat(EcLogType t, NSString *fmt); +extern NSString *ecFullName(); +extern void ecSetLogsSubdirectory(NSString *pathComponent); /** Return the native thread ID of the current thread, or NSNotFound if * that is not available. diff --git a/EcProcess.m b/EcProcess.m index fdbb142..91728e4 100644 --- a/EcProcess.m +++ b/EcProcess.m @@ -888,6 +888,23 @@ ecHostName() return [name autorelease]; } +static NSString *fullName = nil; +NSString * +ecFullName() +{ + NSString *name; + + [ecLock lock]; + if (nil == fullName) + { + fullName = [[NSString alloc] initWithFormat: @"%@:%@", + ecHostName(), cmdLogName()]; + } + name = [fullName retain]; + [ecLock unlock]; + return [name autorelease]; +} + static EcAlarmSeverity memAlarm = EcAlarmSeverityMajor; static NSString *memType = nil; static NSString *memUnit = @"KB"; @@ -4418,7 +4435,7 @@ NSLog(@"Ignored attempt to set timer interval to %g ... using 10.0", interval); { NS_DURING { - [cmdServer reply: val to: name from: cmdLogName()]; + [cmdServer reply: val to: name from: ecFullName()]; } NS_HANDLER {