#!/usr/bin/env python3 # Wireshark - Network traffic analyzer # By Gerald Combs # Copyright 1998 Gerald Combs # # SPDX-License-Identifier: GPL-2.0-or-later import sys import os import signal import argparse # Run battery of tests on one or more dissectors. # For text colouring/highlighting. class bcolors: HEADER = '\033[95m' OKBLUE = '\033[94m' OKGREEN = '\033[92m' ADDED = '\033[45m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' # Try to exit soon after Ctrl-C is pressed. should_exit = False def signal_handler(sig, frame): global should_exit should_exit = True print('You pressed Ctrl+C - exiting') signal.signal(signal.SIGINT, signal_handler) # Command-line args parser = argparse.ArgumentParser(description="Run gamut of tests on dissector(s)") parser.add_argument('--file', action='append', help='specify individual dissector file to test') parser.add_argument('--file-list', action='store', help='file with list of dissectors') parser.add_argument('--build-folder', action='store', help='build folder') args = parser.parse_args() if not args.file and not args.file_list: print('Need to specify --file or --file-list') exit(1) # TODO: verify build-folder if set. # Get list of files to check. dissectors = [] # Individually-selected files if args.file: for f in args.file: if not os.path.isfile(f): print('Chosen file', f, 'does not exist.') exit(1) else: dissectors.append(f) # List of dissectors stored in a file if args.file_list: if not os.path.isfile(args.file_list): print('Dissector-list file', args.file_list, 'does not exist.') exit(1) else: with open(args.file_list, 'r') as f: contents = f.read().splitlines() for f in contents: if not os.path.isfile(f): print('Chosen file', f, 'does not exist.') exit(1) else: dissectors.append(f) # Tools that should be run on selected files. # Boolean arg is for whether build-dir is needed in order to run it. # 3rd is Windows support. tools = [ ('tools/delete_includes.py --folder .', True, True), ('tools/check_spelling.py', False, True), ('tools/check_tfs.py --check-value-strings', False, True), ('tools/check_typed_item_calls.py --all-checks', False, True), ('tools/check_static.py', True, False), ('tools/check_dissector_urls.py', False, True), ('tools/check_val_to_str.py', False, True), ('tools/cppcheck/cppcheck.sh', False, True), ('tools/checkhf.pl', False, True), ('tools/checkAPIs.pl', False, True), ('tools/fix-encoding-args.pl', False, True), ('tools/checkfiltername.pl', False, True) ] def run_check(tool, dissectors, python): # Create command-line with all dissectors included command = '' # Don't trust shebang on windows. if sys.platform.startswith('win'): if python: command += 'python.exe ' else: command += 'perl.exe ' command += tool[0] if tool[1]: command += ' --build-folder ' + args.build_folder for d in dissectors: # Add this dissector file to command-line args command += ((' --file' if python else '') + ' ' + d) # Run it print(bcolors.BOLD + command + bcolors.ENDC) os.system(command) # Run all checks on all of my dissectors. for tool in tools: if should_exit: exit(1) if ((not sys.platform.startswith('win') or tool[2]) and # Supported on this platform? (not tool[1] or (tool[1] and args.build_folder))): # Have --build-folder if needed? # Run it. run_check(tool, dissectors, tool[0].find('.py') != -1)