mirror of
https://github.com/RoganDawes/P4wnP1_aloa.git
synced 2025-03-27 01:51:45 +01:00
Wrapping HIDScript into anonymous, self-invoked function
This commit is contained in:
parent
cba4039a6b
commit
e77dd369ef
@ -213,7 +213,7 @@ func TestCombinedScript(hidCtl *hid.HIDController) (err error) {
|
||||
}
|
||||
`
|
||||
|
||||
_,err = hidCtl.RunScript(context.Background(),testcript)
|
||||
_,err = hidCtl.RunScript(context.Background(),testcript, true)
|
||||
if err != nil {panic(err)}
|
||||
|
||||
return
|
||||
@ -253,7 +253,7 @@ func TestMouseCircle(hidCtl *hid.HIDController) {
|
||||
}
|
||||
`
|
||||
|
||||
_,err := hidCtl.RunScript(context.Background(),scriptMouse)
|
||||
_,err := hidCtl.RunScript(context.Background(),scriptMouse, true)
|
||||
if err != nil { panic(err)}
|
||||
}
|
||||
|
||||
@ -273,7 +273,7 @@ func TestControllerReInit() {
|
||||
script := "console.log('...started');delay(3000);console.log('...ended');"
|
||||
ctx := context.Background()
|
||||
for i:=0;i<4;i++ {
|
||||
job,err := hidCtlTest.StartScriptAsBackgroundJob(ctx, script)
|
||||
job,err := hidCtlTest.StartScriptAsBackgroundJob(ctx, script, true)
|
||||
if err != nil {
|
||||
fmt.Printf("Error starting new job: %v\n",err)
|
||||
} else {
|
||||
@ -343,7 +343,7 @@ func main() {
|
||||
script := "console.log('START ' + JID + ' on VM ' + VMID);waitLEDRepeat(ANY,5000);console.log(JID + ' returned from 5s blocking delay');"
|
||||
startTime := time.Now()
|
||||
for i:=1; i<4; i++ {
|
||||
job,err := hidCtl.StartScriptAsBackgroundJob(ctxT,script)
|
||||
job,err := hidCtl.StartScriptAsBackgroundJob(ctxT,script,true)
|
||||
if err != nil {
|
||||
fmt.Printf("Failed adding background job: %v\n", err)
|
||||
} else {
|
||||
@ -377,7 +377,7 @@ func main() {
|
||||
if scriptFile, err := ioutil.ReadFile(filepath); err != nil {
|
||||
log.Printf("Couldn't load HIDScript testfile: %s\n", filepath)
|
||||
} else {
|
||||
_,err = hidCtl.RunScript(context.Background(),string(scriptFile))
|
||||
_,err = hidCtl.RunScript(context.Background(),string(scriptFile), true)
|
||||
if err != nil { panic(err)}
|
||||
}
|
||||
|
||||
|
@ -123,7 +123,7 @@ func (avm *AsyncOttoVM) SetWorking(working bool) {
|
||||
return
|
||||
}
|
||||
|
||||
func (avm *AsyncOttoVM) RunAsync(ctx context.Context, src interface{}) (job *AsyncOttoJob, err error) {
|
||||
func (avm *AsyncOttoVM) RunAsync(ctx context.Context, src interface{}, anonymousSelfInvoked bool) (job *AsyncOttoJob, err error) {
|
||||
if avm.IsWorking() {
|
||||
return job, errors.New(fmt.Sprintf("VM %d couldn't start new job, because it is still running one"))
|
||||
}
|
||||
@ -179,10 +179,19 @@ func (avm *AsyncOttoVM) RunAsync(ctx context.Context, src interface{}) (job *Asy
|
||||
fmt.Printf("START JOB %d SCRIPT ON VM %d\n", job.Id, avm.Id) //DEBUG
|
||||
|
||||
//short pre-run to set JobID and VMID (ignore errors)
|
||||
avm.vm.Run(fmt.Sprintf("JID=%d;VMID=%d;", job.Id, avm.Id))
|
||||
avm.vm.Run(fmt.Sprintf("JID=%d;VMID=%d;\n", job.Id, avm.Id))
|
||||
|
||||
job.ResultValue, job.ResultErr = avm.vm.Run(job.Source) //store result
|
||||
job.SetFinished() // signal job finished
|
||||
// try to wrap source into a anonymous, self-invoked function, to avoid polluting global scope (only if source is string)
|
||||
if src, isString := job.Source.(string); isString {
|
||||
if anonymousSelfInvoked {
|
||||
src = fmt.Sprintf("(function() {\n%s\n})();",src)
|
||||
job.ResultValue, job.ResultErr = avm.vm.Run(src) //store result
|
||||
job.SetFinished() // signal job finished
|
||||
}
|
||||
} else {
|
||||
job.ResultValue, job.ResultErr = avm.vm.Run(job.Source) //store result
|
||||
job.SetFinished() // signal job finished
|
||||
}
|
||||
|
||||
//Emit event + print DEBUG
|
||||
evRes := Event{ Vm: avm, Job: job }
|
||||
@ -211,8 +220,8 @@ func (avm *AsyncOttoVM) RunAsync(ctx context.Context, src interface{}) (job *Asy
|
||||
}
|
||||
|
||||
|
||||
func (avm *AsyncOttoVM) Run(ctx context.Context,src interface{}) (val otto.Value, res error) {
|
||||
job,err := avm.RunAsync(ctx, src)
|
||||
func (avm *AsyncOttoVM) Run(ctx context.Context,src interface{}, anonymousSelfInvoked bool) (val otto.Value, res error) {
|
||||
job,err := avm.RunAsync(ctx, src, anonymousSelfInvoked)
|
||||
if err != nil { return val,err }
|
||||
return job.WaitResult()
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ func (ctl *HIDController) NextUnusedVM() (vm *AsyncOttoVM, err error) {
|
||||
return nil, errors.New("No free JavaScript VM available in pool")
|
||||
}
|
||||
|
||||
func (ctl *HIDController) RunScript(ctx context.Context, script string) (val otto.Value, err error) {
|
||||
func (ctl *HIDController) RunScript(ctx context.Context, script string, anonymousSelfInvoked bool) (val otto.Value, err error) {
|
||||
/*
|
||||
//fetch next free vm from pool
|
||||
avm,err := ctl.NextUnusedVM()
|
||||
@ -167,7 +167,7 @@ func (ctl *HIDController) RunScript(ctx context.Context, script string) (val ott
|
||||
|
||||
// use backround job and wait, to force keeping track of job in joblist, in case the result is never fetched due to
|
||||
// remote CLI abort after running endless script (wouldn't cancel the script)
|
||||
job,err := ctl.StartScriptAsBackgroundJob(ctx, script)
|
||||
job,err := ctl.StartScriptAsBackgroundJob(ctx, script, anonymousSelfInvoked)
|
||||
if err != nil { return val,err }
|
||||
val,err = ctl.WaitBackgroundJobResult(ctx, job)
|
||||
return
|
||||
@ -212,7 +212,7 @@ func (ctl *HIDController) retrieveJobFromOtto(vm *otto.Otto) (job *AsyncOttoJob,
|
||||
}
|
||||
}
|
||||
|
||||
func (ctl *HIDController) StartScriptAsBackgroundJob(ctx context.Context,script string) (job *AsyncOttoJob, err error) {
|
||||
func (ctl *HIDController) StartScriptAsBackgroundJob(ctx context.Context,script string, anonymousSelfInvoked bool) (job *AsyncOttoJob, err error) {
|
||||
//fetch next free vm from pool
|
||||
avm,err := ctl.NextUnusedVM()
|
||||
if err != nil {
|
||||
@ -225,7 +225,7 @@ func (ctl *HIDController) StartScriptAsBackgroundJob(ctx context.Context,script
|
||||
}
|
||||
|
||||
//try to run script async
|
||||
job,err = avm.RunAsync(ctx,script)
|
||||
job,err = avm.RunAsync(ctx,script,anonymousSelfInvoked)
|
||||
if err != nil { return nil, err }
|
||||
|
||||
ctl.emitEvent(Event{
|
||||
|
@ -389,13 +389,13 @@ func (tam *TriggerActionManager) executeActionStartHidScript(evt *pb.Event, ta *
|
||||
fmt.Printf("Trigger '%s' fired -> executing action '%s' ('%s')\n", triggerName, actionName, action.ScriptName)
|
||||
|
||||
scriptPath := PATH_HID_SCRIPTS + "/" + action.ScriptName
|
||||
preScript := fmt.Sprintf("TRIGGER='%s';\n", triggerName)
|
||||
preScript := fmt.Sprintf("var TRIGGER='%s';\n", triggerName)
|
||||
|
||||
switch tt {
|
||||
case triggerTypeGpioIn:
|
||||
gpioPin := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioNum
|
||||
gpioPinName := pb.GPIONum_name[int32(gpioPin)]
|
||||
preScript += fmt.Sprintf("GPIO_PIN=%s;\n", gpioPinName)
|
||||
preScript += fmt.Sprintf("var GPIO_PIN=%s;\n", gpioPinName)
|
||||
case triggerTypeGroupReceiveSequence:
|
||||
groupName := ta.Trigger.(*pb.TriggerAction_GroupReceiveSequence).GroupReceiveSequence.GroupName
|
||||
values := ta.Trigger.(*pb.TriggerAction_GroupReceiveSequence).GroupReceiveSequence.Values
|
||||
@ -409,23 +409,23 @@ func (tam *TriggerActionManager) executeActionStartHidScript(evt *pb.Event, ta *
|
||||
}
|
||||
}
|
||||
jsArray += "]"
|
||||
preScript += fmt.Sprintf("GROUP='%s';\n", groupName)
|
||||
preScript += fmt.Sprintf("var GROUP='%s';\n", groupName)
|
||||
preScript += fmt.Sprintf("var VALUES=%s;\n", jsArray)
|
||||
case triggerTypeGroupReceive:
|
||||
groupName := ta.Trigger.(*pb.TriggerAction_GroupReceive).GroupReceive.GroupName
|
||||
value := ta.Trigger.(*pb.TriggerAction_GroupReceive).GroupReceive.Value
|
||||
preScript += fmt.Sprintf("GROUP='%s';\n", groupName)
|
||||
preScript += fmt.Sprintf("VALUE=%d;\n", value)
|
||||
preScript += fmt.Sprintf("var GROUP='%s';\n", groupName)
|
||||
preScript += fmt.Sprintf("var VALUE=%d;\n", value)
|
||||
case triggerTypeDhcpLeaseGranted:
|
||||
iface := evt.Values[1].GetTstring()
|
||||
mac := evt.Values[2].GetTstring()
|
||||
ip := evt.Values[3].GetTstring()
|
||||
preScript += fmt.Sprintf("DHCP_LEASE_IFACE=%s;\n", iface)
|
||||
preScript += fmt.Sprintf("DHCP_LEASE_MAC=%s;\n", mac)
|
||||
preScript += fmt.Sprintf("DHCP_LEASE_IP=%s;\n", ip)
|
||||
preScript += fmt.Sprintf("var DHCP_LEASE_IFACE=%s;\n", iface)
|
||||
preScript += fmt.Sprintf("var DHCP_LEASE_MAC=%s;\n", mac)
|
||||
preScript += fmt.Sprintf("var DHCP_LEASE_IP=%s;\n", ip)
|
||||
case triggerTypeSshLogin:
|
||||
loginUser := evt.Values[1].GetTstring()
|
||||
preScript += fmt.Sprintf("SSH_LOGIN_USER=%s;\n", loginUser)
|
||||
preScript += fmt.Sprintf("var SSH_LOGIN_USER=%s;\n", loginUser)
|
||||
|
||||
}
|
||||
|
||||
|
@ -113,7 +113,7 @@ func (gm *UsbGadgetManager) HidScriptRun(ctx context.Context, scriptContent stri
|
||||
err = gm.HidScriptUsable()
|
||||
if err != nil { return }
|
||||
|
||||
scriptVal,err := gm.hidCtl.RunScript(ctx, scriptContent)
|
||||
scriptVal,err := gm.hidCtl.RunScript(ctx, scriptContent, true)
|
||||
if err != nil { return nil, err}
|
||||
|
||||
return scriptVal.Export()
|
||||
@ -123,7 +123,7 @@ func (gm *UsbGadgetManager) HidScriptStartBackground(ctx context.Context, script
|
||||
err = gm.HidScriptUsable()
|
||||
if err != nil { return }
|
||||
|
||||
return gm.hidCtl.StartScriptAsBackgroundJob(ctx, scriptContent)
|
||||
return gm.hidCtl.StartScriptAsBackgroundJob(ctx, scriptContent, true)
|
||||
}
|
||||
|
||||
//WaitBackgroundJobResult(ctx context.Context, job *AsyncOttoJob) (val otto.Value, err error) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user