FunKey-OS/Recovery/board/funkey/rootfs-overlay/usr/local/sbin/menu

311 lines
5.9 KiB
Bash
Executable File

#!/bin/sh
source /usr/local/lib/utils
# Get a key
getkey() {
local key=$(dd if=/dev/input/event0 bs=32 count=1 status=none | xxd -p -c 32 | cut -b 21-26)
echo ${key}
}
# Display meny item
menu_display () {
local entry=${1}
case ${entry} in
0)
# Information
message=" INFO"
;;
1)
# USB mount/unmount
mount | grep -q /dev/mmcblk0p4
if [ $? -eq 0 ]; then
message=" USB MOUNT"
else
message=" USB UNMOUNT"
fi
;;
2)
# USB check
message=" USB CHECK"
;;
3)
# USB format
message=" USB FORMAT"
;;
4)
# Network enable/disable
if [ -e /mnt/usbnet ]; then
message=" NETWORK: ENABLED"
else
message=" NETWORK: DISABLED"
fi
;;
5)
# QR code
message=" QR CODE"
;;
6)
# Factory tests enable/disable
RUN_ENV_VAR=$(fw_printenv -n assembly_tests 2>/dev/null)
if [ "x${RUN_ENV_VAR}" == "x1" ]; then
message=" FACTORY TESTS: ENABLED"
else
message=" FACTORY TESTS: DISABLED"
fi
;;
7)
# First boot enable/disable
FIRST_BOOT_OK_ENV_VAR=$(fw_printenv -n first_boot_ok 2>/dev/null)
if [ "x${FIRST_BOOT_OK_ENV_VAR}" == "x1" ]; then
message=" FIRST BOOT: DISABLED"
else
message=" FIRST BOOT: ENABLED"
fi
;;
8)
# Exit Recovery
message=" EXIT RECOVERY"
;;
9)
# Shutdown
message=" SHUTDOWN"
;;
esac
notif set 0 "${message}"
}
# Run menu item
menu_run () {
local entry=${1}
case ${entry} in
0)
# Information
rootfs_mount=/tmp/rootfs
mkdir -p ${rootfs_mount}
mount -t ext4 -o ro /dev/mmcblk0p2 ${rootfs_mount}
if [ $? -ne 0 ]; then
version_rootfs="???"
else
version_rootfs=$(grep rootfs ${rootfs_mount}/etc/sw-versions | cut -f 2)
fi
umount ${rootfs_mount}
version_recovery=$(grep Recovery /etc/sw-versions | cut -f 2)
ip_addr=$(ifconfig usb0 | grep "inet " | awk -F'[: ]+' '{ print $4 }')
notif set 0 "${message}^^ Recovery: ${version_recovery}^ rootfs : ${version_rootfs}^ IP addr : ${ip_addr}"
;;
1)
# USB mount/unmount
mount | grep -q /dev/mmcblk0p4
if [ $? -eq 0 ]; then
notif set 0 "${message}..."
share start
if [ $? -ne 0 ]; then
notif set 0 "${message}...^CANNOT MOUNT USB!"
else
message=" USB UNMOUNT"
notif set 0 "${message}"
fi
else
notif set 0 "${message}..."
share stop
if [ $? -ne 0 ]; then
notif set 0 "${message}...^CANNOT UNMOUNT USB!"
else
for file in $(ls /mnt/FunKey-*.fwu); do
swupdate -i "${file}"
if [ $? -ne 0 ]; then
notif set 0 display 10 "${message}...^ CORRUPTED^ UPDATE FILE"
rm -f "${file}"
notif set 0 "^^^^^^^^ RESTARTING...^^^^^^^^"
normal_mode
fi
done
message=" USB MOUNT"
notif set 0 "${message}"
fi
fi
;;
2)
# USB check
mount | grep -q /dev/mmcblk0p4
if [ $? -eq 0 ]; then
notif set 0 "${message}..."
umount /mnt >/dev/null 2>&1
if [ $? -ne 0 ]; then
notif set 0 "${message}...^CANNOT CHECK USB!"
fi
fsck.fat -a -v -w /dev/mmcblk0p4
if [ $? -ne 0 ]; then
notif set 0 "${message}...^CANNOT CHECK USB!"
fi
mount /mnt
if [ $? -ne 0 ]; then
notif set 0 "${message}...^CANNOT CHECK USB!"
else
notif set 0 "${message} DONE"
fi
else
notif set 0 "${message}...^CANNOT CHECK USB WHEN MOUNTED!"
fi
;;
3)
# USB format
mount | grep -q /dev/mmcblk0p4
if [ $? -eq 0 ]; then
notif set 0 "${message}...^PRESS A TO CONFIRM"
while true; do
case $(getkey) in
1e0001|1e0002)
umount /mnt &&
mkfs.vfat /dev/mmcblk0p4 &&
mount /mnt
if [ $? -ne 0 ]; then
notif set 0 "${message}...^CANNOT FORMAT USB!"
else
notif set 0 "${message} DONE"
fi
break
;;
1e0000)
;;
*)
notif set 0 "${message}...^ABORTED!"
break
;;
esac
done
else
notif set 0 "${message}...^CANNOT FORMAT USB WHEN MOUNTED!"
fi
;;
4)
# Network enable/disable
mount | grep -q /dev/mmcblk0p4
if [ $? -eq 0 ]; then
if [ -e /mnt/usbnet ]; then
rm -f /mnt/usbnet
message=" NETWORK: DISABLED"
else
touch /mnt/usbnet
message=" NETWORK: ENABLED"
fi
notif set 0 "${message}"
else
notif set 0 "${message}...^CANNOT CHANGE NET IF MOUNTED!"
fi
;;
5)
# QR code
qrencode -o /tmp/qrcode.png "https://www.funkey-project.com/_functions/qrcode/$(get_sid)"
fbv -e /tmp/qrcode.png -d 1
;;
6)
# Factory tests enable/disable
RUN_ENV_VAR=$(fw_printenv -n assembly_tests 2>/dev/null)
if [ "x${RUN_ENV_VAR}" == "x1" ]; then
fw_setenv assembly_tests 0
message=" FACTORY TESTS: DISABLED"
else
fw_setenv assembly_tests 1
message=" FACTORY TESTS: ENABLED"
fi
notif set 0 "${message}"
;;
7)
# First boot enable/disable
FIRST_BOOT_OK_ENV_VAR=$(fw_printenv -n first_boot_ok 2>/dev/null)
if [ "x${FIRST_BOOT_OK_ENV_VAR}" == "x1" ]; then
fw_setenv first_boot_ok
message=" FIRST BOOT: ENABLED"
else
fw_setenv first_boot_ok 1
message=" FIRST BOOT: DISABLED"
fi
notif set 0 "${message}"
;;
8)
notif set 0 "^^^^^^^^ RESTARTING...^^^^^^^^"
normal_mode
;;
9)
notif set 0 "^^^^^^^^ SHUTDOWN...^^^^^^^^"
poweroff
;;
esac
}
# Display first menu entry
entry=0
menu_display ${entry}
# Recovery menu loop
while true; do
# Get key events
case $(getkey) in
160001|160002)
# Key UP pressed or repeat
let entry=${entry}-1
let entry=${entry}%9
if [ ${entry} -eq -1 ]; then
entry=8
fi
menu_display ${entry}
;;
200001|200002)
# Key DOWN pressed or repeat
let entry=${entry}+1
let entry=${entry}%9
menu_display ${entry}
;;
1e0001|1e0002)
# Key A pressed or repeat
menu_run ${entry}
;;
esac
done