110 lines
2.9 KiB
Bash
Executable File
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 |