Fix to reboot in case of verityctl failure
[platform/core/system/system-recovery.git] / scripts / recovery-init.in
1 #!/bin/sh
2
3 PATH=/bin:/usr/bin:/sbin:/usr/sbin
4 SYSTEM_RECOVERY="@SYSTEM_RECOVERY_LIBEXEC_DIR@/system-recovery"
5 SYSTEM_RECOVERY_GUI="/usr/bin/system-recovery_gui"
6
7 MOUNT="/usr/bin/mount"
8 BLKID="/usr/sbin/blkid"
9 REBOOT="@INITRD_RECOVERY_LIBEXEC_DIR@/minireboot"
10 SYNC="/usr/bin/sync"
11 UMOUNT="/usr/bin/umount"
12 CUT="/usr/bin/cut"
13 LS="/usr/bin/ls"
14 MKDIR="/usr/bin/mkdir"
15 RMDIR="/usr/bin/rmdir"
16 TR="/usr/bin/tr"
17
18 FAKE_ROOT="/system-ro"
19 #------------------------------------------------
20 #       mount_usb_partitions
21 #------------------------------------------------
22 USB_MOUNTPOINT_PREFIX=@USB_MOUNTPOINT_ROOT@/@USB_MOUNTPOINT_PREFIX@
23 mount_usb_partitions() {
24     echo "mount USB partitions"
25     DEVICE_TYPE_LIST=(
26         ext4
27         vfat
28     )
29
30     LAST_MOUNTED_DEVICE=""
31     for DEVICE_TYPE in ${DEVICE_TYPE_LIST[@]}
32     do
33         DEVICES=""
34         for ((i=0; i<10; i++))
35         do
36             DEVICES=$("$BLKID" /dev/sd* -t TYPE="${DEVICE_TYPE}" -o device)
37             if [ ! -z "${DEVICES}" ]
38             then
39                 for DEVICE in ${DEVICES}
40                 do
41                     USB_MOUNTPOINT_INDEX=$(echo ${DEVICE} | "$CUT" -b 8- | "$TR" '[:lower:]' '[:upper:]')
42                     USB_MOUNTPOINT=${USB_MOUNTPOINT_PREFIX}${USB_MOUNTPOINT_INDEX}
43                     "$MKDIR" -p ${USB_MOUNTPOINT}
44                     "$MOUNT" -t ${DEVICE_TYPE} ${DEVICE} ${USB_MOUNTPOINT}
45
46                     LAST_MOUNTED_DEVICE=${DEVICE}
47                 done
48                 break
49             fi
50
51             sleep 1
52         done
53     done
54
55     if [ -z "${LAST_MOUNTED_DEVICE}" ]
56     then
57         echo "WARNING : USB not mounted"
58     fi
59 }
60
61 #------------------------------------------------
62 #       umount_usb_partitions
63 #------------------------------------------------
64 umount_usb_partitions() {
65     echo "umount USB partitions"
66     USB_MOUNTPOINTS=$("$LS" -d ${USB_MOUNTPOINT_PREFIX}*)
67     for USB_MOUNTPOINT in ${USB_MOUNTPOINTS}
68     do
69         "$UMOUNT" ${USB_MOUNTPOINT}
70         "$RMDIR" ${USB_MOUNTPOINT}
71     done
72 }
73
74 #------------------------------------------------
75 #       do_reboot
76 #------------------------------------------------
77 do_reboot() {
78     echo "Reboot"
79     "$SYNC"
80     "$REBOOT"
81     while [ 1 ]
82     do
83         sleep 1
84         echo "."
85     done
86 }
87
88 #------------------------------------------------
89 #       get partition id
90 #------------------------------------------------
91 get_partition_id() {
92     P_SLOT=$([[ $(</proc/cmdline) =~ partition_ab=([ab]) ]]; echo ${BASH_REMATCH[1]})
93     P_SUFFIX=""
94
95     if [ "${P_SLOT}" != "" ]; then
96         P_SUFFIX="_${P_SLOT}"
97         echo "Using A/B slot: ${P_SLOT}"
98     fi
99
100     PART_ROOTFS=`/sbin/blkid -t PARTLABEL=rootfs${P_SUFFIX} -o device -l`
101     if [ x$PART_ROOTFS = "x" ]
102     then
103         PART_ROOTFS=`/sbin/blkid -L rootfs`
104     fi
105
106     PART_SYSTEM_DATA=`/sbin/blkid -t PARTLABEL=system-data -o device -l`
107     if [ x$PART_SYSTEM_DATA = "x" ]
108     then
109         PART_SYSTEM_DATA=`/sbin/blkid -L system-data`
110     fi
111
112     PART_RAMDISK=`/sbin/blkid -t PARTLABEL=ramdisk${P_SUFFIX} -o device -l`
113     if [ x$PART_RAMDISK = "x" ]
114     then
115         PART_RAMDISK=`/sbin/blkid -L ramdisk`
116     fi
117
118     PART_HAL=`/sbin/blkid -t PARTLABEL=hal${P_SUFFIX} -o device -l`
119     if [ x$PART_HAL = "x" ]
120     then
121         PART_HAL=`/sbin/blkid -L hal`
122     fi
123
124     PART_USER=$("$BLKID" --match-token PARTLABEL=user -o device -l || "$BLKID" --match-token LABEL=user -o device -l)
125 }
126
127 #------------------------------------------------
128 #       mount_rootfs
129 #------------------------------------------------
130 mount_rootfs()
131 {
132         /usr/bin/verityctl create rootfs "${PART_ROOTFS}" "${FAKE_ROOT}"
133         case $? in
134             0)
135                 echo "verifyboot: disabled"
136                 # do nothing
137                 ;;
138             1)
139                 echo "verityboot: enabled";
140                 return
141                 ;;
142             2)
143                 echo "verifyboot: enabled but corrupted"
144                 do_reboot
145                 ;;
146             3)
147                 echo "verifyboot: disabling"
148                 ;;
149         esac
150         "$MOUNT" -o ro "${PART_ROOTFS}" "${FAKE_ROOT}"
151 }
152
153 #------------------------------------------------
154 #       mount_partitions
155 #------------------------------------------------
156 mount_partitions() {
157     get_partition_id
158
159     mount_rootfs
160     "$MOUNT" -t proc none ${FAKE_ROOT}/proc
161     "$MOUNT" -t sysfs none ${FAKE_ROOT}/sys
162     "$MOUNT" -t devtmpfs devtmpfs ${FAKE_ROOT}/dev
163     "$MOUNT" -t devpts devpts ${FAKE_ROOT}/dev/pts
164     "$MOUNT" -t tmpfs tmpfs ${FAKE_ROOT}/tmp
165 }
166
167 #------------------------------------------------
168 #       run_recovery_target
169 #------------------------------------------------
170 run_recovery_target() {
171     cd ${FAKE_ROOT}
172     exec /bin/chroot . /usr/lib/systemd/systemd --unit=recovery.target $@
173 }
174
175 #------------------------------------------------
176 #       system-recovery initrc
177 #------------------------------------------------
178 echo "Starting system recovery."
179 mount_usb_partitions
180
181 # For debugging - It should be deleted on Release
182 /sbin/agetty -l /bin/sh -n --keep-baud 115200,38400,9600 console linux &
183
184 [ -x "${SYSTEM_RECOVERY_GUI}" ] && "${SYSTEM_RECOVERY_GUI}" &
185 [ -x "${SYSTEM_RECOVERY}" ] && "${SYSTEM_RECOVERY}"
186
187 umount_usb_partitions
188 mount_partitions
189 run_recovery_target
190 do_reboot