Hi, I've been trying to implement a firmware update via a ubus rpcd plugin, and have run into a problem regarding how ubus calls the plugins. As best I can tell, if a ubus rpcd plugin does _anything_ in the background, ubus call hangs and then timesout. I can see that rpcd already has some attempts at sysupgrade support, where it forks, explicitly to avoid this [1] but even with a lua ubus rcpd plugin forking, I see the same behaviour with fork, or with shell &.
Example output below.. ``` # ubus list -v demo-hang 'demo-hang' @e96d29a7 "gofork":{"fname":"String"} "simple":{"fname":"String"} # ubus call demo-hang simple { "simple": "went fine" } # ubus call demo-hang gofork Command failed: Request timed out ``` Sample rpcd plugin handler: ``` #!/bin/sh case "$1" in list) echo '{ "gofork": { "fname": "somestring" }, "simple": { "fname": "somestring" } }' ;; call) case "$2" in simple) read input; printf "simple called with input <%s>\n" "$input" >> /tmp/demo-hang.log echo '{ "simple": "went fine" }' ;; gofork) read input; printf "gofork called with input <%s>\n" "$input" >> /tmp/demo-hang.log # fork and let the child do some long running task (sleep 3; echo "after sleeping, child wrote this" >> /tmp/demo-hang.log)& echo '{ "gofork": "went fine" }' ;; esac ;; esac ``` The log file written has the child output included, so it's clearly running. Is there any method of starting a task from a rpcd plugin like this? Even in my own case, I can't use the "existing" rpcd sysupgrade support, because it's not available on the CC branch, and there's been no releases of anything later. Sincerely, Karl Palsson [1] RPCD forking to do background task: https://git.lede-project.org/?p=project/rpcd.git;a=blob;f=sys.c;h=b90aa6b894aba29e8be4884c160a7c34ee0ca646;hb=HEAD#l189
signature.asc
Description: OpenPGP Digital Signature
_______________________________________________ Lede-dev mailing list Lede-dev@lists.infradead.org http://lists.infradead.org/mailman/listinfo/lede-dev