#!/bin/sh CMD="$1" LOCAL_LST="$2" H_REPLACE="$3" [ -z "$CMD" ] || [ -z "$LOCAL_LST" ] || [ -z "$H_REPLACE" ] && echo "Missing params!" && exit 1 TMP_DIR="/tmp/opkg_restore" fix_dns() { local dns1="1.1.1.1" local dns2="1.0.0.1" if ! grep -q "$dns1" /etc/resolv.conf; then printf "Patching DNS for restore... " sed -i '/^nameserver/d' /etc/resolv.conf sed -i "1i nameserver $dns1" /etc/resolv.conf sed -i "2i nameserver $dns2" /etc/resolv.conf echo "OK" fi } list_user_packages() { awk -f - << 'EOF' BEGIN { status_file = "/usr/lib/opkg/status" cmd="opkg info busybox | grep '^Installed-Time: '" if ((cmd | getline line) > 0) { FLASH_TIME = substr(line, 17) } close(cmd) while ((getline < status_file) > 0) { if ($1 == "Package:") { pkg = $2 } if ($1 == "Installed-Time:") { installed_time = $2 if (installed_time > FLASH_TIME) { check_cmd = "opkg whatdepends " pkg " | wc -l" check_cmd | getline whatdepends close(check_cmd) if (whatdepends == 3) print pkg } } } } EOF } case "$CMD" in write) mkdir -p "$(dirname "$LOCAL_LST")" echo "Package list:" > "$LOCAL_LST" for pkg in $(list_user_packages); do echo "$pkg" >> "$LOCAL_LST" echo " [+] $pkg" done ;; restore) [ ! -f "$LOCAL_LST" ] && echo "File not found!" && exit 1 [ ! -f /etc/resolv.conf-backup ] && cp /etc/resolv.conf /etc/resolv.conf-backup fix_dns printf "Updating package lists... " opkg update >/dev/null 2>&1 echo "OK" echo "Removing conflicts:" if [ -n "$H_REPLACE" ]; then REMOVABLE=$(opkg list-installed | grep -E $(echo "$H_REPLACE" | tr ' ' '|') | awk '{print $1}') for p in $REMOVABLE; do printf " [-] %s... " "$p" opkg remove "$p" --force-depends >/dev/null 2>&1 echo "OK" done fi echo "Installing packages:" for pkg in $(cat "$LOCAL_LST"); do if opkg list-installed | grep -q "^$pkg "; then echo " [=] $pkg... is already installed" else fix_dns printf " [+] $pkg... " if opkg install "$pkg" >/dev/null 2>&1; then echo "OK" else echo "FAILED" fi fi done [ -f /etc/resolv.conf-backup ] && mv /etc/resolv.conf-backup /etc/resolv.conf echo "Summary:" echo " [+] Restoring packages completed" echo " [!] Reboot required" ;; esac