diff --git a/ipaacatools/scripts/ipaaca-iu-sniffer b/ipaacatools/scripts/ipaaca-iu-sniffer index bc8da010c941bd89ac87310bcdded5fc9a5bf124..7167c6461f523815f97c08e90f9da0e9c3c50acf 100755 --- a/ipaacatools/scripts/ipaaca-iu-sniffer +++ b/ipaacatools/scripts/ipaaca-iu-sniffer @@ -87,7 +87,7 @@ def pretty_printed_iu_event(iu, event_type, local): s += '\npayload=' + pretty_printed_dict(iu.payload) return s -def my_update_handler(iu, event_type, local): +def iu_event_handler(iu, event_type, local): if arguments.regex: for cat in arguments.categories: # actually now regexs, not categories if re.match(cat, iu.category): @@ -96,7 +96,11 @@ def my_update_handler(iu, event_type, local): return print(pretty_printed_iu_event(iu, event_type, local), end='\n\n') - +def exit(code): + if platform.system() == 'Windows': + os._exit(code) + else: + sys.exit(code) parser = ipaaca.IpaacaArgumentParser(description='Ipaaca IU Sniffer -- Selectively listen to IPAACA traffic') parser.add_argument( @@ -113,6 +117,13 @@ parser.add_argument( metavar='CATEGORY', nargs='+', help='set categories (or regex patterns) to be matched') +parser.add_argument( + '-e', '--event-types', + default=None, + dest='event_types', + metavar='EVENT-TYPE', + nargs='+', + help='set event types (ADDED, MESSAGE, UPDATED, LINKSUPDATED, COMMITTED)') parser.add_argument( '-r', '--regex', action='store_true', @@ -134,37 +145,45 @@ parser.add_argument( if __name__ == '__main__': arguments = parser.parse_args() - buffers = {} + + # Create one input buffer for each channel we are listening on for channel in arguments.channels: buffers[channel] = ipaaca.InputBuffer( 'IpaacaIUSniffer', category_interests=arguments.categories if not arguments.regex else [''], channel=channel, resend_active=True) - buffers[channel].register_handler(my_update_handler) - - channellist = 's ' if len(arguments.channels) > 1 else ' ' - channellist += ', '.join(arguments.channels) - - print('Listening on channel' + channellist + ' for IU events of ', end='') + # Check whether the specified event_types are valid + if arguments.event_types is not None: + for et in arguments.event_types: + if et.upper() not in ['ADDED', 'MESSAGE', 'UPDATED', 'LINKSUPDATED', 'COMMITTED']: + print('ERROR: "{et}" is not a valid IPAACA event type.'.format(et=et.upper())) + exit(code=1) + buffers[channel].register_handler( + iu_event_handler, + for_event_types=[et.upper() for et in arguments.event_types] if arguments.event_types is not None else None) + + # Tell user what we are doing + print('ipaaca-iu-sniffer listening') + print(' * on channel(s): ' + ', '.join(arguments.channels)) + print(' * for event type(s): ', end='') + if arguments.event_types is None: + print('any') + else: + print(', '.join([highlight_if_color(et.upper(), event_type_color(et.upper())) for et in arguments.event_types])) + print(' * for category/ies', end='') if arguments.categories == ['']: - print('any category ...') + print(': any') else: if arguments.regex: - print('whose category matches one of the regexes:') - else: - print('categories:') - print('\t' + ', '.join(arguments.categories)) - print('') + print(' that match the regex', end='') + print(': ' + ', '.join(arguments.categories)) + + # Wait for the user to kill the sniffer try: while True: time.sleep(1) except KeyboardInterrupt: pass - - if platform.system() == 'Windows': - os._exit(0) - else: - sys.exit(0) - + exit(code=0)