From dc16a3c9fe0ec2017fb28d025b90b8f4a382b03a Mon Sep 17 00:00:00 2001 From: Cameron Thompson <50184035+iamromulan@users.noreply.github.com> Date: Sat, 25 Jan 2025 22:33:05 -0500 Subject: [PATCH] mount-fix simplification - No more inotifywait or overlay-init-watchdog - Instead, real_rootfs rc.d is mounted back on top of the overlay to allow read/write to it. The bootup rc.d and resulting location rc.d become the same and as a result allowing init to behave naturally without extra help. - Must be on the latest sdxpinn-patch version in order to upgrade this package. The old prerm scripts need removed before upgrading. --- ipk-source/sdxpinn-mount-fix/CONTROL/control | 2 +- ipk-source/sdxpinn-mount-fix/CONTROL/postinst | 108 +----- ipk-source/sdxpinn-mount-fix/CONTROL/preinst | 159 +++++--- ipk-source/sdxpinn-mount-fix/CONTROL/prerm | 10 - .../root/etc/init.d/add_opkg_status_bundled | 60 --- .../root/etc/init.d/init-overlay-watchdog | 20 - .../root/etc/init.d/mount-fix | 29 +- .../sdxpinn-mount-fix/root/tmp/distfeeds.conf | 46 --- .../root/usr/bin/inotifywait | Bin 24571 -> 0 bytes .../sdxpinn-mount-fix/root/usr/bin/rc_sync | 66 ---- .../root/usr/lib/libinotifytools.so | Bin 32771 -> 0 bytes .../root/usr/lib/libinotifytools.so.0 | Bin 32771 -> 0 bytes .../root/usr/lib/libinotifytools.so.0.4.1 | Bin 32771 -> 0 bytes .../usr/lib/opkg/info/inotifywait.control | 20 - .../root/usr/lib/opkg/info/inotifywait.list | 1 - .../usr/lib/opkg/info/inotifywait.postinst | 5 - .../root/usr/lib/opkg/info/inotifywait.prerm | 4 - .../usr/lib/opkg/info/libinotifytools.control | 20 - .../usr/lib/opkg/info/libinotifytools.list | 3 - .../lib/opkg/info/libinotifytools.postinst | 5 - .../usr/lib/opkg/info/libinotifytools.prerm | 4 - .../root/usr/sbin/init-overlay-watchdog.sh | 75 ---- .../root/usrdata/etc/init.d/mount-fix | 343 ++++++++++++++++++ 23 files changed, 472 insertions(+), 508 deletions(-) delete mode 100755 ipk-source/sdxpinn-mount-fix/CONTROL/prerm delete mode 100755 ipk-source/sdxpinn-mount-fix/root/etc/init.d/add_opkg_status_bundled delete mode 100755 ipk-source/sdxpinn-mount-fix/root/etc/init.d/init-overlay-watchdog delete mode 100644 ipk-source/sdxpinn-mount-fix/root/tmp/distfeeds.conf delete mode 100755 ipk-source/sdxpinn-mount-fix/root/usr/bin/inotifywait delete mode 100755 ipk-source/sdxpinn-mount-fix/root/usr/bin/rc_sync delete mode 100644 ipk-source/sdxpinn-mount-fix/root/usr/lib/libinotifytools.so delete mode 100644 ipk-source/sdxpinn-mount-fix/root/usr/lib/libinotifytools.so.0 delete mode 100644 ipk-source/sdxpinn-mount-fix/root/usr/lib/libinotifytools.so.0.4.1 delete mode 100644 ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.control delete mode 100644 ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.list delete mode 100755 ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.postinst delete mode 100755 ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.prerm delete mode 100755 ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.control delete mode 100755 ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.list delete mode 100755 ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.postinst delete mode 100755 ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.prerm delete mode 100755 ipk-source/sdxpinn-mount-fix/root/usr/sbin/init-overlay-watchdog.sh create mode 100755 ipk-source/sdxpinn-mount-fix/root/usrdata/etc/init.d/mount-fix diff --git a/ipk-source/sdxpinn-mount-fix/CONTROL/control b/ipk-source/sdxpinn-mount-fix/CONTROL/control index 47ace68..2eb5638 100755 --- a/ipk-source/sdxpinn-mount-fix/CONTROL/control +++ b/ipk-source/sdxpinn-mount-fix/CONTROL/control @@ -1,5 +1,5 @@ Package: sdxpinn-mount-fix -Version: 1.2.0 +Version: 1.3.0 Architecture: aarch64_cortex-a53 Maintainer: Cameron Thompson iamromulan@github.com Source: github.com/iamromulan diff --git a/ipk-source/sdxpinn-mount-fix/CONTROL/postinst b/ipk-source/sdxpinn-mount-fix/CONTROL/postinst index 126ea3c..acccc08 100755 --- a/ipk-source/sdxpinn-mount-fix/CONTROL/postinst +++ b/ipk-source/sdxpinn-mount-fix/CONTROL/postinst @@ -1,123 +1,21 @@ #!/bin/ash -# Define the main package name and list file location -PKG_NAME="sdxpinn-mount-fix" -LIST_FILE="/usr/lib/opkg/info/${PKG_NAME}.list" -DETECTED_PACKAGES_FILE="/tmp/detected_packages.tmp" -INIT_SCRIPT="/etc/init.d/add_opkg_status_bundled" - -# Function to handle bundled packages post-install -handle_bundled_postinst() { - local bundled_package_name="$1" - - # Use the target package name for default_postinst instead of $0 - if [ "${IPKG_NO_SCRIPT}" = "1" ]; then - return 0 - fi - - # Source the necessary functions only once - if [ -s "${IPKG_INSTROOT}/lib/functions.sh" ]; then - . "${IPKG_INSTROOT}/lib/functions.sh" - else - echo "Error: ${IPKG_INSTROOT}/lib/functions.sh not found." - return 1 - fi - - echo "Executing default_postinst for bundled package: $bundled_package_name" - default_postinst "$bundled_package_name" $@ - return $? -} - -# Replace distfeeds.conf with non-working sources commented out -if [ -f /tmp/distfeeds.conf ]; then - # Backup and replace distfeeds.conf - [ -f /etc/opkg/distfeeds.conf ] && cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.bak - mv /tmp/distfeeds.conf /etc/opkg/distfeeds.conf - echo "Replaced /etc/opkg/distfeeds.conf with the custom version." -else - echo "Error: /tmp/distfeeds.conf not found. Cannot replace /etc/opkg/distfeeds.conf." - exit 1 -fi - -echo "Combo package cleanup in progress..." - -# Remove entries in the .list file that refer to opkg control files and specific files -if [ -f "$LIST_FILE" ]; then - # Remove opkg control file entries and specific bundled paths - sed -i '/^\/usr\/lib\/opkg\/info\//d' "$LIST_FILE" - sed -i '/^\/usr\/lib\/libinotifytools.so.0.4.1$/d' "$LIST_FILE" - sed -i '/^\/usr\/bin\/inotifywait$/d' "$LIST_FILE" - sed -i '/^\/usr\/lib\/libinotifytools.so$/d' "$LIST_FILE" - sed -i '/^\/etc\/init.d\/add_opkg_status_bundled$/d' "$LIST_FILE" - sed -i '/^\/tmp\/distfeeds.conf$/d' "$LIST_FILE" - sed -i '/^\/usr\/lib\/libinotifytools.so.0$/d' "$LIST_FILE" - - echo "Removed unnecessary file entries from $LIST_FILE." -else - echo "Warning: ${LIST_FILE} not found." -fi - -# Make the init scripts and binaries executable -chmod +x /etc/init.d/mount-fix /etc/init.d/init-overlay-watchdog /etc/init.d/add_opkg_status_bundled /usr/sbin/init-overlay-watchdog.sh - # Enable and start the services echo "Starting services..." - service mount-fix enable + if grep -qs '/usrdata' /proc/mounts; then - echo "/usrdata is mounted. Synchronizing mount-fix files to /usrdata..." - cp /etc/init.d/mount-fix /usrdata/etc/init.d/mount-fix + echo "/usrdata is mounted. Enabling at /usrdata..." cp -P /etc/rc.d/S03mount-fix /usrdata/etc/rc.d/S03mount-fix fi + service mount-fix start -sleep 1 - -service init-overlay-watchdog enable -if grep -qs '/usrdata' /proc/mounts; then - echo "/usrdata is mounted. Synchronizing init-overlay-watchdog files to /usrdata..." - cp /etc/init.d/init-overlay-watchdog /usrdata/etc/init.d/init-overlay-watchdog - cp -P /etc/rc.d/S04init-overlay-watchdog /usrdata/etc/rc.d/S04init-overlay-watchdog -fi -service init-overlay-watchdog start - echo -e "\e[32m sdxpinn-mount-fix installed! Here is the new file structure! \e[0m" echo -e "\e[32m ============================================================ \e[0m" mount && df -h echo -e "\e[32m ============================================================ \e[0m" echo -e "\e[32m sdxpinn-mount-fix installed! New file structure above! \e[0m" -# Handle bundled packages based on detection results -BUNDLED_PACKAGES="libinotifytools inotifywait" - -# Check if the detected packages file exists and read its content -if [ -f "$DETECTED_PACKAGES_FILE" ]; then - SKIP_PACKAGES=$(cat "$DETECTED_PACKAGES_FILE") - echo "Skipping the following pre-installed bundled packages: $SKIP_PACKAGES" -else - SKIP_PACKAGES="" -fi - -# Update the bundled packages in the add_opkg_status_bundled script dynamically -for bundled_package_name in $BUNDLED_PACKAGES; do - if echo "$SKIP_PACKAGES" | grep -q "$bundled_package_name"; then - echo "Skipping bundled package: $bundled_package_name" - # Delete the corresponding lines from add_opkg_status_bundled if the package is already installed - sed -i "/Package: $bundled_package_name/,+5d" "$INIT_SCRIPT" - else - handle_bundled_postinst "$bundled_package_name" - fi -done - -# If the resulting BUNDLED_PACKAGES_INFO in add_opkg_status_bundled is empty, remove it -if ! grep -q "Package:" "$INIT_SCRIPT"; then - echo "All bundled packages are pre-installed or removed. Removing $INIT_SCRIPT." - rm -f "$INIT_SCRIPT" -else - # Enable and start the updated add_opkg_status_bundled script - echo "Updated $INIT_SCRIPT with remaining bundled package info." - service add_opkg_status_bundled start -fi - exit 0 diff --git a/ipk-source/sdxpinn-mount-fix/CONTROL/preinst b/ipk-source/sdxpinn-mount-fix/CONTROL/preinst index b1d16be..f3a0d4f 100755 --- a/ipk-source/sdxpinn-mount-fix/CONTROL/preinst +++ b/ipk-source/sdxpinn-mount-fix/CONTROL/preinst @@ -1,63 +1,120 @@ #!/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" + + # 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 + + # Mount layer 2 /etc back + /bin/mount --bind /usrdata/etc /etc + + # 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 + 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" + + # 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 "This package is meant to be installed once after a clean flash." - echo "You should not upgrade or reinstall it. Flash first then run the toolkit otherwise." - exit 1 + echo "Upgrade scenario detected." + mount_factory + service mount-fix disable + rm /usrdata/etc/rc.d/S03mount-fix + 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 / -# Define the location of detected packages file -DETECTED_PACKAGES_FILE="/tmp/detected_packages.tmp" -LIST_FILE_DELETED=false - -# Clear temp file before begining -rm -f "$DETECTED_PACKAGES_FILE" -# Function to check if a specific bundled package is already installed and delete its list file -detect_and_remove_list_files() { - local package_name="$1" - local list_file="/usr/lib/opkg/info/${package_name}.list" - - # Check if the bundled package is installed by checking its .list file - if [ -f "$list_file" ]; then - echo "$package_name is already installed. Deleting its $list_file to avoid future conflicts." - rm -f "$list_file" - echo "$package_name" >> "$DETECTED_PACKAGES_FILE" - LIST_FILE_DELETED=true - else - echo "$package_name is not currently installed." - echo "$package_name is included in this package and will be installed." - fi -} - -# Check for installed packages and handle accordingly -detect_and_remove_list_files "libinotifytools" -detect_and_remove_list_files "inotifywait" - -# Report if any packages were detected and list them -if [ -f "$DETECTED_PACKAGES_FILE" ]; then - echo "Detected the following installed packages, which were handled to avoid clashes:" - cat "$DETECTED_PACKAGES_FILE" -else - echo "No pre-existing bundled packages detected." -fi - -# If any list files were deleted, show a warning message at the end of the script -if [ "$LIST_FILE_DELETED" = true ]; then - echo -e "\e[31m================================================\e[0m" - echo -e "\e[31mPre-bundled packages detected\e[0m" - echo -e "\e[32mAssociation between said packages and respective files has been removed\e[0m" - echo -e "\e[31m================================================\e[0m" - echo -e "\e[31mopkg will fail now\e[0m" - echo -e "\e[32mYou need to try installing this package again\e[0m" - echo -e "\e[32mThen it will work\e[0m" - echo -e "\e[31m================================================\e[0m" - echo -e "\e[32m================================================\e[0m" -fi - # Check if /etc is mounted if grep -qs '/etc' /proc/mounts; then echo "Unmounting /etc..." diff --git a/ipk-source/sdxpinn-mount-fix/CONTROL/prerm b/ipk-source/sdxpinn-mount-fix/CONTROL/prerm deleted file mode 100755 index 34d30d9..0000000 --- a/ipk-source/sdxpinn-mount-fix/CONTROL/prerm +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/ash - -service init-overlay-watchdog stop -service mount-fix stop -sleep 1 -service mount-fix disable -service init-overlay-watchdog disable -echo "Filesystem structure returned to Quectel Stock" -echo "Backup exists at /data/rootfs" -exit 0 \ No newline at end of file diff --git a/ipk-source/sdxpinn-mount-fix/root/etc/init.d/add_opkg_status_bundled b/ipk-source/sdxpinn-mount-fix/root/etc/init.d/add_opkg_status_bundled deleted file mode 100755 index 67f40d4..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/etc/init.d/add_opkg_status_bundled +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/ash /etc/rc.common -USE_PROCD=1 -START=99 -STOP=15 - -# Define variables for bundled packages and status file -STATUS_FILE="/usr/lib/opkg/status" - -# Bundled package information to be added -BUNDLED_PACKAGES_INFO=" -Package: libinotifytools -Version: 3.20.11.0-1 -Depends: libc -Status: install user installed -Architecture: aarch64_cortex-a53 -Installed-Time: $(date +%s) - -Package: inotifywait -Version: 3.20.11.0-1 -Depends: libc, libinotifytools -Status: install user installed -Architecture: aarch64_cortex-a53 -Installed-Time: $(date +%s) -" - -start_service() { - echo "Starting add_opkg_status_bundled service in the background..." - - # Run the service in the background using procd - procd_open_instance - procd_set_param command /bin/sh -c "( - echo 'Waiting for 4 seconds...' - sleep 4 - - # Append the package information to the status file - echo 'Adding bundled package entries to $STATUS_FILE...' - echo \"$BUNDLED_PACKAGES_INFO\" >> \"$STATUS_FILE\" - - # Sync filesystem to ensure changes are saved - sync - - # Verify if the entries were added correctly - if grep -q 'Package: libinotifytools' \"$STATUS_FILE\" && grep -q 'Package: inotifywait' \"$STATUS_FILE\"; then - echo 'Successfully added bundled package entries to $STATUS_FILE' - else - echo 'Error: Failed to add bundled package entries to $STATUS_FILE' - fi - - # Self-remove the init script after execution - echo 'Cleaning up: Removing /etc/init.d/add_opkg_status_bundled' - rm -f /etc/init.d/add_opkg_status_bundled - echo 'add_opkg_status_bundled service completed and removed.' - ) &" - procd_close_instance -} - -stop_service() { - echo "Stopping add_opkg_status_bundled service (if running)..." -} - diff --git a/ipk-source/sdxpinn-mount-fix/root/etc/init.d/init-overlay-watchdog b/ipk-source/sdxpinn-mount-fix/root/etc/init.d/init-overlay-watchdog deleted file mode 100755 index 74c4c04..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/etc/init.d/init-overlay-watchdog +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/ash /etc/rc.common - -START=04 -USE_PROCD=1 - -start_service() { - procd_open_instance - procd_set_param command /usr/sbin/init-overlay-watchdog.sh - procd_set_param respawn 3600 5 5 - procd_set_param stdout 1 - procd_set_param stderr 1 - procd_set_param pidfile /var/run/init-overlay-watchdog.pid - procd_set_param tracking - procd_close_instance -} - -stop_service() { - echo "Stopping init-overlay-watchdog service" - # `procd` will handle stopping the service and its processes -} diff --git a/ipk-source/sdxpinn-mount-fix/root/etc/init.d/mount-fix b/ipk-source/sdxpinn-mount-fix/root/etc/init.d/mount-fix index 140cfe7..7d36d34 100755 --- a/ipk-source/sdxpinn-mount-fix/root/etc/init.d/mount-fix +++ b/ipk-source/sdxpinn-mount-fix/root/etc/init.d/mount-fix @@ -98,8 +98,12 @@ handle_old_firmware() { /bin/mount --move /real_rootfs/cache /cache /bin/mount --move /real_rootfs/data /data - # Synchronize between /etc/rc.d and /real_rootfs/etc/rc.d - synchronize_rc_d "/etc/rc.d" "/real_rootfs/etc/rc.d" + # Synchronize rc.d + synchronize_rc_d "/real_rootfs/etc/rc.d" "/etc/rc.d" + + # Bind the orignal rc.d back and make writable + /bin/mount -o bind,rw /real_rootfs/etc/rc.d /etc/rc.d + /bin/mount -o remount,rw /etc/rc.d # Final logs and remount the original root as read-only /bin/echo "...and we're back! The original root now lives at /real_rootfs" @@ -192,12 +196,15 @@ handle_new_firmware() { /bin/mount --move /real_rootfs/systemrw /systemrw /bin/mount --move /real_rootfs/persist /persist + # Synchronize between rc.d layer 1 to Final + synchronize_rc_d "/real_rootfs/etc/rc.d" "/etc/rc.d" - # Synchronize between /etc/rc.d and /real_rootfs/etc/rc.d - synchronize_rc_d "/etc/rc.d" "/real_rootfs/etc/rc.d" - - # Synchronize between /etc/rc.d and /usrdata/etc/rc.d - synchronize_rc_d "/etc/rc.d" "/usrdata/etc/rc.d" + # Synchronize between rc.d layer 2 to Final + synchronize_rc_d "/usrdata/etc/rc.d" "/etc/rc.d" + + # Bind the orignal rc.d back and make writable + /bin/mount -o bind,rw /real_rootfs/etc/rc.d /etc/rc.d + /bin/mount -o remount,rw /etc/rc.d # Final logs and remount the original root as read-only /bin/echo "...and we're back! The original root now lives at /real_rootfs" @@ -211,7 +218,6 @@ handle_new_firmware() { synchronize_rc_d() { local source_dir="$1" local target_dir="$2" - /bin/echo "Synchronizing $source_dir with $target_dir" for link in "$source_dir"/*; do if [ -L "$link" ]; then @@ -222,13 +228,12 @@ synchronize_rc_d() { fi fi done - for link in "$target_dir"/*; do if [ -L "$link" ]; then link_name=$(basename "$link") if [ ! -e "$source_dir/$link_name" ]; then - /bin/echo "Removing $link_name from $target_dir" - rm "$target_dir/$link_name" + /bin/echo "Copying $link_name to $source_dir" + cp -a "$link" "$source_dir/$link_name" fi fi done @@ -286,7 +291,7 @@ stop_handle_new_firmware() { /bin/umount -lf /rootfs >/dev/null 2>&1 # Mount layer 2 /etc back - /bin/mount -t ubifs -o rw,relatime,bulk_read,assert=read-only,ubi=2,vol=0 /dev/ubi2_0 /etc + /bin/mount --bind /usrdata/etc /etc # 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 diff --git a/ipk-source/sdxpinn-mount-fix/root/tmp/distfeeds.conf b/ipk-source/sdxpinn-mount-fix/root/tmp/distfeeds.conf deleted file mode 100644 index f44a8cb..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/tmp/distfeeds.conf +++ /dev/null @@ -1,46 +0,0 @@ -# src/gz openwrt_core https://downloads.openwrt.org/releases/22.03.5/targets/sdx75/generic/packages -src/gz openwrt_base https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/base -src/gz openwrt_luci https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/luci -src/gz openwrt_packages https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/packages -# src/gz openwrt_qtiagm https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiagm -# src/gz openwrt_qtiargs https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiargs -# src/gz openwrt_qtiaudio https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiaudio -# src/gz openwrt_qtiaudioprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiaudioprop -# src/gz openwrt_qtibsp https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtibsp -# src/gz openwrt_qtibspprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtibspprop -# src/gz openwrt_qtibt https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtibt -# src/gz openwrt_qtibtprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtibtprop -# src/gz openwrt_qticore https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qticore -# src/gz openwrt_qticoreinternal https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qticoreinternal -# src/gz openwrt_qticoreprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qticoreprop -# src/gz openwrt_qtictainternal https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtictainternal -# src/gz openwrt_qtidata https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtidata -# src/gz openwrt_qtidatainternal https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtidatainternal -# src/gz openwrt_qtidataprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtidataprop -# src/gz openwrt_qtiipq https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiipq -# src/gz openwrt_qtiipqezmesh https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiipqezmesh -# src/gz openwrt_qtiipqprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiipqprop -# src/gz openwrt_qtilocation https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtilocation -# src/gz openwrt_qtilocationinternal https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtilocationinternal -# src/gz openwrt_qtilocationprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtilocationprop -# src/gz openwrt_qtimsdcprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtimsdcprop -# src/gz openwrt_qtinternal https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtinternal -# src/gz openwrt_qtipal https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtipal -# src/gz openwrt_qtiperfprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiperfprop -# src/gz openwrt_qtippatprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtippatprop -# src/gz openwrt_qtiquectel https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiquectel -# src/gz openwrt_qtiquectelprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiquectelprop -# src/gz openwrt_qtirilprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtirilprop -# src/gz openwrt_qtisecurity https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtisecurity -# src/gz openwrt_qtisecurityinternal https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtisecurityinternal -# src/gz openwrt_qtisecurityprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtisecurityprop -# src/gz openwrt_qtisensorsinternal https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtisensorsinternal -# src/gz openwrt_qtisensorsprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtisensorsprop -# src/gz openwrt_qtissdk https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtissdk -# src/gz openwrt_qtissmgr https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtissmgr -# src/gz openwrt_qtissmgrprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtissmgrprop -# src/gz openwrt_qtiwlan https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiwlan -# src/gz openwrt_qtiwlanprop https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/qtiwlanprop -src/gz openwrt_routing https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/routing -# Added by iamromulan: -src/gz openwrt_telephony https://downloads.openwrt.org/releases/22.03.5/packages/aarch64_cortex-a53/telephony/ diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/bin/inotifywait b/ipk-source/sdxpinn-mount-fix/root/usr/bin/inotifywait deleted file mode 100755 index f679cca70033fba4adf16da0c4574f1d3f0e9cdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24571 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 W-<|gv_k1ts4zBwD>3YEbU;ppbhOmAB diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/bin/rc_sync b/ipk-source/sdxpinn-mount-fix/root/usr/bin/rc_sync deleted file mode 100755 index f9a5c50..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/usr/bin/rc_sync +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/ash -# Paths to monitor and synchronize -WATCH_DIR="/etc/rc.d" -TARGET_DIR1="/real_rootfs/etc/rc.d" -TARGET_DIR2="/usrdata/etc/rc.d" - -# Function to check if a path is a mountpoint -is_mountpoint() { - grep -q " $1 " /proc/mounts - return $? -} - -# Function to synchronize init scripts -synchronize_init_scripts() { - # Ensure /real_rootfs is writable for updates - mount -o remount,rw /real_rootfs - - # Synchronize with TARGET_DIR1 - echo "Synchronizing $WATCH_DIR with $TARGET_DIR1..." - for link in "$WATCH_DIR"/*; do - if [ -L "$link" ]; then - link_name=$(basename "$link") - if [ ! -e "$TARGET_DIR1/$link_name" ] || [ "$link" -nt "$TARGET_DIR1/$link_name" ]; then - cp -af "$link" "$TARGET_DIR1/$link_name" - fi - fi - done - - for link in "$TARGET_DIR1"/*; do - if [ -L "$link" ]; then - link_name=$(basename "$link") - if [ ! -e "$WATCH_DIR/$link_name" ]; then - rm -f "$TARGET_DIR1/$link_name" - fi - fi - done - - # Synchronize with TARGET_DIR2 only if /usrdata is a mountpoint - if is_mountpoint "/usrdata"; then - echo "Synchronizing $WATCH_DIR with $TARGET_DIR2..." - for link in "$WATCH_DIR"/*; do - if [ -L "$link" ]; then - link_name=$(basename "$link") - if [ ! -e "$TARGET_DIR2/$link_name" ] || [ "$link" -nt "$TARGET_DIR2/$link_name" ]; then - cp -af "$link" "$TARGET_DIR2/$link_name" - fi - fi - done - - for link in "$TARGET_DIR2"/*; do - if [ -L "$link" ]; then - link_name=$(basename "$link") - if [ ! -e "$WATCH_DIR/$link_name" ]; then - rm -f "$TARGET_DIR2/$link_name" - fi - fi - done - fi - - # Restore /real_rootfs to read-only - mount -o remount,ro /real_rootfs -} - -# Run synchronization -synchronize_init_scripts -exit 0 diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/lib/libinotifytools.so b/ipk-source/sdxpinn-mount-fix/root/usr/lib/libinotifytools.so deleted file mode 100644 index e1c9156425f2cf5460f87ff495896358de9dcfa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32771 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

