144 lines
4.6 KiB
Bash
Executable File
144 lines
4.6 KiB
Bash
Executable File
#!/bin/ash
|
|
|
|
LOG_FILE="/tmp/pre-mount-fixinst.log"
|
|
# Initialize log
|
|
rm -f "$LOG_FILE" >/dev/null 2>&1
|
|
touch "$LOG_FILE"
|
|
# Redirect all output (stdout and stderr) to the log file
|
|
exec >>"$LOG_FILE" 2>&1
|
|
|
|
mount_factory() {
|
|
# Redirect all output (stdout and stderr) to the log file
|
|
exec >>"$LOG_FILE" 2>&1
|
|
|
|
# Check if /real_rootfs exists
|
|
if [ ! -d "/real_rootfs" ]; then
|
|
echo "Error: /real_rootfs does not exist. Cannot proceed with stop." >> "$LOG_FILE"
|
|
return 1
|
|
fi
|
|
|
|
# Determine firmware version based on mounts
|
|
if [ -d "/usrdata" ] && [ -d "/systemrw" ]; then
|
|
echo "New firmware scenario detected (with /usrdata and /systemrw)." >> "$LOG_FILE"
|
|
stop_handle_new_firmware
|
|
else
|
|
echo "Old firmware scenario detected (without /usrdata and /systemrw)." >> "$LOG_FILE"
|
|
stop_handle_old_firmware
|
|
fi
|
|
}
|
|
|
|
stop_handle_new_firmware() {
|
|
# Redirect all output (stdout and stderr) to the log file
|
|
exec >>"$LOG_FILE" 2>&1
|
|
/bin/echo "Stopping and reverting overlay and pivot_root"
|
|
service init-overlay-watchdog stop
|
|
service init-overlay-watchdog disable
|
|
# Unmount /etc/rc.d bind
|
|
/bin/umount -lf /etc/rc.d
|
|
# Remount the original root filesystem as read-write
|
|
/bin/mount -o remount,rw /real_rootfs
|
|
|
|
# Move the mounted filesystems back to the original locations
|
|
/bin/mount --move /sys /real_rootfs/sys
|
|
/bin/mount --move /proc /real_rootfs/proc
|
|
/bin/mount --move /tmp /real_rootfs/tmp
|
|
/bin/mount --move /dev /real_rootfs/dev
|
|
/bin/mount --move /firmware /real_rootfs/firmware
|
|
/bin/mount --move /usrdata /real_rootfs/usrdata
|
|
/bin/mount --move /data /real_rootfs/data
|
|
/bin/mount --move /cache /real_rootfs/cache
|
|
/bin/mount --move /systemrw /real_rootfs/systemrw
|
|
/bin/mount --move /persist /real_rootfs/persist
|
|
|
|
# Pivot root back to the original root
|
|
/sbin/pivot_root /real_rootfs /real_rootfs/rootfs
|
|
|
|
/bin/echo "Reverted pivot_root"
|
|
|
|
# Unmount /rootfs overlay
|
|
/bin/umount -lf /rootfs >/dev/null 2>&1
|
|
service init-overlay-watchdog disable
|
|
|
|
# Mount layer 2 /etc back
|
|
/bin/mount --bind /usrdata/etc /etc
|
|
service init-overlay-watchdog disable
|
|
|
|
# Mount layer 3 /etc back
|
|
/bin/mount -t overlay overlay -o lowerdir=/etc,upperdir=/usrdata/overlay-work/etc-upper,workdir=/usrdata/overlay-work/.etc-work /etc
|
|
service init-overlay-watchdog disable
|
|
df -h
|
|
echo -e "\e[31m / is read-write right now. Be careful\e[0m"
|
|
echo -e "\e[31m Reboot or run mount -o remount,ro / \e[0m"
|
|
}
|
|
|
|
stop_handle_old_firmware() {
|
|
# Redirect all output (stdout and stderr) to the log file
|
|
exec >>"$LOG_FILE" 2>&1
|
|
/bin/echo "Stopping and reverting overlay and pivot_root"
|
|
service init-overlay-watchdog stop
|
|
service init-overlay-watchdog disable
|
|
# Unmount /etc/rc.d bind
|
|
/bin/umount -lf /etc/rc.d
|
|
|
|
# Remount the original root filesystem as read-write
|
|
/bin/mount -o remount,rw /real_rootfs
|
|
|
|
# Move the mounted filesystems back to the original locations
|
|
/bin/mount --move /sys /real_rootfs/sys
|
|
/bin/mount --move /proc /real_rootfs/proc
|
|
/bin/mount --move /tmp /real_rootfs/tmp
|
|
/bin/mount --move /dev /real_rootfs/dev
|
|
/bin/mount --move /firmware /real_rootfs/firmware
|
|
/bin/mount --move /persist /real_rootfs/persist
|
|
/bin/mount --move /cache /real_rootfs/cache
|
|
/bin/mount --move /data /real_rootfs/data
|
|
|
|
# Pivot root back to the original root
|
|
/sbin/pivot_root /real_rootfs /real_rootfs/rootfs
|
|
|
|
/bin/echo "Reverted pivot_root"
|
|
|
|
# Unmount /rootfs overlay
|
|
/bin/umount -lf /rootfs >/dev/null 2>&1
|
|
|
|
# Mount the location of etc-upper back
|
|
mount -t ubifs /dev/ubi0_3 /overlay
|
|
|
|
# Mount the old overlay filesystem back for etc
|
|
/bin/mount -t overlay overlay -o lowerdir=/etc,upperdir=/overlay/etc-upper,workdir=/overlay/.etc-work /etc
|
|
|
|
echo -e "\e[31m / is read-write right now. Be careful\e[0m"
|
|
echo -e "\e[31m Reboot or run mount -o remount,ro / \e[0m"
|
|
}
|
|
|
|
|
|
if grep -qs '/real_rootfs' /proc/mounts; then
|
|
echo "Upgrade scenario detected."
|
|
mount_factory
|
|
service mount-fix disable
|
|
echo "Filesystem structure returned to Quectel Stock"
|
|
echo "Backup exists at /usrdata/rootfs or /data/rootfs"
|
|
fi
|
|
|
|
# Remount original rootfs as read-write
|
|
echo "Mounting / as read-write"
|
|
mount -o remount,rw /
|
|
|
|
# Check if /etc is mounted
|
|
if grep -qs '/etc' /proc/mounts; then
|
|
echo "Unmounting /etc..."
|
|
umount -lf /etc
|
|
fi
|
|
|
|
# Check if /usrdata is mounted
|
|
if grep -qs '/usrdata' /proc/mounts; then
|
|
echo "/usrdata is mounted. Unmounting /etc again to access rootfs /etc..."
|
|
umount -lf /etc
|
|
fi
|
|
|
|
echo "Preinst complete...."
|
|
echo "View Results here:..."
|
|
mount
|
|
|
|
exit 0
|