Refactor script running to support long delays without blocking webservice

This commit is contained in:
Dave
2023-09-17 14:48:46 -05:00
parent 74ef11770b
commit 68b1262227
3 changed files with 54 additions and 29 deletions

View File

@@ -11,6 +11,7 @@ import time
import digitalio import digitalio
from board import * from board import *
import board import board
import duckyinpython
from duckyinpython import * from duckyinpython import *
if(board.board_id == 'raspberry_pi_pico_w'): if(board.board_id == 'raspberry_pi_pico_w'):
import wifi import wifi
@@ -56,7 +57,8 @@ if(progStatus == False):
# not in setup mode, inject the payload # not in setup mode, inject the payload
payload = selectPayload() payload = selectPayload()
print("Running ", payload) print("Running ", payload)
runScript(payload) #runScript(payload)
duckyinpython.fileToRun = payload
print("Done") print("Done")
else: else:
@@ -68,15 +70,16 @@ async def main_loop():
global led,button1 global led,button1
button_task = asyncio.create_task(monitor_buttons(button1)) button_task = asyncio.create_task(monitor_buttons(button1))
script_task = asyncio.create_task(runScriptTask())
if(board.board_id == 'raspberry_pi_pico_w'): if(board.board_id == 'raspberry_pi_pico_w'):
pico_led_task = asyncio.create_task(blink_pico_w_led(led)) pico_led_task = asyncio.create_task(blink_pico_w_led(led))
print("Starting Wifi") print("Starting Wifi")
startWiFi() startWiFi()
print("Starting Web Service") print("Starting Web Service")
webservice_task = asyncio.create_task(startWebService()) webservice_task = asyncio.create_task(startWebService())
await asyncio.gather(pico_led_task, button_task, webservice_task) await asyncio.gather(pico_led_task, button_task, webservice_task, script_task)
else: else:
pico_led_task = asyncio.create_task(blink_pico_led(led)) pico_led_task = asyncio.create_task(blink_pico_led(led))
await asyncio.gather(pico_led_task, button_task) await asyncio.gather(pico_led_task, button_task, script_task)
asyncio.run(main_loop()) asyncio.run(main_loop())

View File

@@ -80,8 +80,8 @@ def parseLine(line):
if(line[0:3] == "REM"): if(line[0:3] == "REM"):
# ignore ducky script comments # ignore ducky script comments
pass pass
elif(line[0:5] == "DELAY"): #elif(line[0:5] == "DELAY"):
time.sleep(float(line[6:])/1000) # time.sleep(float(line[6:])/1000)
elif(line[0:6] == "STRING"): elif(line[0:6] == "STRING"):
sendString(line[7:]) sendString(line[7:])
elif(line[0:5] == "PRINT"): elif(line[0:5] == "PRINT"):
@@ -133,26 +133,44 @@ def getProgrammingStatus():
defaultDelay = 0 defaultDelay = 0
def runScript(file): async def runScriptTask():
global defaultDelay global defaultDelay, fileToRun
print("starting runScript")
while True:
#print("Checking for file", fileToRun)
if fileToRun is not None:
duckyScriptPath = fileToRun
print("starting",duckyScriptPath)
with open(duckyScriptPath,"r",encoding='utf-8') as f:
duckyScriptPath = file previousLine = ""
try: for line in f:
f = open(duckyScriptPath,"r",encoding='utf-8') line = line.rstrip()
previousLine = "" if(line[0:6] == "REPEAT"):
for line in f: for i in range(int(line[7:])):
line = line.rstrip() #repeat the last command
if(line[0:6] == "REPEAT"): parseLine(previousLine)
for i in range(int(line[7:])): await asyncio.sleep_ms(defaultDelay)
#repeat the last command elif(line[0:5] == "DELAY"):
parseLine(previousLine) delay = int(line[6:])
time.sleep(float(defaultDelay)/1000) #print("sleeping for ",delay)
else: #print(type(delay))
parseLine(line) await asyncio.sleep_ms(delay)
previousLine = line previousLine = line
time.sleep(float(defaultDelay)/1000) else:
except OSError as e: #print("parsing line", line)
print("Unable to open file ", file) parseLine(line)
previousLine = line
#print("sleeping",defaultDelay)
await asyncio.sleep_ms(defaultDelay)
#print("done sleeping")
print("ending",duckyScriptPath)
fileToRun = None
await asyncio.sleep(1)
print("ending runScript")
def selectPayload(): def selectPayload():
global payload1Pin, payload2Pin, payload3Pin, payload4Pin global payload1Pin, payload2Pin, payload3Pin, payload4Pin
@@ -234,7 +252,7 @@ async def blink_pico_w_led(led):
await asyncio.sleep(0.5) await asyncio.sleep(0.5)
async def monitor_buttons(button1): async def monitor_buttons(button1):
global inBlinkeyMode, inMenu, enableRandomBeep, enableSirenMode,pixel global inBlinkeyMode, inMenu, enableRandomBeep, enableSirenMode,pixel, fileToRun
print("starting monitor_buttons") print("starting monitor_buttons")
button1Down = False button1Down = False
while True: while True:
@@ -257,7 +275,8 @@ async def monitor_buttons(button1):
# Run selected payload # Run selected payload
payload = selectPayload() payload = selectPayload()
print("Running ", payload) print("Running ", payload)
runScript(payload) #runScript(payload)
fileToRun = payload
print("Done") print("Done")
button1Down = False button1Down = False

View File

@@ -12,6 +12,7 @@ import wsgiserver as server
from adafruit_wsgi.wsgi_app import WSGIApp from adafruit_wsgi.wsgi_app import WSGIApp
import wifi import wifi
import duckyinpython
from duckyinpython import * from duckyinpython import *
payload_html = """<!DOCTYPE html> payload_html = """<!DOCTYPE html>
@@ -209,7 +210,8 @@ def run_script(request, filename):
print("run_script ", filename) print("run_script ", filename)
response = response_html.format("Running script " + filename) response = response_html.format("Running script " + filename)
#print(response) #print(response)
runScript(filename) #runScript(filename)
duckyinpython.fileToRun = filename
return("200 OK",[('Content-Type', 'text/html')], response) return("200 OK",[('Content-Type', 'text/html')], response)
@web_app.route("/") @web_app.route("/")
@@ -223,7 +225,8 @@ def run_script(request, filenumber):
print("run_script ", filenumber) print("run_script ", filenumber)
response = response_html.format("Running script " + filename) response = response_html.format("Running script " + filename)
#print(response) #print(response)
runScript(filename) #runScript(filename)
duckyinpython.fileToRun = filename
return("200 OK",[('Content-Type', 'text/html')], response) return("200 OK",[('Content-Type', 'text/html')], response)
async def startWebService(): async def startWebService():
@@ -240,4 +243,4 @@ async def startWebService():
wsgiServer.start() wsgiServer.start()
while True: while True:
wsgiServer.update_poll() wsgiServer.update_poll()
await asyncio.sleep(0) await asyncio.sleep(0)