diff --git a/front/plugins/README.md b/front/plugins/README.md index 16e35e6e..048d591c 100755 --- a/front/plugins/README.md +++ b/front/plugins/README.md @@ -458,7 +458,9 @@ Below are some general additional notes, when defining `params`: - `"type":""` - is used to specify the type of the params, currently only 2 supported (`sql`,`setting`). - `"type":"sql"` - will execute the SQL query specified in the `value` property. The sql query needs to return only one column. The column is flattened and separated by commas (`,`), e.g: `SELECT dev_MAC from DEVICES` -> `Internet,74:ac:74:ac:74:ac,44:44:74:ac:74:ac`. This is then used to replace the wildcards in the `CMD` setting. - `"type":"setting"` - The setting code name. A combination of the value from `unique_prefix` + `_` + `function` value, or otherwise the code name you can find in the Settings page under the Setting display name, e.g. `PIHOLE_RUN`. -- `"value" : "param_value"` - Needs to contain a setting code name or SQL query without wildcards. +- `"value": "param_value"` - Needs to contain a setting code name or SQL query without wildcards. +- `"timeoutMultiplier" : true` - used to indicate if the value should multiply the max timeout for the whole script run by the number of values in the given parameter. +- `"base64": true` - use base64 encoding to pass the value to the script (e.g. if there are spaces) > 🔎Example: @@ -466,20 +468,27 @@ Below are some general additional notes, when defining `params`: > ```json > { > "params" : [{ -> "name" : "macs", -> "type" : "sql", -> "value" : "SELECT dev_MAC from DEVICES" -> }, -> { -> "name" : "urls", -> "type" : "setting", -> "value" : "WEBMON_urls_to_check" -> }, -> { -> "name" : "internet_ip", -> "type" : "setting", -> "value" : "WEBMON_SQL_internet_ip" -> }] +> "name" : "ips", +> "type" : "sql", +> "value" : "SELECT dev_LastIP from DEVICES", +> "timeoutMultiplier" : true +> }, +> { +> "name" : "macs", +> "type" : "sql", +> "value" : "SELECT dev_MAC from DEVICES" +> }, +> { +> "name" : "timeout", +> "type" : "setting", +> "value" : "NMAP_RUN_TIMEOUT" +> }, +> { +> "name" : "args", +> "type" : "setting", +> "value" : "NMAP_ARGS", +> "base64" : true +> }] > } > ``` diff --git a/front/plugins/nmap_scan/script.py b/front/plugins/nmap_scan/script.py index 4f462686..2892b3b2 100755 --- a/front/plugins/nmap_scan/script.py +++ b/front/plugins/nmap_scan/script.py @@ -46,11 +46,11 @@ def main(): mylog('debug', ['[NMAP Scan] values.timeout: ', values.timeout]) mylog('debug', ['[NMAP Scan] values.args: ', values.args]) - argsDecoded = decodeBase64(values.args) + argsDecoded = decodeBase64(values.args[0].split('=b')[1]) mylog('debug', ['[NMAP Scan] argsDecoded: ', argsDecoded]) - entries = performNmapScan(values.ips.split('=')[1].split(','), values.macs.split('=')[1].split(',') , values.timeout.split('=')[1], argsDecoded) + entries = performNmapScan(values.ips[0].split('=')[1].split(','), values.macs[0].split('=')[1].split(',') , values.timeout[0].split('=')[1], argsDecoded) for entry in entries: @@ -91,8 +91,7 @@ def performNmapScan(deviceIPs, deviceMACs, timeoutSec, args): if len(deviceIPs) > 0: devTotal = len(deviceIPs) - - updateState(db,"Scan: Nmap") + mylog('verbose', ['[NMAP Scan] Scan: Nmap for max ', str(timeoutSec), 's ('+ str(round(int(timeoutSec) / 60, 1)) +'min) per device']) mylog('verbose', ["[NMAP Scan] Estimated max delay: ", (devTotal * int(timeoutSec)), 's ', '(', round((devTotal * int(timeoutSec))/60,1) , 'min)' ]) @@ -111,7 +110,7 @@ def performNmapScan(deviceIPs, deviceMACs, timeoutSec, args): try: # try runnning a subprocess with a forced (timeout) in case the subprocess hangs - output = subprocess.check_output (nmapArgs, universal_newlines=True, stderr=subprocess.STDOUT, timeout=(timeoutSec)) + output = subprocess.check_output (nmapArgs, universal_newlines=True, stderr=subprocess.STDOUT, timeout=(float(timeoutSec))) except subprocess.CalledProcessError as e: # An error occured, handle it mylog('none', ["[NMAP Scan] " ,e.output]) diff --git a/front/plugins/plugin_helper.py b/front/plugins/plugin_helper.py index 3f1d4d60..6e7cc900 100755 --- a/front/plugins/plugin_helper.py +++ b/front/plugins/plugin_helper.py @@ -1,5 +1,7 @@ from time import strftime import pytz +import sys +import base64 from datetime import datetime sys.path.append("/home/pi/pialert/front/plugins") @@ -32,15 +34,16 @@ timeZoneSetting = pialertConfigFile['TIMEZONE'] timeZone = pytz.timezone(timeZoneSetting) # ------------------------------------------------------------------- -def decodeBase64(input): +def decodeBase64(inputParamBase64): # Printing the input list to check its content. mylog('debug', ['[Plugins] Helper base64 input: ', input]) + print('[Plugins] Helper base64 input: ') + print(input) # Extract the base64-encoded subnet information from the first element - # The format of the element is assumed to be like 'param=b'. - inputParamBase64 = input.split('=b')[1] + # The format of the element is assumed to be like 'param=b'. # Printing the extracted base64-encoded information. mylog('debug', ['[Plugins] Helper base64 inputParamBase64: ', inputParamBase64])