#!/bin/sh # A/B partition management helper for SWUpdate # Print usage usage() { echo "Usage: $0 [OPTION]" echo "Manage A/B partitioning system for SWUpdate" echo "" echo "Options:" echo " -s, --status Show current partition status" echo " -t, --toggle Toggle active/inactive partitions" echo " -c, --commit Commit current boot (reset bootcount)" echo " -r, --reboot Reboot to apply changes" echo " -h, --help Show this help message" exit 1 } # Show current status show_status() { ACTIVE_PART=$(fw_printenv -n active_part 2>/dev/null || echo "Unknown") INACTIVE_PART=$(fw_printenv -n inactive_part 2>/dev/null || echo "Unknown") BOOTCOUNT=$(fw_printenv -n bootcount 2>/dev/null || echo "Unknown") BOOTLIMIT=$(fw_printenv -n bootlimit 2>/dev/null || echo "Unknown") echo "A/B Partition Status:" echo " Active partition: $ACTIVE_PART (/dev/mmcblk0p$([ "$ACTIVE_PART" = "A" ] && echo "2" || echo "3"))" echo " Inactive partition: $INACTIVE_PART (/dev/mmcblk0p$([ "$INACTIVE_PART" = "A" ] && echo "2" || echo "3"))" echo " Boot count: $BOOTCOUNT/$BOOTLIMIT" # Check if an update is pending if [ -e /tmp/swupdate.done ]; then echo " Update status: Completed, pending reboot" else echo " Update status: No recent update" fi } # Toggle active/inactive partitions toggle_partitions() { ACTIVE_PART=$(fw_printenv -n active_part) INACTIVE_PART=$(fw_printenv -n inactive_part) if [ "$ACTIVE_PART" = "A" ]; then NEW_ACTIVE="B" NEW_INACTIVE="A" NEW_ACTIVE_ROOT="/dev/mmcblk0p3" NEW_INACTIVE_ROOT="/dev/mmcblk0p2" else NEW_ACTIVE="A" NEW_INACTIVE="B" NEW_ACTIVE_ROOT="/dev/mmcblk0p2" NEW_INACTIVE_ROOT="/dev/mmcblk0p3" fi echo "Switching active partition from $ACTIVE_PART to $NEW_ACTIVE" fw_setenv active_part "$NEW_ACTIVE" fw_setenv inactive_part "$NEW_INACTIVE" fw_setenv active_root "$NEW_ACTIVE_ROOT" fw_setenv inactive_root "$NEW_INACTIVE_ROOT" fw_setenv bootcount 0 echo "Partition switch complete. Reboot to apply changes." } # Commit current boot (reset bootcount) commit_boot() { echo "Committing current boot by resetting bootcount" fw_setenv bootcount 0 echo "Bootcount reset to 0" } # Reboot system reboot_system() { echo "Rebooting system..." sync reboot } # Parse command line arguments if [ $# -eq 0 ]; then usage fi while [ $# -gt 0 ]; do case "$1" in -s|--status) show_status ;; -t|--toggle) toggle_partitions ;; -c|--commit) commit_boot ;; -r|--reboot) reboot_system ;; -h|--help) usage ;; *) echo "Unknown option: $1" usage ;; esac shift done exit 0