Files
auracaster-os/package/swupdate-scripts/files/swupdate-ab-helper.sh
2025-04-17 13:21:38 +02:00

110 lines
2.9 KiB
Bash
Executable File

#!/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