96 lines
2.7 KiB
Bash
Executable File
96 lines
2.7 KiB
Bash
Executable File
#!/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
|