diff --git a/pscheduler-test-wifibssid/wifibssid/result-format b/pscheduler-test-wifibssid/wifibssid/result-format
index e304db657d..09b04a5346 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 c82f4c04f4..cf8df1214d 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/duration b/pscheduler-tool-bssidscanner/bssidscanner/duration
index 2612f43f1e..50595669fa 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 f1c8423f30..619baaec44 100755
--- a/pscheduler-tool-bssidscanner/bssidscanner/run
+++ b/pscheduler-tool-bssidscanner/bssidscanner/run
@@ -9,111 +9,115 @@
# 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 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
+# import subprocess
+import time
-# 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) )
+#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()
-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")
-
-
+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
+ 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','-D','nl80211','-B','-i',interface,'-c',WPA_CONFIG_PATH])
+ if status:
+ pscheduler.succeed_json( {
+ 'succeeded': False,
+ 'diags': out + ' ' + str(status) + ' ' + err,
+ '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': succeeded,
+ 'succeeded': True,
'result': {
'schema': 1,
- 'time': pscheduler.timedelta_as_iso8601( end_time - start_time),
- 'succeeded': succeeded,
+ 'time': pscheduler.timedelta_as_iso8601(end_time - start_time),
+ 'succeeded': True,
'ssid_list': ssid_list
},
'error': error,
- 'diags': diags }
+ 'diags': diags
+}
-pscheduler.succeed_json(results)
+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 e69de29bb2..0000000000
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 0000000000..af26e32eac
--- /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 87a066e035..ab4a4cba7b 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,24 @@ 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} <