mirror of
https://github.com/openwrt/luci.git
synced 2026-04-15 10:51:51 +00:00
Replace legacy opkg status parsing with native apk-tools JSON queries. This modernizes the backend calls and improves dependency resolution. - Implement 'apk query --format json' for package data retrieval. - Add robust regex for versioned dependencies (e.g., name>=version). - Update version comparison to handle APK date-based revisions. - Fix label-input associations to resolve accessibility warnings. - Retain deprecated opkg fallback logic for LuCI master. Signed-off-by: Konstantin Glukhov <KGlukhov@Hotmail.com>
116 lines
2.5 KiB
Bash
Executable File
116 lines
2.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
. /usr/share/libubox/jshn.sh
|
|
|
|
action=$1
|
|
shift
|
|
|
|
if [ -f /usr/bin/apk ]; then
|
|
ipkg_bin="apk"
|
|
else
|
|
ipkg_bin="opkg"
|
|
fi
|
|
|
|
case "$action" in
|
|
list-installed)
|
|
if [ $ipkg_bin = "apk" ]; then
|
|
$ipkg_bin query --fields all --format json --installed --from system \* 2>/dev/null
|
|
else
|
|
cat /usr/lib/opkg/status
|
|
fi
|
|
;;
|
|
list-available)
|
|
if [ $ipkg_bin = "apk" ]; then
|
|
$ipkg_bin query --fields all --format json --available \* 2>/dev/null
|
|
else
|
|
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:-/usr/lib/opkg/lists}" -type f '!' -name '*.sig' | xargs -r gzip -cd
|
|
fi
|
|
;;
|
|
install|update|upgrade|remove)
|
|
(
|
|
cmd="$ipkg_bin"
|
|
|
|
# The apk package manager uses distinct commands for installing and removing packages.
|
|
if [ $ipkg_bin = "apk" ]; then
|
|
case "$action" in
|
|
install)
|
|
action="add"
|
|
;;
|
|
remove)
|
|
action="del"
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
# APK have --autoremove enabled by default and
|
|
# --force-removal-of-dependent-packages as -r option
|
|
if [ $ipkg_bin = "apk" ]; then
|
|
while [ -n "$1" ]; do
|
|
case "$1" in
|
|
--autoremove)
|
|
# Just shift and do nothing.
|
|
# 'apk del' already cleans up orphaned dependencies by default.
|
|
shift
|
|
;;
|
|
--force-removal-of-dependent-packages)
|
|
cmd="$cmd -r"
|
|
shift
|
|
;;
|
|
--force-overwrite)
|
|
cmd="$cmd $1"
|
|
shift
|
|
;;
|
|
-*)
|
|
shift
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
else
|
|
while [ -n "$1" ]; do
|
|
case "$1" in
|
|
--autoremove|--force-overwrite|--force-removal-of-dependent-packages)
|
|
cmd="$cmd $1"
|
|
shift
|
|
;;
|
|
-*)
|
|
shift
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
fi
|
|
|
|
if flock -x 200; then
|
|
pkmcmd="$cmd $action $@"
|
|
$cmd $action "$@" </dev/null >/tmp/ipkg.out 2>/tmp/ipkg.err
|
|
code=$?
|
|
stdout=$(cat /tmp/ipkg.out)
|
|
stderr=$(cat /tmp/ipkg.err)
|
|
else
|
|
code=255
|
|
stderr="Failed to acquire lock"
|
|
fi
|
|
|
|
json_init
|
|
json_add_int code $code
|
|
[ -n "$pkmcmd" ] && json_add_string pkmcmd "$pkmcmd"
|
|
[ -n "$stdout" ] && json_add_string stdout "$stdout"
|
|
[ -n "$stderr" ] && json_add_string stderr "$stderr"
|
|
json_dump
|
|
) 200>/tmp/ipkg.lock
|
|
|
|
rm -f /tmp/ipkg.lock /tmp/ipkg.err /tmp/ipkg.out
|
|
;;
|
|
*)
|
|
echo "Usage: $0 {list-installed|list-available|update}" >&2
|
|
echo " $0 {install|upgrade|remove} pkg[ pkg...]" >&2
|
|
exit 1
|
|
;;
|
|
esac
|