From d245cfe3794496f2d1341b22f5af439b62b8ec3e Mon Sep 17 00:00:00 2001
From: Hendrik Buschmeier <hbuschme@uni-bielefeld.de>
Date: Thu, 26 Nov 2015 15:31:59 +0100
Subject: [PATCH] Updated ipaaca-iu-sniffer:

* Filtering by IU event type.
* Description of sniffer arguments after startup now prettier.
---
 ipaacatools/scripts/ipaaca-iu-sniffer | 61 ++++++++++++++++++---------
 1 file changed, 40 insertions(+), 21 deletions(-)

diff --git a/ipaacatools/scripts/ipaaca-iu-sniffer b/ipaacatools/scripts/ipaaca-iu-sniffer
index bc8da01..7167c64 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)
-- 
GitLab