diff --git a/pscheduler-test-wifibssid/wifibssid/result-format b/pscheduler-test-wifibssid/wifibssid/result-format
index e304db657..09b04a534 100755
--- a/pscheduler-test-wifibssid/wifibssid/result-format
+++ b/pscheduler-test-wifibssid/wifibssid/result-format
@@ -46,13 +46,13 @@ if format == 'text/plain':
print("")
print(entry["ssid"] + ":")
print(f' Signal: {entry["signal"]}')
- print(f' Address: {entry["address"]}')
- print(f' Frequency: {entry["frequency"]}')
- print(f' Quality: {entry["quality"]}')
- print(f' Bitrates: {entry["bitrates"]}')
- print(f' Encrypted: {entry["encrypted"]}')
- print(f' Channel: {entry["channel"]}')
- print(f' Mode: {entry["mode"]}')
+ print(f' Address: {entry["bssid"]}')
+ print(f' Frequency: {entry["freq"]}')
+ # print(f' Quality: {entry["quality"]}')
+ # print(f' Bitrates: {entry["bitrates"]}')
+ # print(f' Encrypted: {entry["encrypted"]}')
+ # print(f' Channel: {entry["channel"]}')
+ print(f' Mode: {entry["flags"]}')
print("")
elif format == 'text/html':
@@ -68,13 +68,13 @@ elif format == 'text/html':
for entry in result['ssid_list']:
print(f'
SSID | {entry["ssid"]} |
')
print(f' Signal | {entry["signal"]} |
')
- print(f' Address | {entry["address"]} |
')
- print(f' Frequency | {entry["frequency"]} |
')
- print(f' Quality | {entry["quality"]} |
')
- print(f' Bitrates | {entry["bitrates"]} |
')
- print(f' Encrypted | {entry["signal"]} |
')
- print(f' Channel | {entry["channel"]} |
')
- print(f' Mode | {entry["mode"]} |
')
+ print(f' Address | {entry["bssid"]} |
')
+ print(f' Frequency | {entry["freq"]} |
')
+ # print(f' Quality | {entry["quality"]} |
')
+ # print(f' Bitrates | {entry["bitrates"]} |
')
+ # print(f' Encrypted | {entry["signal"]} |
')
+ # print(f' Channel | {entry["channel"]} |
')
+ print(f' Mode | {entry["flags"]} |
')
print('')
diff --git a/pscheduler-test-wifibssid/wifibssid/validate.py b/pscheduler-test-wifibssid/wifibssid/validate.py
index c82f4c04f..cf8df1214 100644
--- a/pscheduler-test-wifibssid/wifibssid/validate.py
+++ b/pscheduler-test-wifibssid/wifibssid/validate.py
@@ -51,8 +51,7 @@
},
# If listed here, these parameters MUST be in the test spec.
"required": [
- "interface",
- "ssid",
+ "interface"
],
# Treat other properties as acceptable. This should
# ALWAYS be false.
diff --git a/pscheduler-tool-bssidscanner/bssidscanner/Makefile b/pscheduler-tool-bssidscanner/bssidscanner/Makefile
index 07ff198fe..bd365aae0 100644
--- a/pscheduler-tool-bssidscanner/bssidscanner/Makefile
+++ b/pscheduler-tool-bssidscanner/bssidscanner/Makefile
@@ -11,6 +11,7 @@ FILES=\
merged-results \
participant-data \
run \
+ run-wrapped
install: $(FILES)
ifndef DESTDIR
diff --git a/pscheduler-tool-bssidscanner/bssidscanner/run b/pscheduler-tool-bssidscanner/bssidscanner/run
index f1c8423f3..3b8deca60 100755
--- a/pscheduler-tool-bssidscanner/bssidscanner/run
+++ b/pscheduler-tool-bssidscanner/bssidscanner/run
@@ -1,119 +1,4 @@
-#!/usr/bin/env python3
+#!/bin/sh -e
-#
-# 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 datetime
-import subprocess
-import json
-import sys
-import time
-import argparse
-import time
-from wifi import Cell #make sure that you have pip installed wifi
-
-import pscheduler
-
-# from stdin
-input = pscheduler.json_load(exit_on_error=True)
-
-# Take input from test spec
-try:
- interface = input['test']['spec']['interface']
- ssid = input['test']['spec']['ssid']
-except KeyError:
- pscheduler.fail('Missing data in input')
-
-# convert the comma separated ssids to a list
-ssid = list(ssid.split(','))
-
-duration = input['test']['spec'].get('duration', 'PT5S')
-duration = pscheduler.timedelta_as_seconds( pscheduler.iso8601_as_timedelta(duration) )
-timeout_iso = input['test']['spec'].get('timeout', 'PT10S')
-timeout = pscheduler.timedelta_as_seconds( pscheduler.iso8601_as_timedelta(timeout_iso) )
-start_time = datetime.datetime.now()
-succeeded = False
-error = ''
-diags = ''
-
-# Run the actual task here:
-def get_all_bssids(interface):
- """
- Scan the given interface for all bssids
- Return a list of all bssids
- """
- start_time = time.time()
- cells = Cell.all(interface) # Specify interface to scan on
- wifi_list = []
- for cell in cells:
- bssid = {}
- bssid['ssid'] = cell.ssid
- bssid['signal'] = cell.signal
- bssid['address'] = cell.address
- bssid['frequency'] = pscheduler.si_as_number(cell.frequency[:-2])
- quality_num,quality_denom = cell.quality.split('/')
- bssid['quality'] = float(quality_num) / float(quality_denom)
- bssid['bitrates'] = sorted(map(lambda v : pscheduler.si_as_number(v[:-3]), cell.bitrates))
- bssid['encrypted'] = cell.encrypted
- bssid['channel'] = cell.channel
- bssid['mode'] = cell.mode
- wifi_list.append(bssid)
-
- end_time = time.time()
- elapsed_time = end_time - start_time
- log_msg = "Scan finished in " + str(elapsed_time)
- return wifi_list, elapsed_time
-
-"""
-Scan on the given interface
-Output a list of all bssids in json format with the given ssid
-"""
-all_bssids, elapsed_time = get_all_bssids(interface)
-ssid_list = []
-
-# Check complete list for matching ssids
-for bssid in all_bssids:
- #if no ssids were given then append all the ssids
- if not ssid:
- ssid_list.append(bssid)
- else:
- #if ssid/ssids were given then only append those
- if bssid['ssid'] in ssid:
- ssid_list.append(bssid)
-
-succeeded = True
-
-# IMPORTANT NOTE: This code puts the process to sleep until the
-# scheduled start time has arrived. It should be placed after all
-# preparatory code has been executed and immediately before the tool
-# is invoked (for plugins that run other programs) or any activity
-# that does a measurement (for those that don't).
-
-try:
- pscheduler.sleep_until(input['schedule']['start'])
-except KeyError:
- pscheduler.fail("Unable to find start time in input")
-
-
-end_time = datetime.datetime.now()
-
-# Organize results into json data
-results = {
- 'succeeded': succeeded,
- 'result': {
- 'schema': 1,
- 'time': pscheduler.timedelta_as_iso8601( end_time - start_time),
- 'succeeded': succeeded,
- 'ssid_list': ssid_list
- },
- 'error': error,
- 'diags': diags }
-
-pscheduler.succeed_json(results)
+exec sudo "$(dirname $0)/run-wrapped"
diff --git a/pscheduler-tool-bssidscanner/bssidscanner/run-wrapped b/pscheduler-tool-bssidscanner/bssidscanner/run-wrapped
new file mode 100755
index 000000000..c10b55ec6
--- /dev/null
+++ b/pscheduler-tool-bssidscanner/bssidscanner/run-wrapped
@@ -0,0 +1,125 @@
+#!/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/run.py b/pscheduler-tool-bssidscanner/bssidscanner/run.py
deleted file mode 100644
index e69de29bb..000000000