init 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049
  1. #!/bin/bash
  2. # Last change: 07. Dec. 2016.
  3. # ============================================================
  4. # This is the standard Ubuntu initramfs initialization process
  5. # ============================================================
  6. # Default PATH differs between shells, and is not automatically exported
  7. # by klibc dash. Make it consistent.
  8. export PATH=/sbin:/usr/sbin:/bin:/usr/bin
  9. [ -d /dev ] || mkdir -m 0755 /dev
  10. [ -d /root ] || mkdir -m 0700 /root
  11. [ -d /sys ] || mkdir /sys
  12. [ -d /proc ] || mkdir /proc
  13. [ -d /tmp ] || mkdir /tmp
  14. mkdir -p /var/lock
  15. mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
  16. mount -t proc -o nodev,noexec,nosuid proc /proc
  17. # Some things don't work properly without /etc/mtab.
  18. ln -sf /proc/mounts /etc/mtab
  19. echo "1 1 1 1" > /proc/sys/kernel/printk
  20. grep -q '\<quiet\>' /proc/cmdline || echo "Loading, please wait..."
  21. # Note that this only becomes /dev on the real filesystem if udev's scripts
  22. # are used; which they will be, but it's worth pointing out
  23. if ! mount -t devtmpfs -o nosuid,mode=0755 udev /dev; then
  24. echo "W: devtmpfs not available, falling back to tmpfs for /dev"
  25. mount -t tmpfs -o nosuid,mode=0755 udev /dev
  26. [ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
  27. [ -e /dev/null ] || mknod /dev/null c 1 3
  28. fi
  29. mkdir /dev/pts
  30. mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
  31. #mount -t tmpfs -o "noexec,nosuid,size=80%,mode=0755" tmpfs /run
  32. #mkdir -m 0755 /run/initramfs
  33. # Export the dpkg architecture
  34. export DPKG_ARCH=
  35. . /conf/arch.conf
  36. # Set modprobe env
  37. export MODPROBE_OPTIONS="-qb"
  38. # Export relevant variables
  39. export ROOT=
  40. export ROOTDELAY=
  41. export ROOTFLAGS=
  42. export ROOTFSTYPE=
  43. export IP=
  44. export BOOT=
  45. export BOOTIF=
  46. export UBIMTD=
  47. export break=
  48. export init=/sbin/init
  49. export quiet=y
  50. export readonly=y
  51. export rootmnt=/root
  52. export debug=
  53. export panic=
  54. export blacklist=
  55. export resume=
  56. export resume_offset=
  57. export drop_caps=
  58. export fastboot=n
  59. export forcefsck=n
  60. export fsckfix=
  61. export recovery=
  62. export BOOT_CARDTYPE="unknown"
  63. export OTHER_CARDTYPE="unknown"
  64. export BOOT_CARDDEV="0"
  65. export OTHER_CARDDEV="9"
  66. export EDITOR="mcedit mc"
  67. # mdadm needs hostname to be set. This has to be done before the udev rules are called!
  68. if [ -f "/etc/hostname" ]; then
  69. /bin/hostname -F /etc/hostname >/dev/null 2>&1
  70. fi
  71. # Bring in the main config
  72. . /conf/initramfs.conf
  73. for conf in conf/conf.d/*; do
  74. [ -f ${conf} ] && . ${conf}
  75. done
  76. . /scripts/functions
  77. echo "1 1 1 1" > /proc/sys/kernel/printk
  78. BOOTDELAY=60
  79. DEFAULTBOOT="1"
  80. # Parse command line options
  81. for x in $(cat /proc/cmdline); do
  82. case $x in
  83. boot_card_type=*)
  84. BOOT_CARDTYPE=${x#boot_card_type=}
  85. ;;
  86. boot_card_dev=*)
  87. BOOT_CARDDEV=${x#boot_card_dev=}
  88. ;;
  89. boot_delay=*)
  90. BOOTDELAY="${x#boot_delay=}"
  91. case ${BOOTDELAY} in
  92. *[![:digit:].]*)
  93. BOOTDELAY=60
  94. ;;
  95. esac
  96. ;;
  97. default_boot=*)
  98. DEFAULTBOOT="${x#default_boot=}"
  99. ;;
  100. quiet)
  101. quiet=y
  102. ;;
  103. ro)
  104. readonly=y
  105. ;;
  106. rw)
  107. readonly=n
  108. ;;
  109. break=*)
  110. break=${x#break=}
  111. ;;
  112. break)
  113. break=premount
  114. ;;
  115. esac
  116. done
  117. # Default to BOOT=local if no boot script defined.
  118. if [ -z "${BOOT}" ]; then
  119. BOOT=local
  120. fi
  121. if [ -n "${noresume}" ]; then
  122. export noresume
  123. unset resume
  124. else
  125. resume=${RESUME:-}
  126. fi
  127. maybe_break top
  128. # export BOOT variable value for compcache,
  129. # so we know if we run from casper
  130. export BOOT
  131. # Don't do log messages here to avoid confusing graphical boots
  132. run_scripts /scripts/init-top
  133. #maybe_break modules
  134. #[ -n "${netconsole}" ] && modprobe netconsole netconsole="${netconsole}"
  135. load_modules
  136. maybe_break premount
  137. run_scripts /scripts/init-premount
  138. maybe_break mount
  139. # Always load local and nfs (since these might be needed for /etc or
  140. # /usr, irrespective of the boot script used to mount the rootfs).
  141. . /scripts/local
  142. . /scripts/nfs
  143. . /scripts/${BOOT}
  144. parse_numeric ${ROOT}
  145. maybe_break mountroot
  146. mount_top
  147. mount_premount
  148. #mountroot
  149. if read_fstab_entry /usr; then
  150. mountfs /usr
  151. fi
  152. # Mount cleanup
  153. mount_bottom
  154. nfs_bottom
  155. local_bottom
  156. chown 0:0 /bin/*
  157. chown 0:0 /sbin/*
  158. echo "1 1 1 1" > /proc/sys/kernel/printk
  159. sleep 1
  160. # === Variables ===
  161. [ ! $BOOTDELAY -gt 4 ] && BOOTDELAY=5
  162. export SCRIPT_VERSION="v1"
  163. export O_BOARD="OD"
  164. export ODROID_DTB="odroid.dtb"
  165. export ODROID_FSTAB="fstab.odroid"
  166. export ODROID_IMAGE="Kernel"
  167. export ODROID_ASYSTEMIMAGE="androsystem.img"
  168. export BKP_PREFIX="OD"
  169. export NUMCARDS="1"
  170. export UPGRADE_ANDROID="no"
  171. export ASYSTEM_PART="2"
  172. export ADATA_PART="5"
  173. export ACACHE_PART="3"
  174. export ADATA_PART_ORIG="3"
  175. export ACACHE_PART_ORIG="4"
  176. export LINUX_PART="7"
  177. export LINUX2_PART="8"
  178. export OELEC_PART="6"
  179. _desc=""
  180. _ini_prefix="multiboot"
  181. _actmount="mnt1"
  182. _numos=0
  183. _menu_no=49
  184. _menu_key="1"
  185. _menuitem_1=""
  186. _menuitem_2=""
  187. _menuitem_3=""
  188. _menuitem_4=""
  189. _menuitem_5=""
  190. _menuitem_6=""
  191. _menuitem_7=""
  192. _menuitem_8=""
  193. _mndscr_1=""
  194. _mndscr_2=""
  195. _mndscr_3=""
  196. _mndscr_4=""
  197. _mndscr_5=""
  198. _mndscr_6=""
  199. _mndscr_7=""
  200. _mndscr_8=""
  201. _mncrd_1="1"
  202. _mncrd_2="1"
  203. _mncrd_3="1"
  204. _mncrd_4="1"
  205. _mncrd_5="1"
  206. _mncrd_6="1"
  207. _mncrd_7="1"
  208. _mncrd_8="1"
  209. _boot_delay=2
  210. _defboot="none"
  211. _defdescr="none"
  212. _defcard="1"
  213. boot_fail="yes"
  214. _instfound="no"
  215. ask_for_card() {
  216. clear
  217. if [ ! "$O_BOARD" = "XU" ]; then
  218. mkdir /mnt1 > /dev/null 2>&1
  219. umount /mnt1 > /dev/null 2>&1
  220. mount -t vfat /dev/mmcblk0p1 /mnt1 > /dev/null 2>&1
  221. if [ $? -eq 0 ]; then
  222. if [ -f /mnt1/THIS_IS_SDCARD ]; then
  223. BOOT_CARDTYPE="SD"
  224. umount /mnt1 > /dev/null 2>&1
  225. return
  226. elif [ -f /mnt1/THIS_IS_EMMC ]; then
  227. BOOT_CARDTYPE="EMMC"
  228. umount /mnt1 > /dev/null 2>&1
  229. return
  230. fi
  231. fi
  232. umount /mnt1 > /dev/null 2>&1
  233. fi
  234. printf "\n\n \033[31m\033[1mBOOT card type is unknown, you have booted from original Odroid card\033[22m\033[37m\n"
  235. printf " \033[31mHave you booted from \033[1mEMMC\033[22m (Y/N) ? \033[37m"
  236. local B="X"
  237. while true; do
  238. if read -n 1 -t 1 -s B; then
  239. if [ "${B}" = "y" ] || [ "${B}" = "Y" ]; then
  240. BOOT_CARDTYPE="EMMC"
  241. break
  242. elif [ "${B}" = "n" ] || [ "${B}" = "N" ]; then
  243. BOOT_CARDTYPE="SD"
  244. if [ "$O_BOARD" = "XU" ] && [ "${NUMCARDS}" = "2" ]; then
  245. BOOT_CARDDEV="1"
  246. fi
  247. break
  248. fi
  249. fi
  250. done
  251. }
  252. # =========================================================
  253. # === Set the variables depending on used Odroid board ===
  254. [ -f /ODROID_C1 ] && O_BOARD="C1"
  255. [ -f /ODROID_C2 ] && O_BOARD="C2"
  256. [ -f /ODROID_XU ] && O_BOARD="XU"
  257. [ -b /dev/mmcblk1 ] && NUMCARDS="2"
  258. [ "${O_BOARD}" = "C1" ] && run_scripts /scripts/panic
  259. if [ "${BOOT_CARDTYPE}" = "unknown" ]; then
  260. if [ ! "$O_BOARD" = "XU" ]; then
  261. if [ "${NUMCARDS}" = "1" ]; then
  262. BOOT_CARDDEV="0"
  263. ask_for_card
  264. fi
  265. elif [ "$O_BOARD" = "XU" ]; then
  266. ask_for_card
  267. fi
  268. fi
  269. if [ "$O_BOARD" = "C2" ]; then
  270. ADATA_PART_ORIG="4"
  271. ACACHE_PART_ORIG="3"
  272. ODROID_DTB="meson64_odroidc2.dtb"
  273. ODROID_FSTAB="fstab.odroidc2"
  274. ODROID_IMAGE="Image"
  275. ODROID_ASYSTEMIMAGE="rootsystem.img"
  276. BKP_PREFIX="C2"
  277. if [ "${NUMCARDS}" = "2" ]; then
  278. BOOT_CARDTYPE="EMMC"
  279. NUMCARDS="2"
  280. OTHER_CARDDEV="1"
  281. OTHER_CARDTYPE="SD"
  282. fi
  283. elif [ "$O_BOARD" = "C1" ]; then
  284. ADATA_PART_ORIG="4"
  285. ACACHE_PART_ORIG="3"
  286. ODROID_DTB="meson8b_odroidc.dtb"
  287. ODROID_FSTAB="fstab.odroidc"
  288. ODROID_IMAGE="uImage"
  289. ODROID_ASYSTEMIMAGE="rootsystem.img"
  290. BKP_PREFIX="C1"
  291. if [ "${NUMCARDS}" = "2" ]; then
  292. BOOT_CARDTYPE="EMMC"
  293. NUMCARDS="2"
  294. OTHER_CARDDEV="1"
  295. OTHER_CARDTYPE="SD"
  296. fi
  297. elif [ "$O_BOARD" = "XU" ]; then
  298. ADATA_PART_ORIG="3"
  299. ACACHE_PART_ORIG="4"
  300. ODROID_DTB="exynos5422-odroidxu3.dtb"
  301. ODROID_FSTAB="fstab.odroidxu3"
  302. ODROID_IMAGE="zImage"
  303. ODROID_ASYSTEMIMAGE="system.img"
  304. BKP_PREFIX="XU"
  305. [ "${BOOT_CARDTYPE}" = "eMMC" ] && BOOT_CARDTYPE="EMMC"
  306. if [ "${NUMCARDS}" = "2" ]; then
  307. if [ "${BOOT_CARDTYPE}" = "SD" ]; then
  308. OTHER_CARDDEV="0"
  309. OTHER_CARDTYPE="EMMC"
  310. else
  311. OTHER_CARDDEV="1"
  312. OTHER_CARDTYPE="SD"
  313. BOOT_CARDDEV="0"
  314. fi
  315. fi
  316. fi
  317. # =========================================================
  318. # === Functions ===
  319. # Get OS description from boot.ini
  320. #-----------------------------------------------------
  321. get_descr() {
  322. _desc=""
  323. local _descx=
  324. _descx=`cat /${_actmount}/${_ini_prefix}/$1 | grep \#DESCRIPTION`
  325. if [ ! "${_descx}" = "" ]; then
  326. _desc=$(echo ${_descx} | sed -r 's/^.{13}//')
  327. fi
  328. if [ "${_desc}" = "" ]; then
  329. _desc="${2}"
  330. fi
  331. }
  332. #-----------------------------------------------------
  333. #----------------------------------------------------------------------------------------------------
  334. restore_bootini() {
  335. printf "\033[31m\033[1m %s\033[22m\033[37m" "${1}"
  336. cp /mnt1/${_ini_prefix}/boot.ini.multi /mnt1/boot.ini > /dev/null 2>&1
  337. [ "${O_BOARD}" = "XU" ] && cp /mnt1/${_ini_prefix}/boot.scr.multi /mnt1/boot.scr > /dev/null 2>&1
  338. umount /mnt_a > /dev/null 2>&1
  339. sleep 3
  340. }
  341. #----------------------------------------------------------------------------------------------------
  342. #-----------------------------------------------------------------------------------------------------------------------
  343. change_afstab() {
  344. # === Configure Android fstab to mount the right partitions ===
  345. if [ -f /mnt_a/${ODROID_FSTAB} ]; then
  346. if [ "${1}" = "yes" ]; then
  347. # Two cards, boot to Android on NON Boot card
  348. if [ ! "${O_BOARD}" = "XU" ]; then
  349. sed -i "s/\/dev\/block\/mmcblk0/\/dev\/block\/mmcblk1/g" /mnt_a/${ODROID_FSTAB}
  350. # on C2 prepare boot.ini for boot from sdcard
  351. sed -i "s/root=\/dev\/mmcblk0p2/root=\/dev\/mmcblk1p2/g" /mnt1/boot.ini
  352. else
  353. if [ "${OTHER_CARDTYPE}" = "SD" ]; then
  354. cp /mnt_a/${ODROID_FSTAB}.other /mnt_a/${ODROID_FSTAB}
  355. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.andro_1/g" /mnt1/boot.ini
  356. else
  357. cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
  358. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
  359. fi
  360. fi
  361. else
  362. # One or two cards, boot to Android on Boot card
  363. if [ ! "${O_BOARD}" = "XU" ]; then
  364. # Restore boot device if modified earlier
  365. sed -i "s/\/dev\/block\/mmcblk1/\/dev\/block\/mmcblk0/g" /mnt_a/${ODROID_FSTAB}
  366. else
  367. if [ "${NUMCARDS}" = "1" ]; then
  368. cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
  369. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
  370. else
  371. # Two cards, boot to Android on Boot card
  372. if [ "${BOOT_CARDTYPE}" = "SD" ] && [ "${BOOT_CARDDEV}" = "1" ]; then
  373. cp /mnt_a/${ODROID_FSTAB}.other /mnt_a/${ODROID_FSTAB}
  374. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.andro_1/g" /mnt1/boot.ini
  375. else
  376. cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
  377. sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
  378. fi
  379. fi
  380. fi
  381. fi
  382. if [ "${O_BOARD}" = "XU" ]; then
  383. cp -f /mnt_a/${ODROID_FSTAB} /mnt_a/${ODROID_FSTAB}.sdboot
  384. fi
  385. else
  386. restore_bootini "${ODROID_FSTAB} not found"
  387. return 1
  388. fi
  389. return 0
  390. }
  391. #-----------------------------------------------------------------------------------------------------------------------
  392. #----------------------------------------------------------------------------------------------------------------------
  393. # =======================================================================
  394. # On C2 boot drive is always mmcblk0 and is mounted on /mnt1
  395. # On XU3/XU4 boot drive can be mmcblk0 or mmcblk1 and is mounted on /mnt1
  396. # =======================================================================
  397. do_boot() {
  398. [ "${1}" = "none" ] && return 0
  399. local change_drive="no"
  400. local _oncard=""
  401. _actmount="mnt1"
  402. if [ "${3}" = "2" ]; then
  403. # Operating system on NON BOOT card
  404. _actmount="mnt2"
  405. change_drive="yes"
  406. fi
  407. if [ "${NUMCARDS}" = "2" ]; then
  408. if [ "${_actmount}" = "mnt1" ]; then
  409. _oncard=" on ${BOOT_CARDTYPE}"
  410. else
  411. _oncard=" on ${OTHER_CARDTYPE}"
  412. fi
  413. fi
  414. if [ -f /${_actmount}/${_ini_prefix}/${1} ]; then
  415. boot_fail="yes"
  416. printf "\r\033[2K"
  417. printf " Booting to \033[32m%s\033[37m\033[36m%s\033[37m" "${2}" "${_oncard}"
  418. # === Copy selected boot.ini to BOOT partition
  419. cp /${_actmount}/${_ini_prefix}/${1} /mnt1/boot.ini > /dev/null 2>&1
  420. if [ ! $? -eq 0 ]; then
  421. restore_bootini "ERROR copying /${_actmount}/${_ini_prefix}/${1}"
  422. return 1
  423. fi
  424. sleep 1
  425. if [ "${change_drive}" = "yes" ]; then
  426. # === boot.ini from NON-BOOT card, prepare it for boot from BOOT card ===
  427. if [ "${O_BOARD}" = "C2" ]; then
  428. # for kernel/initrd/dtb loading
  429. sed -i "s/fatload mmc 0:1/fatload mmc 1:1/g" /mnt1/boot.ini
  430. # for boot.ini loading from /multiboot (it was changed with previous sed operation!)
  431. sed -i "s/1:1 0x60000000/0:1 0x60000000/g" /mnt1/boot.ini
  432. elif [ "${O_BOARD}" = "C1" ]; then
  433. # for kernel/initrd/dtb loading
  434. sed -i "s/fatload mmc 0:1/fatload mmc 1:1/g" /mnt1/boot.ini
  435. # for boot.ini loading from /multiboot (it was changed with previous sed operation!)
  436. sed -i "s/1:1 0x30000000/0:1 0x30000000/g" /mnt1/boot.ini
  437. else
  438. # for kernel/initrd/dtb loading
  439. sed -i "s/setenv change_osdev no/setenv change_osdev yes/g" /mnt1/boot.ini
  440. fi
  441. fi
  442. if [ "${1}" = "boot.ini.android" ]; then
  443. # === mount destination android system partition to prepare android fstab ===
  444. mkdir /mnt_a > /dev/null 2>&1
  445. if [ "${change_drive}" = "yes" ]; then
  446. mount -t ext4 /dev/mmcblk${OTHER_CARDDEV}p2 /mnt_a > /dev/null 2>&1
  447. else
  448. mount -t ext4 /dev/mmcblk${BOOT_CARDDEV}p2 /mnt_a > /dev/null 2>&1
  449. fi
  450. if [ $? -ne 0 ]; then
  451. restore_bootini "Mount Android system partition ERROR"
  452. return 1
  453. fi
  454. # === Configure Android fstab to mount the right partitions ===
  455. change_afstab "${change_drive}"
  456. [ $? -ne 0 ] && return 1
  457. umount /mnt_a > /dev/null 2>&1
  458. # =============================================================
  459. fi
  460. if [ "${O_BOARD}" = "XU" ]; then
  461. # Convert boot.ini to boot.scr
  462. mkimage -C none -A arm -T script -d /mnt1/boot.ini /mnt1/boot.scr > /dev/null 2>&1
  463. if [ $? -ne 0 ]; then
  464. restore_bootini "mkimage (boot.scr) ERROR"
  465. return 1
  466. fi
  467. if [ -f /mnt1/multiboot/newscr ]; then
  468. mkimage -C none -A arm -T script -d /mnt1/multiboot/boot.ini.multi /mnt1/multiboot/boot.scr.multi > /dev/null 2>&1
  469. if [ $? -ne 0 ]; then
  470. restore_bootini "mkimage (boot.scr.multi) ERROR"
  471. return 1
  472. fi
  473. rm -f /mnt1/multiboot/newscr > /dev/null 2>&1
  474. fi
  475. fi
  476. sleep 1
  477. umount /mnt1
  478. umount /mnt2 > /dev/null 2>&1
  479. fsck.fat -aw /dev/mmcblk${BOOT_CARDDEV}p1 > /dev/null 2>&1
  480. reboot
  481. fi
  482. }
  483. #----------------------------------------------------------------------------------------------------------------------
  484. # Check where the installation files are located
  485. check_source() {
  486. if [ -b ${1} ]; then
  487. mkdir /mnt3 > /dev/null 2>&1
  488. /bin/mountx ${1} /mnt3
  489. [ $? -ne 0 ] && return 1
  490. else
  491. return 1
  492. fi
  493. sleep 1
  494. # === Source drive found and 1st partition mounted on /mnt ===
  495. # === Check installation files on source drive ===
  496. if [ -f /mnt3/backupJeedom.tar.gz ]; then
  497. printf "\r\033[2K"
  498. printf " BACKUP ARCHIVE FOUND! UNCOMPRESSING, PLEASE WAIT..."
  499. tar -xvzmf /mnt3/backupJeedom.tar.gz -C /mnt3
  500. fi
  501. # LINUX
  502. if [ -d /mnt3/C2_backup/linux ]; then
  503. if [ -f /mnt3/C2_backup/linux/jeedom.img ]; then
  504. _instfound="yes"
  505. fi
  506. fi
  507. umount /mnt3
  508. [ "${_instfound}" = "no" ] && return 1
  509. return 0
  510. }
  511. #------------------------------------------------------
  512. set_menu_key() {
  513. _menu_key="\\$(printf '%03o' ${_menu_no})"
  514. if [ $_menu_no -eq 49 ]; then
  515. _menuitem_1="${1}"
  516. _mndscr_1="${_desc}"
  517. [ "${_actmount}" = "mnt2" ] && _mncrd_1="2"
  518. elif [ $_menu_no -eq 50 ]; then
  519. _menuitem_2="${1}"
  520. _mndscr_2="${_desc}"
  521. [ "${_actmount}" = "mnt2" ] && _mncrd_2="2"
  522. elif [ $_menu_no -eq 51 ]; then
  523. _menuitem_3="${1}"
  524. _mndscr_3="${_desc}"
  525. [ "${_actmount}" = "mnt2" ] && _mncrd_3="2"
  526. elif [ $_menu_no -eq 52 ]; then
  527. _menuitem_4="${1}"
  528. _mndscr_4="${_desc}"
  529. [ "${_actmount}" = "mnt2" ] && _mncrd_4="2"
  530. elif [ $_menu_no -eq 53 ]; then
  531. _menuitem_5="${1}"
  532. _mndscr_5="${_desc}"
  533. [ "${_actmount}" = "mnt2" ] && _mncrd_5="2"
  534. elif [ $_menu_no -eq 54 ]; then
  535. _menuitem_6="${1}"
  536. _mndscr_6="${_desc}"
  537. [ "${_actmount}" = "mnt2" ] && _mncrd_6="2"
  538. elif [ $_menu_no -eq 55 ]; then
  539. _menuitem_7="${1}"
  540. _mndscr_7="${_desc}"
  541. [ "${_actmount}" = "mnt2" ] && _mncrd_7="2"
  542. elif [ $_menu_no -eq 56 ]; then
  543. _menuitem_8="${1}"
  544. _mndscr_8="${_desc}"
  545. [ "${_actmount}" = "mnt2" ] && _mncrd_8="2"
  546. fi
  547. let _menu_no=_menu_no+1
  548. let _numos=_numos+1
  549. }
  550. #------------------------------------------------------
  551. #---------------------------------------------------------------------------------------------
  552. # shellcheck disable=SC2059
  553. get_menu_items() {
  554. local _oncard=""
  555. if [ "${NUMCARDS}" = "2" ]; then
  556. if [ "${_actmount}" = "mnt1" ]; then
  557. _oncard=" on ${BOOT_CARDTYPE}"
  558. else
  559. _oncard=" on ${OTHER_CARDTYPE}"
  560. fi
  561. fi
  562. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.android ]; then
  563. get_descr "boot.ini.android" "Android"
  564. set_menu_key "boot.ini.android"
  565. printf "\033[36m \033[32m\033[1m${_menu_key}\033[22m\033[36m boot to \033[32m${_desc}\033[36m${_oncard}\n"
  566. fi
  567. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.linux ]; then
  568. get_descr "boot.ini.linux" "Linux"
  569. set_menu_key "boot.ini.linux"
  570. printf "\033[36m \033[33m\033[1m${_menu_key}\033[22m\033[36m boot to \033[33m${_desc}\033[36m${_oncard}\n"
  571. fi
  572. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.oelec ]; then
  573. get_descr "boot.ini.oelec" "OpenElec"
  574. set_menu_key "boot.ini.oelec"
  575. printf "\033[36m \033[37m\033[1m${_menu_key}\033[22m\033[36m boot to \033[37m${_desc}\033[36m${_oncard}\n"
  576. fi
  577. if [ -f /${_actmount}/${_ini_prefix}/boot.ini.linux2 ]; then
  578. get_descr "boot.ini.linux2" "Linux #2"
  579. set_menu_key "boot.ini.linux2"
  580. printf "\033[36m \033[33m\033[1m${_menu_key}\033[22m\033[36m boot to \033[33m${_desc}\033[36m${_oncard}\n"
  581. fi
  582. }
  583. #---------------------------------------------------------------------------------------------
  584. #-----------------------------------------------------------------------------------------------------
  585. do_halt() {
  586. umount /mnt1 > /dev/null 2>&1
  587. umount /mnt2 > /dev/null 2>&1
  588. local B="X"
  589. local _reboot_delay=60
  590. while [ $_reboot_delay -gt 0 ]; do
  591. printf "\r\033[2K"
  592. printf " \033[31m\033[1m%s, press R to reboot %s\033[22m\033[37m\r" "${1}" "$_reboot_delay"
  593. if read -n 1 -t 1 -s B; then
  594. _reboot_delay=60
  595. if [ "${B}" = "r" ] || [ "${B}" = "R" ]; then
  596. printf "\r\033[2K"
  597. reboot
  598. fi
  599. else
  600. let _reboot_delay=_reboot_delay-1
  601. fi
  602. done
  603. reboot
  604. }
  605. #-----------------------------------------------------------------------------------------------------
  606. #-----------------------------------------------------------------------------------------------------------------
  607. os_detect() {
  608. _desc=""
  609. _ini_prefix="multiboot"
  610. _actmount="mnt1"
  611. _numos=0
  612. _menu_no=49
  613. _menu_key="1"
  614. _menuitem_1=""
  615. _menuitem_2=""
  616. _menuitem_3=""
  617. _menuitem_4=""
  618. _menuitem_5=""
  619. _menuitem_6=""
  620. _menuitem_7=""
  621. _menuitem_8=""
  622. _mndscr_1=""
  623. _mndscr_2=""
  624. _mndscr_3=""
  625. _mndscr_4=""
  626. _mndscr_5=""
  627. _mndscr_6=""
  628. _mndscr_7=""
  629. _mndscr_8=""
  630. _mncrd_1="1"
  631. _mncrd_2="1"
  632. _mncrd_3="1"
  633. _mncrd_4="1"
  634. _mncrd_5="1"
  635. _mncrd_6="1"
  636. _mncrd_7="1"
  637. _mncrd_8="1"
  638. _boot_delay=2
  639. _defboot="none"
  640. _defdescr="none"
  641. _defcard="1"
  642. # prepare cards mount points
  643. mkdir /mnt1 > /dev/null 2>&1
  644. mkdir /mnt2 > /dev/null 2>&1
  645. umount /mnt1 > /dev/null 2>&1
  646. umount /mnt2 > /dev/null 2>&1
  647. umount /mnt > /dev/null 2>&1
  648. clear
  649. # Detect new partitions after install
  650. blkid > /dev/null 2>&1
  651. # ================================
  652. # Mount available cards
  653. # ================================
  654. mount -t vfat /dev/mmcblk${BOOT_CARDDEV}p1 /mnt1 > /dev/null 2>&1
  655. if [ $? -eq 0 ]; then
  656. if [ "${NUMCARDS}" = "2" ]; then
  657. mount -t vfat /dev/mmcblk${OTHER_CARDDEV}p1 /mnt2 > /dev/null 2>&1
  658. if [ $? -ne 0 ]; then
  659. OTHER_CARDDEV="9"
  660. fi
  661. fi
  662. else
  663. # === SOMETHING IS VERY WRONG ===
  664. do_halt "BOOT CARD NOT MOUNTABLE"
  665. fi
  666. clear
  667. printf "\n"
  668. printf "\033[36m\033[1m\n"
  669. printf " ============================\n"
  670. printf " = JEEDOM BOOT MENU %s =\n" "${SCRIPT_VERSION}"
  671. printf " ============================\n"
  672. if [ "${NUMCARDS}" = "2" ]; then
  673. printf "\033[22m Two cards detected, booted from \033[1m%s\033[22m\033[37m\n\n" "${BOOT_CARDTYPE}"
  674. else
  675. printf "\033[22m Booted from \033[1m%s\033[22m\033[37m\n\n" "${BOOT_CARDTYPE}"
  676. fi
  677. #===================================================
  678. # === Detect available OS's and print menu items ===
  679. #===================================================
  680. _menu_no=49
  681. # Scan boot card first
  682. _actmount="mnt1"
  683. if [ -b /dev/disk/by-label/sduserdata ] || [ -b /dev/disk/by-label/emuserdata ]; then
  684. get_menu_items
  685. if [ "${NUMCARDS}" = "2" ]; then
  686. _actmount="mnt2"
  687. [ ! ${_numos} -eq 0 ] && printf "\n"
  688. get_menu_items
  689. fi
  690. #[ ${_numos} -eq 0 ] && printf "\033[36m \033[36m\033[1m!\033[22m NO OS DETECTED\033[36m\n"
  691. else
  692. get_menu_items
  693. #[ ${_numos} -eq 0 ] && printf "\033[36m \033[36m\033[1m!\033[22m NO MULTIBOOT CARD DETECTED\033[36m\n"
  694. fi
  695. printf "\n"
  696. printf " \033[36m\033[1mB\033[22m Backup JEEDOM\033[36m\n"
  697. printf " \033[33m\033[1mI\033[22m Install JEEDOM\033[36m\n"
  698. printf "\n"
  699. printf " \033[36m\033[1mX\033[22m Exit to busybox shell\033[36m\n"
  700. printf " \033[33m\033[1mR\033[22m Reboot\033[36m\n"
  701. printf "\n"
  702. printf "\n"
  703. # === Get default boot ===
  704. if [ "${DEFAULTBOOT}" = "1" ] && [ ! "${_menuitem_1}" = "none" ]; then
  705. _defboot="${_menuitem_1}"
  706. _defdescr="${_mndscr_1}"
  707. _defcard="${_mncrd_1}"
  708. elif [ "${DEFAULTBOOT}" = "2" ] && [ ! "${_menuitem_2}" = "none" ]; then
  709. _defboot="${_menuitem_2}"
  710. _defdescr="${_mndscr_2}"
  711. _defcard="${_mncrd_2}"
  712. elif [ "${DEFAULTBOOT}" = "3" ] && [ ! "${_menuitem_3}" = "none" ]; then
  713. _defboot="${_menuitem_3}"
  714. _defdescr="${_mndscr_3}"
  715. _defcard="${_mncrd_3}"
  716. elif [ "${DEFAULTBOOT}" = "4" ] && [ ! "${_menuitem_4}" = "none" ]; then
  717. _defboot="${_menuitem_4}"
  718. _defdescr="${_mndscr_4}"
  719. _defcard="${_mncrd_4}"
  720. elif [ "${DEFAULTBOOT}" = "5" ] && [ ! "${_menuitem_5}" = "none" ]; then
  721. _defboot="${_menuitem_5}"
  722. _defdescr="${_mndscr_5}"
  723. _defcard="${_mncrd_5}"
  724. elif [ "${DEFAULTBOOT}" = "6" ] && [ ! "${_menuitem_6}" = "none" ]; then
  725. _defboot="${_menuitem_6}"
  726. _defdescr="${_mndscr_6}"
  727. _defcard="${_mncrd_6}"
  728. elif [ "${DEFAULTBOOT}" = "7" ] && [ ! "${_menuitem_7}" = "none" ]; then
  729. _defboot="${_menuitem_7}"
  730. _defdescr="${_mndscr_7}"
  731. _defcard="${_mncrd_7}"
  732. elif [ "${DEFAULTBOOT}" = "8" ] && [ ! "${_menuitem_8}" = "none" ]; then
  733. _defboot="${_menuitem_8}"
  734. _defdescr="${_mndscr_8}"
  735. _defcard="${_mncrd_8}"
  736. fi
  737. if [ "${_defboot}" = "none" ]; then
  738. if [ ! "${_menuitem_1}" = "none" ]; then
  739. _defboot="${_menuitem_1}"
  740. _defdescr="${_mndscr_1}"
  741. _defcard="${_mncrd_1}"
  742. DEFAULTBOOT="1"
  743. elif [ ! "${_menuitem_2}" = "none" ]; then
  744. _defboot="${_menuitem_2}"
  745. _defdescr="${_mndscr_2}"
  746. _defcard="${_mncrd_2}"
  747. DEFAULTBOOT="2"
  748. elif [ ! "${_menuitem_3}" = "none" ]; then
  749. _defboot="${_menuitem_3}"
  750. _defdescr="${_mndscr_3}"
  751. _defcard="${_mncrd_3}"
  752. DEFAULTBOOT="3"
  753. elif [ ! "${_menuitem_4}" = "none" ]; then
  754. _defboot="${_menuitem_4}"
  755. _defdescr="${_mndscr_4}"
  756. _defcard="${_mncrd_4}"
  757. DEFAULTBOOT="4"
  758. elif [ ! "${_menuitem_5}" = "none" ]; then
  759. _defboot="${_menuitem_5}"
  760. _defdescr="${_mndscr_5}"
  761. _defcard="${_mncrd_5}"
  762. DEFAULTBOOT="5"
  763. elif [ ! "${_menuitem_6}" = "none" ]; then
  764. _defboot="${_menuitem_6}"
  765. _defdescr="${_mndscr_6}"
  766. _defcard="${_mncrd_6}"
  767. DEFAULTBOOT="6"
  768. elif [ ! "${_menuitem_7}" = "none" ]; then
  769. _defboot="${_menuitem_7}"
  770. _defdescr="${_mndscr_7}"
  771. _defcard="${_mncrd_7}"
  772. DEFAULTBOOT="7"
  773. elif [ ! "${_menuitem_8}" = "none" ]; then
  774. _defboot="${_menuitem_8}"
  775. _defdescr="${_mndscr_8}"
  776. _defcard="${_mncrd_8}"
  777. DEFAULTBOOT="8"
  778. fi
  779. fi
  780. }
  781. #-----------------------------------------------------------------------------------------------------------------
  782. os_detect
  783. # ======================================
  784. # === Main loop, never exit ===
  785. # === Wait for user OS/action select ===
  786. # ======================================
  787. _boot_delay=$BOOTDELAY
  788. check_source "/dev/sda1"
  789. # === Detect available Operating Systems ===
  790. while true; do
  791. printf "\r\033[2K"
  792. printf "\033[37m Select an option or boot to menu item \033[36m\033[1m%s\033[22m in\033[31m\033[1m %s \033[22m\033[37mseconds" "${DEFAULTBOOT}" "${_boot_delay}"
  793. A="Z"
  794. if [ "${_instfound}" = "yes" ]; then
  795. # === UNIVERSAL INSTALLER ===
  796. if [ -f /install.script ]; then
  797. printf "\r\033[2K"
  798. printf " USB BACKUP FOUND! LAUNCHING INSTALL..."
  799. sleep 4
  800. umount /mnt1 > /dev/null 2>&1
  801. umount /mnt2 > /dev/null 2>&1
  802. sleep 1
  803. # ============================
  804. # Execute the installer script
  805. UPGRADE_ANDROID="no"
  806. /install.script
  807. # ============================
  808. A="Z"
  809. os_detect
  810. _boot_delay=$BOOTDELAY
  811. else
  812. printf "\r\033[2K"
  813. printf " INSTALL SCRIPT NOT FOUND!"
  814. sleep 4
  815. fi
  816. fi
  817. if read -n 1 -t 1 -s A; then
  818. _boot_delay=$BOOTDELAY
  819. if [ "${A}" = "B" ]; then
  820. # === BACKUP ===
  821. if [ -f /backup.script ]; then
  822. umount /mnt1 > /dev/null 2>&1
  823. umount /mnt2 > /dev/null 2>&1
  824. sleep 1
  825. # =========================
  826. # Execute the backup script
  827. /backup.script
  828. # =========================
  829. A="Z"
  830. os_detect
  831. _boot_delay=$BOOTDELAY
  832. else
  833. printf "\r\033[2K"
  834. printf " BACKUP SCRIPT NOT FOUND!"
  835. sleep 4
  836. fi
  837. elif [ "${A}" = "I" ]; then
  838. # === UNIVERSAL INSTALLER ===
  839. if [ -f /install.script ]; then
  840. umount /mnt1 > /dev/null 2>&1
  841. umount /mnt2 > /dev/null 2>&1
  842. sleep 1
  843. # ============================
  844. # Execute the installer script
  845. UPGRADE_ANDROID="no"
  846. /install.script
  847. # ============================
  848. A="Z"
  849. os_detect
  850. _boot_delay=$BOOTDELAY
  851. else
  852. printf "\r\033[2K"
  853. printf " INSTALL SCRIPT NOT FOUND!"
  854. sleep 4
  855. fi
  856. elif [ "${A}" = "U" ]; then
  857. # === ANDROID UPGRADE ====
  858. if [ -f /install.script ]; then
  859. umount /mnt1 > /dev/null 2>&1
  860. umount /mnt2 > /dev/null 2>&1
  861. sleep 1
  862. # =========================
  863. # Execute the backup script
  864. UPGRADE_ANDROID="yes"
  865. /install.script
  866. # =========================
  867. A="Z"
  868. os_detect
  869. _boot_delay=$BOOTDELAY
  870. else
  871. printf "\r\033[2K"
  872. printf " BACKUP SCRIPT NOT FOUND!"
  873. sleep 4
  874. fi
  875. elif [ "${A}" = "X" ]; then
  876. # === ENTER BUSYBOX ===
  877. clear
  878. printf "\n\n\n Entering \033[32mBusybox\033[37m shell\n"
  879. printf " Execute \033[32mexit\033[37m to return to menu\n\n"
  880. umount /mnt1 > /dev/null 2>&1
  881. umount /mnt2 > /dev/null 2>&1
  882. sleep 1
  883. #For C2 show cursor
  884. [ ! "${O_BOARD}" = "XU" ] && tput cnorm
  885. #===============
  886. break="bbox"
  887. maybe_break bbox
  888. #===============
  889. printf "\n \033[32mBusybox exited\033[37m\n"
  890. sleep 2
  891. #For C2 hide cursor
  892. [ ! "${O_BOARD}" = "XU" ] && tput civis
  893. A="Z"
  894. os_detect
  895. _boot_delay=$BOOTDELAY
  896. elif [ "${A}" = "R" ]; then
  897. # REBOOT ===
  898. _reboot_delay=10
  899. B="X"
  900. while [ $_reboot_delay -gt 0 ]; do
  901. printf "\r\033[2K"
  902. printf " \033[33m\033[1mREBOOT in %s sec, press \033[22ma\033[1m to abort, \033[22mr\033[1m to reboot \033[22m\033[37m\r" "$_reboot_delay"
  903. if read -n 1 -t 1 -s B; then
  904. _reboot_delay=10
  905. if [ "${B}" = "a" ] || [ "${B}" = "A" ]; then
  906. printf "\r\033[2K"
  907. break
  908. elif [ "${B}" = "r" ] || [ "${B}" = "R" ]; then
  909. _reboot_delay=0
  910. break
  911. fi
  912. else
  913. let _reboot_delay=_reboot_delay-1
  914. fi
  915. done
  916. if [ $_reboot_delay -eq 0 ]; then
  917. cp -f /*.ppm /mnt1 > /dev/null 2>&1
  918. umount /mnt1 > /dev/null 2>&1
  919. umount /mnt2 > /dev/null 2>&1
  920. reboot
  921. fi
  922. elif [ "${A}" = "s" ]; then
  923. # SCREENSHOT ===
  924. fbcat > /mb_menu.ppm
  925. elif [ $_numos -gt 0 ]; then
  926. # === BOOT to selected OS
  927. boot_fail="no"
  928. [ "${A}" = "1" ] && [ ! "${_menuitem_1}" = "none" ] && do_boot "${_menuitem_1}" "${_mndscr_1}" "${_mncrd_1}"
  929. [ "${A}" = "2" ] && [ ! "${_menuitem_2}" = "none" ] && do_boot "${_menuitem_2}" "${_mndscr_2}" "${_mncrd_2}"
  930. [ "${A}" = "3" ] && [ ! "${_menuitem_3}" = "none" ] && do_boot "${_menuitem_3}" "${_mndscr_3}" "${_mncrd_3}"
  931. [ "${A}" = "4" ] && [ ! "${_menuitem_4}" = "none" ] && do_boot "${_menuitem_4}" "${_mndscr_4}" "${_mncrd_4}"
  932. [ "${A}" = "5" ] && [ ! "${_menuitem_5}" = "none" ] && do_boot "${_menuitem_5}" "${_mndscr_5}" "${_mncrd_5}"
  933. [ "${A}" = "6" ] && [ ! "${_menuitem_6}" = "none" ] && do_boot "${_menuitem_6}" "${_mndscr_6}" "${_mncrd_6}"
  934. [ "${A}" = "7" ] && [ ! "${_menuitem_7}" = "none" ] && do_boot "${_menuitem_7}" "${_mndscr_7}" "${_mncrd_7}"
  935. [ "${A}" = "8" ] && [ ! "${_menuitem_8}" = "none" ] && do_boot "${_menuitem_8}" "${_mndscr_8}" "${_mncrd_8}"
  936. if [ "${boot_fail}" = "yes" ]; then
  937. # === BOOT ERROR ===
  938. sleep 4
  939. os_detect
  940. _boot_delay=$BOOTDELAY
  941. fi
  942. fi
  943. else
  944. let _boot_delay=_boot_delay-1
  945. if [ $_boot_delay -eq 0 ]; then
  946. # Default boot
  947. [ $_numos -gt 0 ] && [ ! "${_defboot}" = "none" ] && do_boot "${_defboot}" "${_defdescr}" "${_defcard}"
  948. # === BOOT ERROR ===
  949. sleep 4
  950. os_detect
  951. _boot_delay=$BOOTDELAY
  952. fi
  953. fi
  954. printf "\r"
  955. done
  956. # Just in case...
  957. printf "\n\n"
  958. umount /mnt1 > /dev/null 2>&1
  959. umount /mnt2 > /dev/null 2>&1
  960. printf "\033[36m REBOOT ...\n"
  961. reboot
  962. #---------------------------------------------------------------------------