#!/bin/sh CMD="$1" PKG_FILE="$2" HOT_REPLACE="$3" [ -z "$CMD" ] || [ -z "$PKG_FILE" ] || [ -z "$HOT_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 echo " [+] Patching DNS for restore..." sed -i "1i nameserver $dns1" /etc/resolv.conf sed -i "2i nameserver $dns2" /etc/resolv.conf 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 "$PKG_FILE")" echo "Scanning for user-installed packages..." > "$PKG_FILE" for pkg in $(list_user_packages); do echo "$pkg" >> "$PKG_FILE" echo " [+] $pkg" done echo "Total $(wc -l < "$PKG_FILE") packages saved to $PKG_FILE" ;; restore) [ ! -f "$PKG_FILE" ] && echo "File not found!" && exit 1 [ ! -f /etc/resolv.conf-backup ] && cp /etc/resolv.conf /etc/resolv.conf-backup fix_dns echo "Updating package lists..." opkg update >/dev/null 2>&1 echo "Phase 1: Removing conflicts ($HOT_REPLACE)..." if [ -n "$HOT_REPLACE" ]; then REMOVABLE=$(opkg list-installed | grep -E $(echo "$HOT_REPLACE" | tr ' ' '|') | awk '{print $1}') for p in $REMOVABLE; do opkg remove "$p" --force-depends >/dev/null 2>&1 done fi echo "Phase 2: Installing packages from list..." for pkg in $(cat "$PKG_FILE"); do if opkg list-installed | grep -q "^$pkg "; then echo " [s] $pkg is already installed" else fix_dns printf " [+] Installing $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 "Restore complete. Reboot is recommended." ;; esac