luci-app-opkg: rework backend operations
authorJo-Philipp Wich <jo@mein.io>
Tue, 3 Mar 2020 14:19:21 +0000 (15:19 +0100)
committerJo-Philipp Wich <jo@mein.io>
Tue, 3 Mar 2020 14:21:48 +0000 (15:21 +0100)
Introduce a new /usr/libexec/opkg-call helper and invoke it via cgi-io
instead of ubus. This is required to be able to reload rpcd without
timing out currently running opkg ubus calls.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
applications/luci-app-opkg/htdocs/luci-static/resources/view/opkg.js
applications/luci-app-opkg/root/usr/libexec/opkg-call [new file with mode: 0755]
applications/luci-app-opkg/root/usr/libexec/opkg-list [deleted file]
applications/luci-app-opkg/root/usr/share/rpcd/acl.d/luci-app-opkg.json

index 59ca2cd951a3dbbb40bc529cad68af3c718d4a84..fcb7dc652c8db39a2da226b6399208fdd66790b3 100644 (file)
@@ -872,7 +872,7 @@ function handleOpkg(ev)
                                _('Waiting for the <em>opkg %h</em> command to complete…').format(cmd))
                ]);
 
-               var argv = [ '--force-removal-of-dependent-packages' ];
+               var argv = [ cmd, '--force-removal-of-dependent-packages' ];
 
                if (rem && rem.checked)
                        argv.push('--autoremove');
@@ -880,12 +880,10 @@ function handleOpkg(ev)
                if (owr && owr.checked)
                        argv.push('--force-overwrite');
 
-               argv.push(cmd);
-
                if (pkg != null)
                        argv.push(pkg);
 
-               fs.exec('/bin/opkg', argv).then(function(res) {
+               fs.exec_direct('/usr/libexec/opkg-call', argv, 'json').then(function(res) {
                        dlg.removeChild(dlg.lastChild);
 
                        if (res.stdout)
@@ -957,8 +955,8 @@ function downloadLists()
 {
        return Promise.all([
                callMountPoints(),
-               fs.exec_direct('/usr/libexec/opkg-list', [ 'available' ]),
-               fs.exec_direct('/usr/libexec/opkg-list', [ 'installed' ])
+               fs.exec_direct('/usr/libexec/opkg-call', [ 'list-available' ]),
+               fs.exec_direct('/usr/libexec/opkg-call', [ 'list-installed' ])
        ]);
 }
 
diff --git a/applications/luci-app-opkg/root/usr/libexec/opkg-call b/applications/luci-app-opkg/root/usr/libexec/opkg-call
new file mode 100755 (executable)
index 0000000..5930977
--- /dev/null
@@ -0,0 +1,59 @@
+#!/bin/sh
+
+. /usr/share/libubox/jshn.sh
+
+action=$1
+shift
+
+case "$action" in
+       list-installed)
+               cat /usr/lib/opkg/status
+       ;;
+       list-available)
+               lists_dir=$(sed -rne 's#^lists_dir \S+ (\S+)#\1#p' /etc/opkg.conf /etc/opkg/*.conf 2>/dev/null | tail -n 1)
+               find "${lists_dir:-/tmp/opkg-lists}" -type f '!' -name '*.sig' | xargs -r gzip -cd
+       ;;
+       install|update|remove)
+               (
+                       opkg="opkg"
+
+                       while [ -n "$1" ]; do
+                               case "$1" in
+                                       --autoremove|--force-overwrite|--force-removal-of-dependent-packages)
+                                               opkg="$opkg $1"
+                                               shift
+                                       ;;
+                                       -*)
+                                               shift
+                                       ;;
+                                       *)
+                                               break
+                                       ;;
+                               esac
+                       done
+
+                       if flock -x 200; then
+                               $opkg $action "$@" </dev/null >/tmp/opkg.out 2>/tmp/opkg.err
+                               code=$?
+                               stdout=$(cat /tmp/opkg.out)
+                               stderr=$(cat /tmp/opkg.err)
+                       else
+                               code=255
+                               stderr="Failed to acquire lock"
+                       fi
+
+                       json_init
+                       json_add_int code $code
+                       [ -n "$stdout" ] && json_add_string stdout "$stdout"
+                       [ -n "$stderr" ] && json_add_string stderr "$stderr"
+                       json_dump
+               ) 200>/tmp/opkg.lock
+
+               rm -f /tmp/opkg.lock /tmp/opkg.err /tmp/opkg.out
+       ;;
+       *)
+               echo "Usage: $0 {list-installed|list-available}"       >&2
+               echo "       $0 {install|upgrade|remove} pkg[ pkg...]" >&2
+               exit 1
+       ;;
+esac
diff --git a/applications/luci-app-opkg/root/usr/libexec/opkg-list b/applications/luci-app-opkg/root/usr/libexec/opkg-list
deleted file mode 100755 (executable)
index 088bc63..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-case "$1" in
-       installed)
-               cat /usr/lib/opkg/status
-       ;;
-       available)
-               lists_dir=$(sed -rne 's#^lists_dir \S+ (\S+)#\1#p' /etc/opkg.conf /etc/opkg/*.conf 2>/dev/null | tail -n 1)
-               find "${lists_dir:-/tmp/opkg-lists}" -type f '!' -name '*.sig' | xargs -r gzip -cd
-       ;;
-       *)
-               echo "Usage: $0 {installed|available}" >&2
-               exit 1
-       ;;
-esac
index 66ef81f103e8ef5611af0de2a90f28f23d69a0b2..37f75fb7c9ca963fa125b6719a38fe72548149e8 100644 (file)
@@ -4,8 +4,8 @@
                "read": {
                        "cgi-io": [ "exec" ],
                        "file": {
-                               "/usr/libexec/opkg-list installed": [ "exec" ],
-                               "/usr/libexec/opkg-list available": [ "exec" ],
+                               "/usr/libexec/opkg-call list-installed": [ "exec" ],
+                               "/usr/libexec/opkg-call list-available": [ "exec" ],
                                "/etc/opkg.conf": [ "read" ],
                                "/etc/opkg/*.conf": [ "read" ]
                        },
@@ -15,9 +15,9 @@
                },
                "write": {
                        "file": {
-                               "/bin/opkg * install *": [ "exec" ],
-                               "/bin/opkg * remove *": [ "exec" ],
-                               "/bin/opkg * update": [ "exec" ],
+                               "/usr/libexec/opkg-call install *": [ "exec" ],
+                               "/usr/libexec/opkg-call remove *": [ "exec" ],
+                               "/usr/libexec/opkg-call update *": [ "exec" ],
                                "/etc/opkg.conf": [ "write" ],
                                "/etc/opkg/*.conf": [ "write" ],
                                "/tmp/upload.ipk": [ "write" ]