mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-11 05:57:51 +08:00
118 lines
3.9 KiB
AMPL
Executable File
118 lines
3.9 KiB
AMPL
Executable File
#!/bin/sh
|
|
|
|
[ -d "/overlay/upper/etc" ] || {
|
|
echo "Only squashfs rom supported, and /overlay must be mounted." >&2
|
|
exit 1
|
|
}
|
|
|
|
APK=false
|
|
PKG_BASE=usr/lib/opkg/info
|
|
PKG_EXT=control
|
|
|
|
[ -s /etc/apk/arch ] && {
|
|
APK=true
|
|
PKG_BASE=lib/apk/packages
|
|
PKG_EXT=list
|
|
}
|
|
|
|
nonconf_files_of_pkg() {
|
|
local pkgname="$1"
|
|
if [ -s /rom/$PKG_BASE/${pkgname}.conffiles ]; then
|
|
grep -hvxFf /rom/$PKG_BASE/${pkgname}.conffiles \
|
|
/rom/$PKG_BASE/${pkgname}.list
|
|
else
|
|
cat /rom/$PKG_BASE/${pkgname}.list
|
|
fi
|
|
}
|
|
|
|
reset_pkg() {
|
|
local pkgname="$1"
|
|
local line
|
|
echo "${pkgname}" | grep -q '^kernel$
|
|
^libc$
|
|
^libgcc1$
|
|
^libatomic1$
|
|
^busybox$' && return
|
|
if [ -f /rom/$PKG_BASE/${pkgname}.$PKG_EXT -a \
|
|
\( -e /overlay/upper/$PKG_BASE/${pkgname}.$PKG_EXT -o \
|
|
-e /ext_overlay/upper/$PKG_BASE/${pkgname}.$PKG_EXT \) ]; then
|
|
echo "reset ${pkgname}"
|
|
if [ -f /rom/$PKG_BASE/${pkgname}.list ]; then
|
|
nonconf_files_of_pkg "${pkgname}" | while read; do
|
|
line="$REPLY"
|
|
if [ -e "${line}" -o -e "/overlay/upper/${line}" -o -e "/ext_overlay/upper/${line}" ]; then
|
|
rm -f "/overlay/upper/${line}" "/ext_overlay/upper/${line}"
|
|
else
|
|
local dir="$(dirname ${line})"
|
|
[ -z "$dir" -o "$dir" = "/" -o "$dir" = "." -o "$line" = "$dir" ] || echo "$dir" >> /tmp/.reset_dirs
|
|
fi
|
|
done
|
|
if [ -s /rom/$PKG_BASE/${pkgname}.conffiles ]; then
|
|
# restore config files from rom, if they are not exist in working rootfs
|
|
while read; do
|
|
line="$REPLY"
|
|
[ -e "${line}" ] && continue
|
|
rm -rf "/overlay/upper/${line}" "/ext_overlay/upper/${line}"
|
|
done < /rom/$PKG_BASE/${pkgname}.conffiles
|
|
fi
|
|
# restore auto start
|
|
grep '^/etc/init\.d/' /rom/$PKG_BASE/${pkgname}.list | while read; do
|
|
line="$REPLY"
|
|
line="$(basename ${line})"
|
|
rm -f "/overlay/upper/etc/rc.d/"*"${line}" "/ext_overlay/upper/etc/rc.d/"*"${line}"
|
|
done
|
|
rm -f /overlay/upper/$PKG_BASE/${pkgname}.list /ext_overlay/upper/$PKG_BASE/${pkgname}.list
|
|
fi
|
|
fi
|
|
}
|
|
|
|
ls_all_rom_pkgs() {
|
|
( cd /rom/$PKG_BASE ; find . -maxdepth 1 -name "*.$PKG_EXT" | sed -E 's#./(.*).'"$PKG_EXT"'#\1#g' )
|
|
}
|
|
|
|
reset_all_rom() {
|
|
local line
|
|
rm -f /tmp/.reset_dirs
|
|
ls_all_rom_pkgs | while read; do
|
|
line="$REPLY"
|
|
reset_pkg "$line"
|
|
done
|
|
if [ -s /tmp/.reset_dirs ]; then
|
|
echo "reset overlayfs opaque flags..."
|
|
sort -u /tmp/.reset_dirs | while read; do
|
|
local line="$REPLY"
|
|
echo "reset dir $line and its parents"
|
|
while :; do
|
|
dir="$line"
|
|
line="$(dirname ${dir})"
|
|
[ -z "$dir" -o "$dir" = "/" -o "$dir" = "." ] && break
|
|
if [ -e "/overlay/upper/${dir}" -o -e "/ext_overlay/upper/${dir}" ]; then
|
|
if [ -d "/overlay/upper/${dir}" -o -d "/ext_overlay/upper/${dir}" ]; then
|
|
setfattr -x "trusted.overlay.opaque" -h "/overlay/upper/${dir}" "/ext_overlay/upper/${dir}" 2>/dev/null
|
|
else
|
|
rm -f "/overlay/upper/${dir}" "/ext_overlay/upper/${dir}"
|
|
fi
|
|
fi
|
|
[ "$line" = "$dir" ] && break
|
|
done
|
|
done
|
|
fi
|
|
rm -f /tmp/.reset_dirs
|
|
}
|
|
|
|
reset_all_rom
|
|
|
|
if $APK; then
|
|
rm -f /overlay/upper/etc/uci-defaults/.upgrading /ext_overlay/upper/etc/uci-defaults/.upgrading
|
|
touch /overlay/upper/etc/uci-defaults/.upgrading 2>/dev/null
|
|
else
|
|
rm -f /overlay/upper/usr/lib/opkg/.upgrading /ext_overlay/upper/usr/lib/opkg/.upgrading
|
|
touch /overlay/upper/usr/lib/opkg/.upgrading 2>/dev/null
|
|
fi
|
|
|
|
echo "done, please reboot, it will reboot in 10s"
|
|
|
|
sleep 10
|
|
reboot
|
|
|