72Hh^{p=Z&6tY;xqN{$hv2J~e`_5f3>M$rBgl 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

72Hh^{p=Z&6tY;xqN{$hv2J~e`_5f3>M$rBgl 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

72Hh^{p=Z&6tY;xqN{$hv2J~e`_5f3>M$rBgl zJgsojR-Yq>@!JmCcC?p$%eQpRRsJf+AN5@}{-le+K9jhkoIkRL7cdm9NaRAv)e{`L zS4xjZad`*mJ2VFZ|?e(N)esoGy9sj$Z^wr<9$-}>JfxJLbsS8%+7`rjMi-jSECkFkEr zKXm5pg-@f^5`{A(F9pQjQPyu9r{qNwuTk-vG2{d->e-xdFR%KSps7Z&)tSs>{6 EU#&| -Architecture: aarch64_cortex-a53 -Installed-Size: 9023 -Description: inotify-tools is a C library and a set of command-line programs for - Linux providing a simple interface to inotify. These programs can be - used to monitor and act upon filesystem events. A more detailed - description of the programs is further down the page. The programs are - written in C and have no dependencies other than a Linux kernel - supporting inotify. - - This package provides the inotifywait tool. diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.list b/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.list deleted file mode 100644 index 54b8cf5..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.list +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/inotifywait diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.postinst b/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.postinst deleted file mode 100755 index 3bba77c..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.postinst +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -[ "${IPKG_NO_SCRIPT}" = "1" ] && exit 0 -[ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 -. ${IPKG_INSTROOT}/lib/functions.sh -default_postinst $0 $@ diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.prerm b/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.prerm deleted file mode 100755 index 12d06ec..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/inotifywait.prerm +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -[ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 -. ${IPKG_INSTROOT}/lib/functions.sh -default_prerm $0 $@ diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.control b/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.control deleted file mode 100755 index ed2ce92..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.control +++ /dev/null @@ -1,20 +0,0 @@ -Package: libinotifytools -Version: 3.20.11.0-1 -Depends: libc -Source: feeds/packages/utils/inotify-tools -SourceName: libinotifytools -License: GPLv2 -LicenseFiles: COPYING -Section: libs -SourceDateEpoch: 1605477462 -Maintainer: Daniel Golle -Architecture: aarch64_cortex-a53 -Installed-Size: 13142 -Description: inotify-tools is a C library and a set of command-line programs for - Linux providing a simple interface to inotify. These programs can be - used to monitor and act upon filesystem events. A more detailed - description of the programs is further down the page. The programs are - written in C and have no dependencies other than a Linux kernel - supporting inotify. - - This package provides the libinotifytools shared library. diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.list b/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.list deleted file mode 100755 index 402af38..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.list +++ /dev/null @@ -1,3 +0,0 @@ -/usr/lib/libinotifytools.so.0.4.1 -/usr/lib/libinotifytools.so -/usr/lib/libinotifytools.so.0 diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.postinst b/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.postinst deleted file mode 100755 index 3bba77c..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.postinst +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -[ "${IPKG_NO_SCRIPT}" = "1" ] && exit 0 -[ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 -. ${IPKG_INSTROOT}/lib/functions.sh -default_postinst $0 $@ diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.prerm b/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.prerm deleted file mode 100755 index 12d06ec..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/usr/lib/opkg/info/libinotifytools.prerm +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -[ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0 -. ${IPKG_INSTROOT}/lib/functions.sh -default_prerm $0 $@ diff --git a/ipk-source/sdxpinn-mount-fix/root/usr/sbin/init-overlay-watchdog.sh b/ipk-source/sdxpinn-mount-fix/root/usr/sbin/init-overlay-watchdog.sh deleted file mode 100755 index e1322c9..0000000 --- a/ipk-source/sdxpinn-mount-fix/root/usr/sbin/init-overlay-watchdog.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/ash - -# Paths to monitor and synchronize -WATCH_DIR="/etc/rc.d" -TARGET_DIR1="/real_rootfs/etc/rc.d" -TARGET_DIR2="/usrdata/etc/rc.d" -LOG_FILE="/tmp/init-overlay-watchdog.log" - -# Function to synchronize init scripts -synchronize_init_scripts() { - # Ensure /real_rootfs is writable for updates - mount -o remount,rw /real_rootfs - - # Synchronize with TARGET_DIR1 - echo "Synchronizing $WATCH_DIR with $TARGET_DIR1..." - for link in "$WATCH_DIR"/*; do - if [ -L "$link" ]; then - link_name=$(basename "$link") - if [ ! -e "$TARGET_DIR1/$link_name" ] || [ "$link" -nt "$TARGET_DIR1/$link_name" ]; then - cp -af "$link" "$TARGET_DIR1/$link_name" - fi - fi - done - - for link in "$TARGET_DIR1"/*; do - if [ -L "$link" ]; then - link_name=$(basename "$link") - if [ ! -e "$WATCH_DIR/$link_name" ]; then - rm -f "$TARGET_DIR1/$link_name" - fi - fi - done - - # Synchronize with TARGET_DIR2 if /usrdata exists - if [ -d "/usrdata" ]; then - echo "Synchronizing $WATCH_DIR with $TARGET_DIR2..." - for link in "$WATCH_DIR"/*; do - if [ -L "$link" ]; then - link_name=$(basename "$link") - if [ ! -e "$TARGET_DIR2/$link_name" ] || [ "$link" -nt "$TARGET_DIR2/$link_name" ]; then - cp -af "$link" "$TARGET_DIR2/$link_name" - fi - fi - done - - for link in "$TARGET_DIR2"/*; do - if [ -L "$link" ]; then - link_name=$(basename "$link") - if [ ! -e "$WATCH_DIR/$link_name" ]; then - rm -f "$TARGET_DIR2/$link_name" - fi - fi - done - fi - - # Restore /real_rootfs to read-only - mount -o remount,ro /real_rootfs -} - -# 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 - -# Initial synchronization -synchronize_init_scripts - -# Monitor WATCH_DIR for changes using inotifywait -while true; do - inotifywait -e create,delete,modify,move "$WATCH_DIR" - synchronize_init_scripts -done - diff --git a/ipk-source/sdxpinn-mount-fix/root/usrdata/etc/init.d/mount-fix b/ipk-source/sdxpinn-mount-fix/root/usrdata/etc/init.d/mount-fix new file mode 100755 index 0000000..7d36d34 --- /dev/null +++ b/ipk-source/sdxpinn-mount-fix/root/usrdata/etc/init.d/mount-fix @@ -0,0 +1,343 @@ +#!/bin/sh /etc/rc.common + +START=03 + +LOG_FILE="/tmp/mount-fix.log" + +start() { + # 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 + + echo "Begin mount fix process to make a usable userspace." + + # Determine firmware scenario + if mount | grep -q "/usrdata"; then + echo "New firmware scenario detected (with /usrdata)." + handle_new_firmware + elif mount | grep -q "/overlay"; then + echo "Old firmware scenario detected (with /overlay)." + handle_old_firmware + else + echo "Error: Unable to detect firmware scenario. Neither /usrdata nor /overlay mounts found. Exiting." + exit 1 + fi +} + +handle_old_firmware() { + # Redirect all output (stdout and stderr) to the log file + exec >>"$LOG_FILE" 2>&1 + /bin/echo "Begin mount fix process to make a usable userspace" + + # Forcefully unmount /etc + /bin/echo "Unmounting the tiny overlay at /etc" + /bin/umount -lf /etc >/dev/null 2>&1 + + # Remount root filesystem as read-write + /bin/echo "Remounting / as read-write" + /bin/mount -o remount,rw / + + # Check if /overlay/etc-upper/merged.done exists + /bin/echo "First time this is ran the stuff you have been putting in the old overlay needs merged." + /bin/echo "Looking for evidence that this has already happened..." + if [ ! -f /overlay/etc-upper/merged.done ]; then + /bin/echo "/overlay/etc-upper/merged.done not found, merging /overlay/etc-upper/* to /etc/" + cp -rf /overlay/etc-upper/* /etc/ + /bin/touch /overlay/etc-upper/merged.done + else + /bin/echo "/overlay/etc-upper/merged.done found, skipping merge" + fi + + # Unmount /overlay + /bin/echo "Unmounting the no longer needed /overlay" + /bin/umount /overlay + + # Check if /etc/opkg.conf has a line containing "option overlay_root /overlay" and remove it if it exists + /bin/echo "Lets be sure your opkg config isn't using the old overlay" + if grep -q "option overlay_root /overlay" /etc/opkg.conf; then + /bin/echo "Removing 'option overlay_root /overlay' from /etc/opkg.conf" + sed -i '/option overlay_root \/overlay/d' /etc/opkg.conf + else + /bin/echo "'option overlay_root /overlay' not found in /etc/opkg.conf, no changes made" + fi + + # Ensure necessary directories exist for overlay and pivot_root + /bin/echo "Creating new overlay system" + if [ ! -d /data/rootfs ]; then + mkdir -p /data/rootfs + fi + if [ ! -d /data/rootfs-workdir ]; then + mkdir -p /data/rootfs-workdir + fi + if [ ! -d /rootfs ]; then + mkdir -p /rootfs + fi + + # Mount the new overlay filesystem + /bin/mount -t overlay overlay -o lowerdir=/,upperdir=/data/rootfs,workdir=/data/rootfs-workdir /rootfs + + # Create the real_rootfs directory in the new root + if [ ! -d /rootfs/real_rootfs ]; then + mkdir -p /rootfs/real_rootfs + fi + + # Pivot root to the new root + /bin/echo "Pivoting Root / to /rootfs; Be back soon!!" + /sbin/pivot_root /rootfs /rootfs/real_rootfs >/dev/null 2>&1 + + # Move the mounted filesystems to the new locations + /bin/mount --move /real_rootfs/sys /sys + /bin/mount --move /real_rootfs/proc /proc + /bin/mount --move /real_rootfs/tmp /tmp + /bin/mount --move /real_rootfs/dev /dev + /bin/mount --move /real_rootfs/firmware /firmware + /bin/mount --move /real_rootfs/persist /persist + /bin/mount --move /real_rootfs/cache /cache + /bin/mount --move /real_rootfs/data /data + + # Synchronize rc.d + synchronize_rc_d "/real_rootfs/etc/rc.d" "/etc/rc.d" + + # Bind the orignal rc.d back and make writable + /bin/mount -o bind,rw /real_rootfs/etc/rc.d /etc/rc.d + /bin/mount -o remount,rw /etc/rc.d + + # Final logs and remount the original root as read-only + /bin/echo "...and we're back! The original root now lives at /real_rootfs" + /bin/echo "Lets mount it as read-only for now, If you need it just remount it as read-write" + /bin/mount -o remount,ro /real_rootfs >/dev/null 2>&1 + /bin/echo "Overlay and pivot_root setup completed" +} + +handle_new_firmware() { + # Redirect all output (stdout and stderr) to the log file + exec >>"$LOG_FILE" 2>&1 + /bin/echo "Begin mount fix process to make a usable userspace" + + # Forcefully unmount /etc + /bin/echo "Unmounting the 2 mounts over /etc" + /bin/umount -lf /etc >/dev/null 2>&1 + /bin/umount -lf /etc >/dev/null 2>&1 + + # Remount root filesystem as read-write + /bin/echo "Remounting / as read-write" + /bin/mount -o remount,rw / + + # Begin layer merge checks + # Layer 1 to 2 + # Check if /overlay/etc-upper/merged.done exists + /bin/echo "First time this is ran the stuff you have been putting in the old overlay and /usrdata/etc needs merged." + /bin/echo "Looking for evidence that this has already happened..." + if [ ! -f /usrdata/overlay-work/etc-upper/merged.done ]; then + /bin/echo "/usrdata/overlay-work/etc-upper/merged.done not found, merging /usrdata/overlay-work/etc-upper/* to /usrdata/etc/" + cp -rf /usrdata/overlay-work/etc-upper/* /usrdata/etc/ + /bin/touch /usrdata/overlay-work/etc-upper/merged.done + else + /bin/echo "/usrdata/overlay-work/etc-upper/merged.done found, skipping merge" + fi + # Layer 2 to 3 + # Check if /usrdata/etc/merged.done exists + /bin/echo "First time this is ran the stuff you have been putting in /usrdata/etc and /etc needs merged." + /bin/echo "Looking for evidence that this has already happened..." + if [ ! -f /usrdata/etc/merged.done ]; then + /bin/echo "/usrdata/etc/merged.done not found, merging /usrdata/etc/* to /etc/" + cp -rf /usrdata/etc/* /etc/ + /bin/touch /usrdata/etc/merged.done + else + /bin/echo "/usrdata/etc/merged.done found, skipping merge" + fi + + + # Check if /etc/opkg.conf has a line containing "option overlay_root /overlay" and remove it if it exists + /bin/echo "Lets be sure your opkg config isn't using the old overlay" + if grep -q "option overlay_root /overlay" /etc/opkg.conf; then + /bin/echo "Removing 'option overlay_root /overlay' from /etc/opkg.conf" + sed -i '/option overlay_root \/overlay/d' /etc/opkg.conf + else + /bin/echo "'option overlay_root /overlay' not found in /etc/opkg.conf, no changes made" + fi + + # Ensure necessary directories exist for overlay and pivot_root + /bin/echo "Creating new overlay system" + if [ ! -d /usrdata/rootfs ]; then + mkdir -p /usrdata/rootfs + fi + if [ ! -d /usrdata/rootfs-workdir ]; then + mkdir -p /usrdata/rootfs-workdir + fi + if [ ! -d /rootfs ]; then + mkdir -p /rootfs + fi + + # Mount the new overlay filesystem + /bin/mount -t overlay overlay -o lowerdir=/,upperdir=/usrdata/rootfs,workdir=/usrdata/rootfs-workdir /rootfs + + # Create the real_rootfs directory in the new root + if [ ! -d /rootfs/real_rootfs ]; then + mkdir -p /rootfs/real_rootfs + fi + + # Pivot root to the new root + /bin/echo "Pivoting Root / to /rootfs; Be back soon!!" + /sbin/pivot_root /rootfs /rootfs/real_rootfs >/dev/null 2>&1 + + # Move the mounted filesystems to the new locations + /bin/mount --move /real_rootfs/sys /sys + /bin/mount --move /real_rootfs/proc /proc + /bin/mount --move /real_rootfs/tmp /tmp + /bin/mount --move /real_rootfs/dev /dev + /bin/mount --move /real_rootfs/firmware /firmware + /bin/mount --move /real_rootfs/usrdata /usrdata + /bin/mount --move /real_rootfs/data /data + /bin/mount --move /real_rootfs/cache /cache + /bin/mount --move /real_rootfs/systemrw /systemrw + /bin/mount --move /real_rootfs/persist /persist + + # Synchronize between rc.d layer 1 to Final + synchronize_rc_d "/real_rootfs/etc/rc.d" "/etc/rc.d" + + # Synchronize between rc.d layer 2 to Final + synchronize_rc_d "/usrdata/etc/rc.d" "/etc/rc.d" + + # Bind the orignal rc.d back and make writable + /bin/mount -o bind,rw /real_rootfs/etc/rc.d /etc/rc.d + /bin/mount -o remount,rw /etc/rc.d + + # Final logs and remount the original root as read-only + /bin/echo "...and we're back! The original root now lives at /real_rootfs" + /bin/echo "Lets mount it as read-only for now, If you need it just remount it as read-write" + /bin/mount -o remount,ro /real_rootfs >/dev/null 2>&1 + /bin/echo "Overlay and pivot_root setup completed" + +} + + +synchronize_rc_d() { + local source_dir="$1" + local target_dir="$2" + /bin/echo "Synchronizing $source_dir with $target_dir" + for link in "$source_dir"/*; do + if [ -L "$link" ]; then + link_name=$(basename "$link") + if [ ! -e "$target_dir/$link_name" ]; then + /bin/echo "Copying $link_name to $target_dir" + cp -a "$link" "$target_dir/$link_name" + fi + fi + done + for link in "$target_dir"/*; do + if [ -L "$link" ]; then + link_name=$(basename "$link") + if [ ! -e "$source_dir/$link_name" ]; then + /bin/echo "Copying $link_name to $source_dir" + cp -a "$link" "$source_dir/$link_name" + fi + fi + done +} + +stop() { + # 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 + + # 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" + + # 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 + + # Mount layer 2 /etc back + /bin/mount --bind /usrdata/etc /etc + + # 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 + 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" + + # 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" +} + +restart() { + /bin/echo "This script should only be executed once at boot" + /bin/echo "Use Stop to undo the pivot" + /bin/echo "Use Start to put it back" +}