| import subprocess |
| import fnmatch |
| import os |
| import sys |
| import psutil |
| import socket |
| |
| def network_interface_should_exist(name): |
| if name not in psutil.net_if_addrs(): |
| raise Exception('Network interface {} not found.'.format(name)) |
| |
| def network_interface_should_be_up(name): |
| network_interface_should_exist(name) |
| if sys.platform == "linux": # psutil marks tap interface as down, erroneously |
| proc = subprocess.Popen(['ip', 'addr', 'show', name, 'up'], stdout=subprocess.PIPE) |
| (output, err) = proc.communicate() |
| exit_code = proc.wait() |
| if exit_code != 0 or len(output) == 0: |
| raise Exception('Network interface {} is not up.'.format(name)) |
| else: |
| if not (name in psutil.net_if_stats() and psutil.net_if_stats()[name].isup): |
| raise Exception('Network interface {} is not up.'.format(name)) |
| |
| def network_interface_should_have_address(name, address): |
| network_interface_should_exist(name) |
| if not (sys.platform == "win32" or sys.platform == "cygwin"): |
| # On Windows, the status of TAP interface depends on the |
| # signals sent to the device file using the DeviceIoControl |
| # function from Win32 API. For this reason it is the Renode |
| # that sets the up/down status instead - and as such for the |
| # automated testing this check is skipped on Windows. |
| network_interface_should_be_up(name) |
| ifaddresses = psutil.net_if_addrs()[name] |
| addresses = [] |
| for addr in ifaddresses: |
| if addr.family == socket.AF_INET: |
| addresses.append(addr.address) |
| if address not in addresses: |
| raise Exception('Network interface {0} does not have address {1}.'.format(name, address)) |
| |
| def list_files_in_directory_recursively(directory_name, pattern, excludes=None): |
| files = [] |
| for root, dirnames, filenames in os.walk(directory_name, topdown=True): |
| if excludes and os.path.basename(root) in excludes: |
| # this is an `os.walk` trick: when using `topdown=True` |
| # you can modify `dirnames` in place to tell `os.walk` |
| # which folders to visit; in this case - visit nothing |
| dirnames[:] = [] |
| continue |
| |
| for filename in fnmatch.filter(filenames, pattern): |
| files.append(os.path.join(root, filename)) |
| return files |