#!/bin/sh SYSTEM_RECOVERY_GUI="@SYSTEM_RECOVERY_LIBEXEC_DIR@/system-recovery.gui" SYSTEM_RECOVERY_NON_GUI="@SYSTEM_RECOVERY_LIBEXEC_DIR@/system-recovery.non_gui" FAKE_ROOT=/system MOUNT="/usr/bin/mount" BLKID="/usr/sbin/blkid" REBOOT="@INITRD_RECOVERY_LIBEXEC_DIR@/minireboot" SYNC="/usr/bin/sync" UMOUNT="/usr/bin/umount" CUT="/usr/bin/cut" LS="/usr/bin/ls" MKDIR="/usr/bin/mkdir" RMDIR="/usr/bin/rmdir" TR="/usr/bin/tr" #------------------------------------------------ # get partition id #------------------------------------------------ get_partition_id() { PART_ROOTFS=$("$BLKID" --match-token PARTLABEL=ROOTFS -o device || "$BLKID" --match-token LABEL=rootfs -o device) PART_SYSTEM_DATA=$("$BLKID" --match-token PARTLABEL=SYSTEM-DATA -o device || "$BLKID" --match-token LABEL=system-data -o device) PART_USER=$("$BLKID" --match-token PARTLABEL=USER -o device || "$BLKID" --match-token LABEL=user -o device) } #------------------------------------------------ # mount_usb_partitions #------------------------------------------------ USB_MOUNTPOINT_PREFIX=${FAKE_ROOT}/opt/media/USBDrive mount_usb_partitions() { echo "mount USB partitions" DEVICE_TYPE_LIST=( ext4 vfat ) for DEVICE_TYPE in ${DEVICE_TYPE_LIST[@]} do DEVICES=$("$BLKID" /dev/sd?? -t TYPE="${DEVICE_TYPE}" -o device) for DEVICE in ${DEVICES} do USB_MOUNTPOINT_INDEX=$(echo ${DEVICE} | "$CUT" -b 8- | "$TR" '[:lower:]' '[:upper:]') USB_MOUNTPOINT=${USB_MOUNTPOINT_PREFIX}${USB_MOUNTPOINT_INDEX} "$MKDIR" ${USB_MOUNTPOINT} "$MOUNT" -t ${DEVICE_TYPE} ${DEVICE} ${USB_MOUNTPOINT} done done } #------------------------------------------------ # mount_partitions #------------------------------------------------ mount_partitions() { echo "mount partitions" get_partition_id "$MOUNT" -t ext4 ${PART_ROOTFS} ${FAKE_ROOT} -o ro "$MOUNT" -t ext4 ${PART_SYSTEM_DATA} ${FAKE_ROOT}/opt "$MOUNT" -t ext4 ${PART_USER} ${FAKE_ROOT}/opt/usr "$MOUNT" -t proc none ${FAKE_ROOT}/proc "$MOUNT" -t sysfs none ${FAKE_ROOT}/sys "$MOUNT" -t smackfs smackfs ${FAKE_ROOT}/sys/fs/smackfs "$MOUNT" -t devtmpfs devtmpfs ${FAKE_ROOT}/dev "$MOUNT" -t devpts devpts ${FAKE_ROOT}/dev/pts "$MOUNT" -t tmpfs tmpfs ${FAKE_ROOT}/tmp -o mode=1777,smackfsroot=* mount_usb_partitions } #------------------------------------------------ # umount_usb_partitions #------------------------------------------------ umount_usb_partitions() { echo "umount USB partitions" USB_MOUNTPOINTS=$("$LS" -d ${USB_MOUNTPOINT_PREFIX}*) for USB_MOUNTPOINT in ${USB_MOUNTPOINTS} do "$UMOUNT" ${USB_MOUNTPOINT} "$RMDIR" ${USB_MOUNTPOINT} done } #------------------------------------------------ # umount_partitions #------------------------------------------------ umount_partitions() { echo "umount partitions" "$SYNC" umount_usb_partitions "$UMOUNT" ${FAKE_ROOT}/opt/usr "$UMOUNT" ${FAKE_ROOT}/opt "$UMOUNT" ${FAKE_ROOT} } #------------------------------------------------ # do_reboot #------------------------------------------------ do_reboot() { echo "Reboot" "$SYNC" "$REBOOT" while [ 1 ] do sleep 1 echo "." done } #------------------------------------------------ # system-recovery initrc #------------------------------------------------ echo "Starting system recovery." mount_partitions # For debugging - It should be deleted on Release /sbin/agetty -l /bin/sh -n --keep-baud 115200,38400,9600 ttyS1 linux & [ -x "${SYSTEM_RECOVERY_GUI}" ] && "${SYSTEM_RECOVERY_GUI}" || "${SYSTEM_RECOVERY_NON_GUI}" umount_partitions do_reboot