From ea048332b96921eaa16be911daca427ebf5e4293 Mon Sep 17 00:00:00 2001 From: maxliu2001 Date: Fri, 16 Jun 2023 18:01:02 +0000 Subject: [PATCH] removed run wrapped and configured sudo roles for rpm and deb --- .../bssidscanner/Makefile | 1 - .../bssidscanner/duration | 2 +- pscheduler-tool-bssidscanner/bssidscanner/run | 126 +++++++++++++++- .../bssidscanner/run-wrapped | 125 ---------------- .../unibuild-packaging/deb/sudoers | 10 ++ .../rpm/pscheduler-tool-bssidscanner.spec | 17 +++ pscheduler-tool-umichwpa/umichwpa/run | 134 +++++++++++------- 7 files changed, 235 insertions(+), 180 deletions(-) delete mode 100755 pscheduler-tool-bssidscanner/bssidscanner/run-wrapped create mode 100644 pscheduler-tool-bssidscanner/bssidscanner/unibuild-packaging/deb/sudoers diff --git a/pscheduler-tool-bssidscanner/bssidscanner/Makefile b/pscheduler-tool-bssidscanner/bssidscanner/Makefile index bd365aae0..07ff198fe 100644 --- a/pscheduler-tool-bssidscanner/bssidscanner/Makefile +++ b/pscheduler-tool-bssidscanner/bssidscanner/Makefile @@ -11,7 +11,6 @@ FILES=\ merged-results \ participant-data \ run \ - run-wrapped install: $(FILES) ifndef DESTDIR diff --git a/pscheduler-tool-bssidscanner/bssidscanner/duration b/pscheduler-tool-bssidscanner/bssidscanner/duration index 2612f43f1..50595669f 100644 --- a/pscheduler-tool-bssidscanner/bssidscanner/duration +++ b/pscheduler-tool-bssidscanner/bssidscanner/duration @@ -19,7 +19,7 @@ json = pscheduler.json_load(exit_on_error=True); timeout_iso = json.get("timeout", "PT10S") -timeout = pscheduler.iso8601_as_timedelta(timeout_iso)+datetime.timedelta(seconds=2) +timeout = pscheduler.iso8601_as_timedelta(timeout_iso)+datetime.timedelta(seconds=1) pscheduler.succeed_json({ "duration": pscheduler.timedelta_as_iso8601( timeout ) diff --git a/pscheduler-tool-bssidscanner/bssidscanner/run b/pscheduler-tool-bssidscanner/bssidscanner/run index 3b8deca60..4201790a3 100755 --- a/pscheduler-tool-bssidscanner/bssidscanner/run +++ b/pscheduler-tool-bssidscanner/bssidscanner/run @@ -1,4 +1,126 @@ -#!/bin/sh -e +#!/usr/bin/env python3 -exec sudo "$(dirname $0)/run-wrapped" +# +# Development Order #5: +# +# This is the meat and bones of the tool, where the actual desired +# commands or operation will be run. The results are then recorded +# and added to the 'results' JSON data, which will then be sent +# back to the test. Both system and api are able to be used here. +# +import select +from os import getpid, makedirs, unlink, access, R_OK, system, listdir, path +import datetime +import pscheduler +# import subprocess +import time + +#temp file preserved between consecutive runs but not reboots +WPA_CONFIG_PATH = '/tmp/wpa_supplicant.conf' +#initializes only when wpa_supplicant starts +WPA_CTRL_IFACE_BASE = '/var/run/wpa_supplicant' +ssid_set = set() + +# parse config +pscheduler_input = pscheduler.json_load(exit_on_error=True) +interface = pscheduler_input['test']['spec'].get('interface') +get_ssid = pscheduler_input['test']['spec'].get('ssid', None) +ssid_set = set(get_ssid.split(',')) if get_ssid else None +duration_iso = pscheduler_input['test']['spec'].get('duration', 'PT5S') +timeout_iso = pscheduler_input['test']['spec'].get('timeout', 'PT10S') +timeout = pscheduler.timedelta_as_seconds(pscheduler.iso8601_as_timedelta(timeout_iso)) +duration = pscheduler.timedelta_as_seconds(pscheduler.iso8601_as_timedelta(duration_iso)) +start_time = datetime.datetime.now() +error = '' +diags = '' +ssid_list = [] +dir_path = path.dirname(WPA_CONFIG_PATH) + +# check if interface already exists +status, res, err = pscheduler.run_program(['wpa_cli', 'status']) +if status: + # create config file and start wpa_supplicant + # if not path.exists(dir_path): + # makedirs(dir_path) + with open(WPA_CONFIG_PATH, 'w') as f: + f.write('ctrl_interface='+WPA_CTRL_IFACE_BASE+'\n') + f.write('update_config=1\n') + f.write('p2p_disabled=1\n') + status, out, err = pscheduler.run_program(['wpa_supplicant','-Dnl80211','-B','-i',interface,'-c',WPA_CONFIG_PATH]) + if status: + pscheduler.succeed_json( { + 'succeeded': False, + 'diags': out, + 'error': 'failed to initialize interface', + 'result': None + }) + +# run wpa_cli +start = datetime.datetime.now() +status, res, err = pscheduler.run_program(['wpa_cli', 'scan']) +if not status: + status, res, err = pscheduler.run_program(['wpa_cli', 'scan_result']) +else: + pscheduler.succeed_json( { + 'succeeded': False, + 'diags': res, + 'error': 'wpa_cli scan failed', + 'result': None + } ) + + +result = res.split('\n') + +# account for automatic scanning interval of cli +while len(result) <= 3: + status, res, err = pscheduler.run_program(['wpa_cli', 'scan_result']) + result = res.split('\n') + time.sleep(0.3) + +for i in range(2, len(result)): + line = result[i].split('\t') + if len(line) == 1: + break + elif len(line) == 4: + bssid, freq, signal, flags = line + elif len(line) == 5: + bssid, freq, signal, flags, ssid = line + + if not ssid_set or ssid in ssid_set: + # retrieve prev ssid if ssid is empty + if ssid == '': + ssid = ssid_list[-1]['ssid'] + ssid_list.append({ + 'ssid': ssid, + 'bssid': bssid, + 'freq': int(freq), + 'signal': int(signal), + 'flags': flags + }) +end_time = datetime.datetime.now() + +# Check for empty result +if len(ssid_list) == 0: + pscheduler.succeed_json( { + 'succeeded': False, + 'diags': '', + 'error': 'scan completed but returned empty result', + 'result': None + } ) + +# Organize results into json data +results = { + 'succeeded': True, + 'result': { + 'schema': 1, + 'time': pscheduler.timedelta_as_iso8601(end_time - start_time), + 'succeeded': True, + 'ssid_list': ssid_list + }, + 'error': error, + 'diags': diags +} + + +pscheduler.succeed_json(results) diff --git a/pscheduler-tool-bssidscanner/bssidscanner/run-wrapped b/pscheduler-tool-bssidscanner/bssidscanner/run-wrapped deleted file mode 100755 index c10b55ec6..000000000 --- a/pscheduler-tool-bssidscanner/bssidscanner/run-wrapped +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/env python3 - -# -# Development Order #5: -# -# This is the meat and bones of the tool, where the actual desired -# commands or operation will be run. The results are then recorded -# and added to the 'results' JSON data, which will then be sent -# back to the test. Both system and api are able to be used here. -# - -import select -from os import getpid, makedirs, unlink, access, R_OK, system, listdir, path -import datetime -import pscheduler -# import subprocess -import time - -#temp file preserved between consecutive runs but not reboots -WPA_CONFIG_PATH = '/tmp/wpa_supplicant/wpa_supplicant.conf' -#initializes only when wpa_supplicant starts -WPA_CTRL_IFACE_BASE = '/var/run/wpa_supplicant' -ssid_set = set() - -# parse config -pscheduler_input = pscheduler.json_load(exit_on_error=True) -interface = pscheduler_input['test']['spec'].get('interface') -get_ssid = pscheduler_input['test']['spec'].get('ssid', None) -ssid_set = set(get_ssid.split(',')) if get_ssid else None -duration_iso = pscheduler_input['test']['spec'].get('duration', 'PT5S') -timeout_iso = pscheduler_input['test']['spec'].get('timeout', 'PT10S') -timeout = pscheduler.timedelta_as_seconds(pscheduler.iso8601_as_timedelta(timeout_iso)) -duration = pscheduler.timedelta_as_seconds(pscheduler.iso8601_as_timedelta(duration_iso)) -start_time = datetime.datetime.now() -error = '' -diags = '' -ssid_list = [] -dir_path = path.dirname(WPA_CONFIG_PATH) - -# check if interface already exists -if not access(f'{WPA_CTRL_IFACE_BASE}/{interface}', R_OK): - #create config file and start wpa_supplicant - if not path.exists(dir_path): - makedirs(dir_path) - with open(WPA_CONFIG_PATH, 'w') as f: - f.write('ctrl_interface='+WPA_CTRL_IFACE_BASE+'\r\n') - f.write('update_config=1\r\n') - f.write('p2p_disabled=1\r\n') - status, out, err = pscheduler.run_program(['wpa_supplicant','-Dnl80211','-B','-i',interface,'-c',WPA_CONFIG_PATH]) - if status: - pscheduler.succeed_json( { - 'succeeded': False, - 'diags': '', - 'error': 'failed to initialize interface', - 'result': None - } ) - -# run wpa_cli -start = datetime.datetime.now() -status, res, err = pscheduler.run_program(['wpa_cli', 'scan']) -if res.split('\n')[1] == 'OK': - status, res, err = pscheduler.run_program(['wpa_cli', 'scan_result']) -else: - pscheduler.succeed_json( { - 'succeeded': False, - 'diags': '', - 'error': 'wpa_cli scan failed', - 'result': None - } ) - - -result = res.split('\n') - -# account for automatic scanning interval of cli -while len(result) <= 3: - status, res, err = pscheduler.run_program(['wpa_cli', 'scan_result']) - result = res.split('\n') - time.sleep(0.3) - -for i in range(2, len(result)): - line = result[i].split('\t') - if len(line) == 1: - break - elif len(line) == 4: - bssid, freq, signal, flags = line - elif len(line) == 5: - bssid, freq, signal, flags, ssid = line - - if not ssid_set or ssid in ssid_set: - # retrieve prev ssid if ssid is empty - if ssid == '': - ssid = ssid_list[-1]['ssid'] - ssid_list.append({ - 'ssid': ssid, - 'bssid': bssid, - 'freq': int(freq), - 'signal': int(signal), - 'flags': flags - }) -end_time = datetime.datetime.now() - -# Check for empty result -if len(ssid_list) == 0: - pscheduler.succeed_json( { - 'succeeded': False, - 'diags': '', - 'error': 'scan completed but returned empty result', - 'result': None - } ) - -# Organize results into json data -results = { - 'succeeded': True, - 'result': { - 'schema': 1, - 'time': pscheduler.timedelta_as_iso8601(end_time - start_time), - 'succeeded': True, - 'ssid_list': ssid_list - }, - 'error': error, - 'diags': diags -} - - -pscheduler.succeed_json(results) diff --git a/pscheduler-tool-bssidscanner/bssidscanner/unibuild-packaging/deb/sudoers b/pscheduler-tool-bssidscanner/bssidscanner/unibuild-packaging/deb/sudoers new file mode 100644 index 000000000..af26e32ea --- /dev/null +++ b/pscheduler-tool-bssidscanner/bssidscanner/unibuild-packaging/deb/sudoers @@ -0,0 +1,10 @@ +# +# pscheduler-tool-bssidscanner +# +Cmnd_Alias PSCHEDULER_WPA_SUPPLICANT = /usr/sbin/wpa_supplicant +pscheduler ALL = (root) NOPASSWD: PSCHEDULER_WPA_SUPPLICANT +Defaults!PSCHEDULER_WPA_SUPPLICANT !requiretty + +Cmnd_Alias PSCHEDULER_WPA_CLI = /usr/sbin/wpa_cli +pscheduler ALL = (root) NOPASSWD: PSCHEDULER_WPA_CLI +Defaults!PSCHEDULER_WPA_CLI !requiretty diff --git a/pscheduler-tool-bssidscanner/bssidscanner/unibuild-packaging/rpm/pscheduler-tool-bssidscanner.spec b/pscheduler-tool-bssidscanner/bssidscanner/unibuild-packaging/rpm/pscheduler-tool-bssidscanner.spec index 87a066e03..fb92bacc0 100644 --- a/pscheduler-tool-bssidscanner/bssidscanner/unibuild-packaging/rpm/pscheduler-tool-bssidscanner.spec +++ b/pscheduler-tool-bssidscanner/bssidscanner/unibuild-packaging/rpm/pscheduler-tool-bssidscanner.spec @@ -44,6 +44,23 @@ make \ DESTDIR=$RPM_BUILD_ROOT/%{dest} \ install +# Enable sudo for this tool +WPA_SUPP=$(command -v wpa_supplicant) +WPA_CLI=$(command -v wpa_cli) + +mkdir -p $RPM_BUILD_ROOT/%{_pscheduler_sudoersdir} +cat > $RPM_BUILD_ROOT/%{_pscheduler_sudoersdir}/%{name} <