#!/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:-/usr/lib/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
