forked from osmocom/wireshark
251 lines
7.6 KiB
Python
251 lines
7.6 KiB
Python
#
|
|
# -*- coding: utf-8 -*-
|
|
# Wireshark tests
|
|
# By Gerald Combs <gerald@wireshark.org>
|
|
#
|
|
# Ported from a set of Bash scripts which were copyright 2005 Ulf Lamping
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
#
|
|
'''Configuration'''
|
|
|
|
import os
|
|
import os.path
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
|
|
commands = (
|
|
'capinfos',
|
|
'dumpcap',
|
|
'mergecap',
|
|
'rawshark',
|
|
'text2pcap',
|
|
'tshark',
|
|
'wireshark',
|
|
)
|
|
|
|
can_capture = False
|
|
capture_interface = None
|
|
|
|
# Our executables
|
|
program_path = None
|
|
# Strings
|
|
cmd_capinfos = None
|
|
cmd_dumpcap = None
|
|
cmd_mergecap = None
|
|
cmd_rawshark = None
|
|
cmd_tshark = None
|
|
cmd_text2pcap = None
|
|
cmd_wireshark = None
|
|
# Arrays
|
|
args_ping = None
|
|
|
|
have_lua = False
|
|
have_nghttp2 = False
|
|
have_kerberos = False
|
|
have_libgcrypt17 = False
|
|
|
|
test_env = None
|
|
program_path = None
|
|
home_path = None
|
|
conf_path = None
|
|
custom_profile_path = None
|
|
custom_profile_name = 'Custom Profile'
|
|
|
|
this_dir = os.path.dirname(__file__)
|
|
baseline_dir = os.path.join(this_dir, 'baseline')
|
|
capture_dir = os.path.join(this_dir, 'captures')
|
|
config_dir = os.path.join(this_dir, 'config')
|
|
key_dir = os.path.join(this_dir, 'keys')
|
|
lua_dir = os.path.join(this_dir, 'lua')
|
|
tools_dir = os.path.join(this_dir, '..', 'tools')
|
|
|
|
def canCapture():
|
|
# XXX This appears to be evaluated at the wrong time when called
|
|
# from a unittest.skipXXX decorator.
|
|
return can_capture and capture_interface is not None
|
|
|
|
def setCanCapture(new_cc):
|
|
can_capture = new_cc
|
|
|
|
def setCaptureInterface(iface):
|
|
global capture_interface
|
|
setCanCapture(True)
|
|
capture_interface = iface
|
|
|
|
def canMkfifo():
|
|
return not sys.platform.startswith('win32')
|
|
|
|
def canDisplay():
|
|
if sys.platform.startswith('win32') or sys.platform.startswith('darwin'):
|
|
return True
|
|
# Qt requires XKEYBOARD and Xrender, which Xvnc doesn't provide.
|
|
return False
|
|
|
|
def getTsharkInfo():
|
|
global have_lua
|
|
global have_nghttp2
|
|
global have_kerberos
|
|
global have_libgcrypt17
|
|
have_lua = False
|
|
have_nghttp2 = False
|
|
have_kerberos = False
|
|
have_libgcrypt17 = False
|
|
try:
|
|
tshark_v_blob = str(subprocess.check_output((cmd_tshark, '--version'), stderr=subprocess.PIPE))
|
|
tshark_v = ' '.join(tshark_v_blob.splitlines())
|
|
if re.search('with +Lua', tshark_v):
|
|
have_lua = True
|
|
if re.search('with +nghttp2', tshark_v):
|
|
have_nghttp2 = True
|
|
if re.search('(with +MIT +Kerberos|with +Heimdal +Kerberos)', tshark_v):
|
|
have_kerberos = True
|
|
gcry_m = re.search('with +Gcrypt +([0-9]+\.[0-9]+)', tshark_v)
|
|
have_libgcrypt17 = gcry_m and float(gcry_m.group(1)) >= 1.7
|
|
except:
|
|
pass
|
|
|
|
def getDefaultCaptureInterface():
|
|
'''Choose a default capture interface for our platform. Currently Windows only.'''
|
|
global capture_interface
|
|
if capture_interface:
|
|
return
|
|
if cmd_dumpcap is None:
|
|
return
|
|
if not sys.platform.startswith('win32'):
|
|
return
|
|
try:
|
|
dumpcap_d_data = subprocess.check_output((cmd_dumpcap, '-D'), stderr=subprocess.PIPE)
|
|
if sys.version_info[0] >= 3:
|
|
dumpcap_d_stdout = dumpcap_d_data.decode('UTF-8', 'replace')
|
|
else:
|
|
dumpcap_d_stdout = unicode(dumpcap_d_data, 'UTF-8', 'replace')
|
|
for d_line in dumpcap_d_stdout.splitlines():
|
|
iface_m = re.search('(\d+)\..*(Ethernet|Network Connection|VMware|Intel)', d_line)
|
|
if iface_m:
|
|
capture_interface = iface_m.group(1)
|
|
break
|
|
except:
|
|
pass
|
|
|
|
def getPingCommand():
|
|
'''Return an argument list required to ping www.wireshark.org for 60 seconds.'''
|
|
global args_ping
|
|
# XXX The shell script tests swept over packet sizes from 1 to 240 every 0.25 seconds.
|
|
if sys.platform.startswith('win32'):
|
|
# XXX Check for psping? https://docs.microsoft.com/en-us/sysinternals/downloads/psping
|
|
args_ping = ('ping', '-n', '60', '-l', '100', 'www.wireshark.org')
|
|
elif sys.platform.startswith('linux') or sys.platform.startswith('freebsd'):
|
|
args_ping = ('ping', '-c', '240', '-s', '100', '-i', '0.25', 'www.wireshark.org')
|
|
elif sys.platform.startswith('darwin'):
|
|
args_ping = ('ping', '-c', '1', '-g', '1', '-G', '240', '-i', '0.25', 'www.wireshark.org')
|
|
# XXX Other BSDs, Solaris, etc
|
|
|
|
def setProgramPath(path):
|
|
global program_path
|
|
program_path = path
|
|
retval = True
|
|
dotexe = ''
|
|
if sys.platform.startswith('win32'):
|
|
dotexe = '.exe'
|
|
for cmd in commands:
|
|
cmd_var = 'cmd_' + cmd
|
|
cmd_path = os.path.normpath(os.path.join(path, cmd + dotexe))
|
|
if not os.path.exists(cmd_path) or not os.access(cmd_path, os.X_OK):
|
|
cmd_path = None
|
|
program_path = None
|
|
retval = False
|
|
globals()[cmd_var] = cmd_path
|
|
getTsharkInfo()
|
|
getDefaultCaptureInterface()
|
|
setUpHostFiles()
|
|
return retval
|
|
|
|
def testEnvironment():
|
|
return test_env
|
|
|
|
def setUpTestEnvironment():
|
|
global home_path
|
|
global conf_path
|
|
global custom_profile_path
|
|
global test_env
|
|
|
|
# Create our directories
|
|
test_confdir = tempfile.mkdtemp(prefix='wireshark-tests.')
|
|
home_path = os.path.join(test_confdir, 'home')
|
|
if sys.platform.startswith('win32'):
|
|
home_env = 'APPDATA'
|
|
conf_path = os.path.join(home_path, 'Wireshark')
|
|
else:
|
|
home_env = 'HOME'
|
|
conf_path = os.path.join(home_path, '.config', 'wireshark')
|
|
os.makedirs(conf_path)
|
|
# Test spaces while we're here.
|
|
custom_profile_path = os.path.join(conf_path, 'profiles', custom_profile_name)
|
|
os.makedirs(custom_profile_path)
|
|
|
|
# Populate our UAT files
|
|
uat_files = [
|
|
'80211_keys',
|
|
'dtlsdecrypttablefile',
|
|
'esp_sa',
|
|
'ssl_keys',
|
|
'c1222_decryption_table',
|
|
'ikev1_decryption_table',
|
|
'ikev2_decryption_table',
|
|
]
|
|
for uat in uat_files:
|
|
setUpUatFile(uat)
|
|
|
|
# Set up our environment
|
|
test_env = os.environ.copy()
|
|
test_env['WIRESHARK_RUN_FROM_BUILD_DIRECTORY'] = '1'
|
|
test_env['TZ'] = 'UTC'
|
|
test_env[home_env] = home_path
|
|
|
|
def setUpUatFile(conf_file):
|
|
global home_path
|
|
global conf_path
|
|
if home_path is None or conf_path is None:
|
|
setUpTestEnvironment()
|
|
template = os.path.join(os.path.dirname(__file__), 'config', conf_file) + '.tmpl'
|
|
with open(template, 'r') as tplt_fd:
|
|
tplt_contents = tplt_fd.read()
|
|
tplt_fd.close()
|
|
key_dir_path = os.path.join(key_dir, '')
|
|
# uat.c replaces backslashes...
|
|
key_dir_path = key_dir_path.replace('\\', '\\x5c')
|
|
cf_contents = tplt_contents.replace('TEST_KEYS_DIR', key_dir_path)
|
|
out_file = os.path.join(conf_path, conf_file)
|
|
with open(out_file, 'w') as cf_fd:
|
|
cf_fd.write(cf_contents)
|
|
cf_fd.close()
|
|
|
|
def setUpHostFiles():
|
|
global program_path
|
|
global conf_path
|
|
global custom_profile_path
|
|
if program_path is None:
|
|
return
|
|
if conf_path is None or custom_profile_path is None:
|
|
setUpTestEnvironment()
|
|
bundle_path = os.path.join(program_path, 'Wireshark.app', 'Contents', 'MacOS')
|
|
if os.path.isdir(bundle_path):
|
|
global_path = bundle_path
|
|
else:
|
|
global_path = program_path
|
|
hosts_path_pfx = os.path.join(this_dir, 'hosts.')
|
|
shutil.copyfile(hosts_path_pfx + 'global', os.path.join(global_path, 'hosts'))
|
|
shutil.copyfile(hosts_path_pfx + 'personal', os.path.join(conf_path, 'hosts'))
|
|
shutil.copyfile(hosts_path_pfx + 'custom', os.path.join(custom_profile_path, 'hosts'))
|
|
|
|
if sys.platform.startswith('win32') or sys.platform.startswith('darwin'):
|
|
can_capture = True
|
|
|
|
# Initialize ourself.
|
|
getPingCommand()
|
|
setProgramPath(os.path.curdir)
|