| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049 |
- #!/bin/bash
- # Last change: 07. Dec. 2016.
- # ============================================================
- # This is the standard Ubuntu initramfs initialization process
- # ============================================================
- # Default PATH differs between shells, and is not automatically exported
- # by klibc dash. Make it consistent.
- export PATH=/sbin:/usr/sbin:/bin:/usr/bin
- [ -d /dev ] || mkdir -m 0755 /dev
- [ -d /root ] || mkdir -m 0700 /root
- [ -d /sys ] || mkdir /sys
- [ -d /proc ] || mkdir /proc
- [ -d /tmp ] || mkdir /tmp
- mkdir -p /var/lock
- mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
- mount -t proc -o nodev,noexec,nosuid proc /proc
- # Some things don't work properly without /etc/mtab.
- ln -sf /proc/mounts /etc/mtab
- echo "1 1 1 1" > /proc/sys/kernel/printk
- grep -q '\<quiet\>' /proc/cmdline || echo "Loading, please wait..."
- # Note that this only becomes /dev on the real filesystem if udev's scripts
- # are used; which they will be, but it's worth pointing out
- if ! mount -t devtmpfs -o nosuid,mode=0755 udev /dev; then
- echo "W: devtmpfs not available, falling back to tmpfs for /dev"
- mount -t tmpfs -o nosuid,mode=0755 udev /dev
- [ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
- [ -e /dev/null ] || mknod /dev/null c 1 3
- fi
- mkdir /dev/pts
- mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
- #mount -t tmpfs -o "noexec,nosuid,size=80%,mode=0755" tmpfs /run
- #mkdir -m 0755 /run/initramfs
- # Export the dpkg architecture
- export DPKG_ARCH=
- . /conf/arch.conf
- # Set modprobe env
- export MODPROBE_OPTIONS="-qb"
- # Export relevant variables
- export ROOT=
- export ROOTDELAY=
- export ROOTFLAGS=
- export ROOTFSTYPE=
- export IP=
- export BOOT=
- export BOOTIF=
- export UBIMTD=
- export break=
- export init=/sbin/init
- export quiet=y
- export readonly=y
- export rootmnt=/root
- export debug=
- export panic=
- export blacklist=
- export resume=
- export resume_offset=
- export drop_caps=
- export fastboot=n
- export forcefsck=n
- export fsckfix=
- export recovery=
- export BOOT_CARDTYPE="unknown"
- export OTHER_CARDTYPE="unknown"
- export BOOT_CARDDEV="0"
- export OTHER_CARDDEV="9"
- export EDITOR="mcedit mc"
- # mdadm needs hostname to be set. This has to be done before the udev rules are called!
- if [ -f "/etc/hostname" ]; then
- /bin/hostname -F /etc/hostname >/dev/null 2>&1
- fi
- # Bring in the main config
- . /conf/initramfs.conf
- for conf in conf/conf.d/*; do
- [ -f ${conf} ] && . ${conf}
- done
- . /scripts/functions
- echo "1 1 1 1" > /proc/sys/kernel/printk
- BOOTDELAY=60
- DEFAULTBOOT="1"
- # Parse command line options
- for x in $(cat /proc/cmdline); do
- case $x in
- boot_card_type=*)
- BOOT_CARDTYPE=${x#boot_card_type=}
- ;;
- boot_card_dev=*)
- BOOT_CARDDEV=${x#boot_card_dev=}
- ;;
- boot_delay=*)
- BOOTDELAY="${x#boot_delay=}"
- case ${BOOTDELAY} in
- *[![:digit:].]*)
- BOOTDELAY=60
- ;;
- esac
- ;;
- default_boot=*)
- DEFAULTBOOT="${x#default_boot=}"
- ;;
- quiet)
- quiet=y
- ;;
- ro)
- readonly=y
- ;;
- rw)
- readonly=n
- ;;
- break=*)
- break=${x#break=}
- ;;
- break)
- break=premount
- ;;
- esac
- done
- # Default to BOOT=local if no boot script defined.
- if [ -z "${BOOT}" ]; then
- BOOT=local
- fi
- if [ -n "${noresume}" ]; then
- export noresume
- unset resume
- else
- resume=${RESUME:-}
- fi
- maybe_break top
- # export BOOT variable value for compcache,
- # so we know if we run from casper
- export BOOT
- # Don't do log messages here to avoid confusing graphical boots
- run_scripts /scripts/init-top
- #maybe_break modules
- #[ -n "${netconsole}" ] && modprobe netconsole netconsole="${netconsole}"
- load_modules
- maybe_break premount
- run_scripts /scripts/init-premount
- maybe_break mount
- # Always load local and nfs (since these might be needed for /etc or
- # /usr, irrespective of the boot script used to mount the rootfs).
- . /scripts/local
- . /scripts/nfs
- . /scripts/${BOOT}
- parse_numeric ${ROOT}
- maybe_break mountroot
- mount_top
- mount_premount
- #mountroot
- if read_fstab_entry /usr; then
- mountfs /usr
- fi
- # Mount cleanup
- mount_bottom
- nfs_bottom
- local_bottom
- chown 0:0 /bin/*
- chown 0:0 /sbin/*
- echo "1 1 1 1" > /proc/sys/kernel/printk
- sleep 1
- # === Variables ===
- [ ! $BOOTDELAY -gt 4 ] && BOOTDELAY=5
- export SCRIPT_VERSION="v1"
- export O_BOARD="OD"
- export ODROID_DTB="odroid.dtb"
- export ODROID_FSTAB="fstab.odroid"
- export ODROID_IMAGE="Kernel"
- export ODROID_ASYSTEMIMAGE="androsystem.img"
- export BKP_PREFIX="OD"
- export NUMCARDS="1"
- export UPGRADE_ANDROID="no"
- export ASYSTEM_PART="2"
- export ADATA_PART="5"
- export ACACHE_PART="3"
- export ADATA_PART_ORIG="3"
- export ACACHE_PART_ORIG="4"
- export LINUX_PART="7"
- export LINUX2_PART="8"
- export OELEC_PART="6"
- _desc=""
- _ini_prefix="multiboot"
- _actmount="mnt1"
- _numos=0
- _menu_no=49
- _menu_key="1"
- _menuitem_1=""
- _menuitem_2=""
- _menuitem_3=""
- _menuitem_4=""
- _menuitem_5=""
- _menuitem_6=""
- _menuitem_7=""
- _menuitem_8=""
- _mndscr_1=""
- _mndscr_2=""
- _mndscr_3=""
- _mndscr_4=""
- _mndscr_5=""
- _mndscr_6=""
- _mndscr_7=""
- _mndscr_8=""
- _mncrd_1="1"
- _mncrd_2="1"
- _mncrd_3="1"
- _mncrd_4="1"
- _mncrd_5="1"
- _mncrd_6="1"
- _mncrd_7="1"
- _mncrd_8="1"
- _boot_delay=2
- _defboot="none"
- _defdescr="none"
- _defcard="1"
- boot_fail="yes"
- _instfound="no"
- ask_for_card() {
- clear
- if [ ! "$O_BOARD" = "XU" ]; then
- mkdir /mnt1 > /dev/null 2>&1
- umount /mnt1 > /dev/null 2>&1
- mount -t vfat /dev/mmcblk0p1 /mnt1 > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- if [ -f /mnt1/THIS_IS_SDCARD ]; then
- BOOT_CARDTYPE="SD"
- umount /mnt1 > /dev/null 2>&1
- return
- elif [ -f /mnt1/THIS_IS_EMMC ]; then
- BOOT_CARDTYPE="EMMC"
- umount /mnt1 > /dev/null 2>&1
- return
- fi
- fi
- umount /mnt1 > /dev/null 2>&1
- fi
- printf "\n\n \033[31m\033[1mBOOT card type is unknown, you have booted from original Odroid card\033[22m\033[37m\n"
- printf " \033[31mHave you booted from \033[1mEMMC\033[22m (Y/N) ? \033[37m"
- local B="X"
- while true; do
- if read -n 1 -t 1 -s B; then
- if [ "${B}" = "y" ] || [ "${B}" = "Y" ]; then
- BOOT_CARDTYPE="EMMC"
- break
- elif [ "${B}" = "n" ] || [ "${B}" = "N" ]; then
- BOOT_CARDTYPE="SD"
- if [ "$O_BOARD" = "XU" ] && [ "${NUMCARDS}" = "2" ]; then
- BOOT_CARDDEV="1"
- fi
- break
- fi
- fi
- done
- }
- # =========================================================
- # === Set the variables depending on used Odroid board ===
- [ -f /ODROID_C1 ] && O_BOARD="C1"
- [ -f /ODROID_C2 ] && O_BOARD="C2"
- [ -f /ODROID_XU ] && O_BOARD="XU"
- [ -b /dev/mmcblk1 ] && NUMCARDS="2"
- [ "${O_BOARD}" = "C1" ] && run_scripts /scripts/panic
- if [ "${BOOT_CARDTYPE}" = "unknown" ]; then
- if [ ! "$O_BOARD" = "XU" ]; then
- if [ "${NUMCARDS}" = "1" ]; then
- BOOT_CARDDEV="0"
- ask_for_card
- fi
- elif [ "$O_BOARD" = "XU" ]; then
- ask_for_card
- fi
- fi
- if [ "$O_BOARD" = "C2" ]; then
- ADATA_PART_ORIG="4"
- ACACHE_PART_ORIG="3"
- ODROID_DTB="meson64_odroidc2.dtb"
- ODROID_FSTAB="fstab.odroidc2"
- ODROID_IMAGE="Image"
- ODROID_ASYSTEMIMAGE="rootsystem.img"
- BKP_PREFIX="C2"
- if [ "${NUMCARDS}" = "2" ]; then
- BOOT_CARDTYPE="EMMC"
- NUMCARDS="2"
- OTHER_CARDDEV="1"
- OTHER_CARDTYPE="SD"
- fi
- elif [ "$O_BOARD" = "C1" ]; then
- ADATA_PART_ORIG="4"
- ACACHE_PART_ORIG="3"
- ODROID_DTB="meson8b_odroidc.dtb"
- ODROID_FSTAB="fstab.odroidc"
- ODROID_IMAGE="uImage"
- ODROID_ASYSTEMIMAGE="rootsystem.img"
- BKP_PREFIX="C1"
- if [ "${NUMCARDS}" = "2" ]; then
- BOOT_CARDTYPE="EMMC"
- NUMCARDS="2"
- OTHER_CARDDEV="1"
- OTHER_CARDTYPE="SD"
- fi
- elif [ "$O_BOARD" = "XU" ]; then
- ADATA_PART_ORIG="3"
- ACACHE_PART_ORIG="4"
- ODROID_DTB="exynos5422-odroidxu3.dtb"
- ODROID_FSTAB="fstab.odroidxu3"
- ODROID_IMAGE="zImage"
- ODROID_ASYSTEMIMAGE="system.img"
- BKP_PREFIX="XU"
- [ "${BOOT_CARDTYPE}" = "eMMC" ] && BOOT_CARDTYPE="EMMC"
- if [ "${NUMCARDS}" = "2" ]; then
- if [ "${BOOT_CARDTYPE}" = "SD" ]; then
- OTHER_CARDDEV="0"
- OTHER_CARDTYPE="EMMC"
- else
- OTHER_CARDDEV="1"
- OTHER_CARDTYPE="SD"
- BOOT_CARDDEV="0"
- fi
- fi
- fi
- # =========================================================
- # === Functions ===
- # Get OS description from boot.ini
- #-----------------------------------------------------
- get_descr() {
- _desc=""
- local _descx=
- _descx=`cat /${_actmount}/${_ini_prefix}/$1 | grep \#DESCRIPTION`
- if [ ! "${_descx}" = "" ]; then
- _desc=$(echo ${_descx} | sed -r 's/^.{13}//')
- fi
- if [ "${_desc}" = "" ]; then
- _desc="${2}"
- fi
- }
- #-----------------------------------------------------
- #----------------------------------------------------------------------------------------------------
- restore_bootini() {
- printf "\033[31m\033[1m %s\033[22m\033[37m" "${1}"
- cp /mnt1/${_ini_prefix}/boot.ini.multi /mnt1/boot.ini > /dev/null 2>&1
- [ "${O_BOARD}" = "XU" ] && cp /mnt1/${_ini_prefix}/boot.scr.multi /mnt1/boot.scr > /dev/null 2>&1
- umount /mnt_a > /dev/null 2>&1
- sleep 3
- }
- #----------------------------------------------------------------------------------------------------
- #-----------------------------------------------------------------------------------------------------------------------
- change_afstab() {
- # === Configure Android fstab to mount the right partitions ===
- if [ -f /mnt_a/${ODROID_FSTAB} ]; then
- if [ "${1}" = "yes" ]; then
- # Two cards, boot to Android on NON Boot card
- if [ ! "${O_BOARD}" = "XU" ]; then
- sed -i "s/\/dev\/block\/mmcblk0/\/dev\/block\/mmcblk1/g" /mnt_a/${ODROID_FSTAB}
- # on C2 prepare boot.ini for boot from sdcard
- sed -i "s/root=\/dev\/mmcblk0p2/root=\/dev\/mmcblk1p2/g" /mnt1/boot.ini
- else
- if [ "${OTHER_CARDTYPE}" = "SD" ]; then
- cp /mnt_a/${ODROID_FSTAB}.other /mnt_a/${ODROID_FSTAB}
- sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.andro_1/g" /mnt1/boot.ini
- else
- cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
- sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
- fi
- fi
- else
- # One or two cards, boot to Android on Boot card
- if [ ! "${O_BOARD}" = "XU" ]; then
- # Restore boot device if modified earlier
- sed -i "s/\/dev\/block\/mmcblk1/\/dev\/block\/mmcblk0/g" /mnt_a/${ODROID_FSTAB}
- else
- if [ "${NUMCARDS}" = "1" ]; then
- cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
- sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
- else
- # Two cards, boot to Android on Boot card
- if [ "${BOOT_CARDTYPE}" = "SD" ] && [ "${BOOT_CARDDEV}" = "1" ]; then
- cp /mnt_a/${ODROID_FSTAB}.other /mnt_a/${ODROID_FSTAB}
- sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.andro_1/g" /mnt1/boot.ini
- else
- cp /mnt_a/${ODROID_FSTAB}.orig /mnt_a/${ODROID_FSTAB}
- sed -i "s/setenv akernel zImage/setenv akernel \/multiboot\/zImage.android/g" /mnt1/boot.ini
- fi
- fi
- fi
- fi
- if [ "${O_BOARD}" = "XU" ]; then
- cp -f /mnt_a/${ODROID_FSTAB} /mnt_a/${ODROID_FSTAB}.sdboot
- fi
- else
- restore_bootini "${ODROID_FSTAB} not found"
- return 1
- fi
- return 0
- }
- #-----------------------------------------------------------------------------------------------------------------------
- #----------------------------------------------------------------------------------------------------------------------
- # =======================================================================
- # On C2 boot drive is always mmcblk0 and is mounted on /mnt1
- # On XU3/XU4 boot drive can be mmcblk0 or mmcblk1 and is mounted on /mnt1
- # =======================================================================
- do_boot() {
- [ "${1}" = "none" ] && return 0
- local change_drive="no"
- local _oncard=""
- _actmount="mnt1"
- if [ "${3}" = "2" ]; then
- # Operating system on NON BOOT card
- _actmount="mnt2"
- change_drive="yes"
- fi
- if [ "${NUMCARDS}" = "2" ]; then
- if [ "${_actmount}" = "mnt1" ]; then
- _oncard=" on ${BOOT_CARDTYPE}"
- else
- _oncard=" on ${OTHER_CARDTYPE}"
- fi
- fi
- if [ -f /${_actmount}/${_ini_prefix}/${1} ]; then
- boot_fail="yes"
- printf "\r\033[2K"
- printf " Booting to \033[32m%s\033[37m\033[36m%s\033[37m" "${2}" "${_oncard}"
- # === Copy selected boot.ini to BOOT partition
- cp /${_actmount}/${_ini_prefix}/${1} /mnt1/boot.ini > /dev/null 2>&1
- if [ ! $? -eq 0 ]; then
- restore_bootini "ERROR copying /${_actmount}/${_ini_prefix}/${1}"
- return 1
- fi
- sleep 1
- if [ "${change_drive}" = "yes" ]; then
- # === boot.ini from NON-BOOT card, prepare it for boot from BOOT card ===
- if [ "${O_BOARD}" = "C2" ]; then
- # for kernel/initrd/dtb loading
- sed -i "s/fatload mmc 0:1/fatload mmc 1:1/g" /mnt1/boot.ini
- # for boot.ini loading from /multiboot (it was changed with previous sed operation!)
- sed -i "s/1:1 0x60000000/0:1 0x60000000/g" /mnt1/boot.ini
- elif [ "${O_BOARD}" = "C1" ]; then
- # for kernel/initrd/dtb loading
- sed -i "s/fatload mmc 0:1/fatload mmc 1:1/g" /mnt1/boot.ini
- # for boot.ini loading from /multiboot (it was changed with previous sed operation!)
- sed -i "s/1:1 0x30000000/0:1 0x30000000/g" /mnt1/boot.ini
- else
- # for kernel/initrd/dtb loading
- sed -i "s/setenv change_osdev no/setenv change_osdev yes/g" /mnt1/boot.ini
- fi
- fi
- if [ "${1}" = "boot.ini.android" ]; then
- # === mount destination android system partition to prepare android fstab ===
- mkdir /mnt_a > /dev/null 2>&1
- if [ "${change_drive}" = "yes" ]; then
- mount -t ext4 /dev/mmcblk${OTHER_CARDDEV}p2 /mnt_a > /dev/null 2>&1
- else
- mount -t ext4 /dev/mmcblk${BOOT_CARDDEV}p2 /mnt_a > /dev/null 2>&1
- fi
- if [ $? -ne 0 ]; then
- restore_bootini "Mount Android system partition ERROR"
- return 1
- fi
- # === Configure Android fstab to mount the right partitions ===
- change_afstab "${change_drive}"
- [ $? -ne 0 ] && return 1
- umount /mnt_a > /dev/null 2>&1
- # =============================================================
- fi
- if [ "${O_BOARD}" = "XU" ]; then
- # Convert boot.ini to boot.scr
- mkimage -C none -A arm -T script -d /mnt1/boot.ini /mnt1/boot.scr > /dev/null 2>&1
- if [ $? -ne 0 ]; then
- restore_bootini "mkimage (boot.scr) ERROR"
- return 1
- fi
- if [ -f /mnt1/multiboot/newscr ]; then
- mkimage -C none -A arm -T script -d /mnt1/multiboot/boot.ini.multi /mnt1/multiboot/boot.scr.multi > /dev/null 2>&1
- if [ $? -ne 0 ]; then
- restore_bootini "mkimage (boot.scr.multi) ERROR"
- return 1
- fi
- rm -f /mnt1/multiboot/newscr > /dev/null 2>&1
- fi
- fi
- sleep 1
- umount /mnt1
- umount /mnt2 > /dev/null 2>&1
- fsck.fat -aw /dev/mmcblk${BOOT_CARDDEV}p1 > /dev/null 2>&1
- reboot
- fi
- }
- #----------------------------------------------------------------------------------------------------------------------
- # Check where the installation files are located
- check_source() {
- if [ -b ${1} ]; then
- mkdir /mnt3 > /dev/null 2>&1
- /bin/mountx ${1} /mnt3
- [ $? -ne 0 ] && return 1
- else
- return 1
- fi
- sleep 1
- # === Source drive found and 1st partition mounted on /mnt ===
- # === Check installation files on source drive ===
-
- if [ -f /mnt3/backupJeedom.tar.gz ]; then
- printf "\r\033[2K"
- printf " BACKUP ARCHIVE FOUND! UNCOMPRESSING, PLEASE WAIT..."
- tar -xvzmf /mnt3/backupJeedom.tar.gz -C /mnt3
- fi
- # LINUX
- if [ -d /mnt3/C2_backup/linux ]; then
- if [ -f /mnt3/C2_backup/linux/jeedom.img ]; then
- _instfound="yes"
- fi
- fi
- umount /mnt3
- [ "${_instfound}" = "no" ] && return 1
- return 0
- }
- #------------------------------------------------------
- set_menu_key() {
- _menu_key="\\$(printf '%03o' ${_menu_no})"
- if [ $_menu_no -eq 49 ]; then
- _menuitem_1="${1}"
- _mndscr_1="${_desc}"
- [ "${_actmount}" = "mnt2" ] && _mncrd_1="2"
- elif [ $_menu_no -eq 50 ]; then
- _menuitem_2="${1}"
- _mndscr_2="${_desc}"
- [ "${_actmount}" = "mnt2" ] && _mncrd_2="2"
- elif [ $_menu_no -eq 51 ]; then
- _menuitem_3="${1}"
- _mndscr_3="${_desc}"
- [ "${_actmount}" = "mnt2" ] && _mncrd_3="2"
- elif [ $_menu_no -eq 52 ]; then
- _menuitem_4="${1}"
- _mndscr_4="${_desc}"
- [ "${_actmount}" = "mnt2" ] && _mncrd_4="2"
- elif [ $_menu_no -eq 53 ]; then
- _menuitem_5="${1}"
- _mndscr_5="${_desc}"
- [ "${_actmount}" = "mnt2" ] && _mncrd_5="2"
- elif [ $_menu_no -eq 54 ]; then
- _menuitem_6="${1}"
- _mndscr_6="${_desc}"
- [ "${_actmount}" = "mnt2" ] && _mncrd_6="2"
- elif [ $_menu_no -eq 55 ]; then
- _menuitem_7="${1}"
- _mndscr_7="${_desc}"
- [ "${_actmount}" = "mnt2" ] && _mncrd_7="2"
- elif [ $_menu_no -eq 56 ]; then
- _menuitem_8="${1}"
- _mndscr_8="${_desc}"
- [ "${_actmount}" = "mnt2" ] && _mncrd_8="2"
- fi
- let _menu_no=_menu_no+1
- let _numos=_numos+1
- }
- #------------------------------------------------------
- #---------------------------------------------------------------------------------------------
- # shellcheck disable=SC2059
- get_menu_items() {
- local _oncard=""
- if [ "${NUMCARDS}" = "2" ]; then
- if [ "${_actmount}" = "mnt1" ]; then
- _oncard=" on ${BOOT_CARDTYPE}"
- else
- _oncard=" on ${OTHER_CARDTYPE}"
- fi
- fi
- if [ -f /${_actmount}/${_ini_prefix}/boot.ini.android ]; then
- get_descr "boot.ini.android" "Android"
- set_menu_key "boot.ini.android"
- printf "\033[36m \033[32m\033[1m${_menu_key}\033[22m\033[36m boot to \033[32m${_desc}\033[36m${_oncard}\n"
- fi
- if [ -f /${_actmount}/${_ini_prefix}/boot.ini.linux ]; then
- get_descr "boot.ini.linux" "Linux"
- set_menu_key "boot.ini.linux"
- printf "\033[36m \033[33m\033[1m${_menu_key}\033[22m\033[36m boot to \033[33m${_desc}\033[36m${_oncard}\n"
- fi
- if [ -f /${_actmount}/${_ini_prefix}/boot.ini.oelec ]; then
- get_descr "boot.ini.oelec" "OpenElec"
- set_menu_key "boot.ini.oelec"
- printf "\033[36m \033[37m\033[1m${_menu_key}\033[22m\033[36m boot to \033[37m${_desc}\033[36m${_oncard}\n"
- fi
- if [ -f /${_actmount}/${_ini_prefix}/boot.ini.linux2 ]; then
- get_descr "boot.ini.linux2" "Linux #2"
- set_menu_key "boot.ini.linux2"
- printf "\033[36m \033[33m\033[1m${_menu_key}\033[22m\033[36m boot to \033[33m${_desc}\033[36m${_oncard}\n"
- fi
- }
- #---------------------------------------------------------------------------------------------
- #-----------------------------------------------------------------------------------------------------
- do_halt() {
- umount /mnt1 > /dev/null 2>&1
- umount /mnt2 > /dev/null 2>&1
- local B="X"
- local _reboot_delay=60
- while [ $_reboot_delay -gt 0 ]; do
- printf "\r\033[2K"
- printf " \033[31m\033[1m%s, press R to reboot %s\033[22m\033[37m\r" "${1}" "$_reboot_delay"
- if read -n 1 -t 1 -s B; then
- _reboot_delay=60
- if [ "${B}" = "r" ] || [ "${B}" = "R" ]; then
- printf "\r\033[2K"
- reboot
- fi
- else
- let _reboot_delay=_reboot_delay-1
- fi
- done
- reboot
- }
- #-----------------------------------------------------------------------------------------------------
- #-----------------------------------------------------------------------------------------------------------------
- os_detect() {
- _desc=""
- _ini_prefix="multiboot"
- _actmount="mnt1"
- _numos=0
- _menu_no=49
- _menu_key="1"
- _menuitem_1=""
- _menuitem_2=""
- _menuitem_3=""
- _menuitem_4=""
- _menuitem_5=""
- _menuitem_6=""
- _menuitem_7=""
- _menuitem_8=""
- _mndscr_1=""
- _mndscr_2=""
- _mndscr_3=""
- _mndscr_4=""
- _mndscr_5=""
- _mndscr_6=""
- _mndscr_7=""
- _mndscr_8=""
- _mncrd_1="1"
- _mncrd_2="1"
- _mncrd_3="1"
- _mncrd_4="1"
- _mncrd_5="1"
- _mncrd_6="1"
- _mncrd_7="1"
- _mncrd_8="1"
- _boot_delay=2
- _defboot="none"
- _defdescr="none"
- _defcard="1"
- # prepare cards mount points
- mkdir /mnt1 > /dev/null 2>&1
- mkdir /mnt2 > /dev/null 2>&1
- umount /mnt1 > /dev/null 2>&1
- umount /mnt2 > /dev/null 2>&1
- umount /mnt > /dev/null 2>&1
- clear
- # Detect new partitions after install
- blkid > /dev/null 2>&1
- # ================================
- # Mount available cards
- # ================================
- mount -t vfat /dev/mmcblk${BOOT_CARDDEV}p1 /mnt1 > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- if [ "${NUMCARDS}" = "2" ]; then
- mount -t vfat /dev/mmcblk${OTHER_CARDDEV}p1 /mnt2 > /dev/null 2>&1
- if [ $? -ne 0 ]; then
- OTHER_CARDDEV="9"
- fi
- fi
- else
- # === SOMETHING IS VERY WRONG ===
- do_halt "BOOT CARD NOT MOUNTABLE"
- fi
- clear
- printf "\n"
- printf "\033[36m\033[1m\n"
- printf " ============================\n"
- printf " = JEEDOM BOOT MENU %s =\n" "${SCRIPT_VERSION}"
- printf " ============================\n"
- if [ "${NUMCARDS}" = "2" ]; then
- printf "\033[22m Two cards detected, booted from \033[1m%s\033[22m\033[37m\n\n" "${BOOT_CARDTYPE}"
- else
- printf "\033[22m Booted from \033[1m%s\033[22m\033[37m\n\n" "${BOOT_CARDTYPE}"
- fi
- #===================================================
- # === Detect available OS's and print menu items ===
- #===================================================
- _menu_no=49
- # Scan boot card first
- _actmount="mnt1"
- if [ -b /dev/disk/by-label/sduserdata ] || [ -b /dev/disk/by-label/emuserdata ]; then
- get_menu_items
- if [ "${NUMCARDS}" = "2" ]; then
- _actmount="mnt2"
- [ ! ${_numos} -eq 0 ] && printf "\n"
- get_menu_items
- fi
- #[ ${_numos} -eq 0 ] && printf "\033[36m \033[36m\033[1m!\033[22m NO OS DETECTED\033[36m\n"
- else
- get_menu_items
- #[ ${_numos} -eq 0 ] && printf "\033[36m \033[36m\033[1m!\033[22m NO MULTIBOOT CARD DETECTED\033[36m\n"
- fi
- printf "\n"
- printf " \033[36m\033[1mB\033[22m Backup JEEDOM\033[36m\n"
- printf " \033[33m\033[1mI\033[22m Install JEEDOM\033[36m\n"
- printf "\n"
- printf " \033[36m\033[1mX\033[22m Exit to busybox shell\033[36m\n"
- printf " \033[33m\033[1mR\033[22m Reboot\033[36m\n"
- printf "\n"
- printf "\n"
- # === Get default boot ===
- if [ "${DEFAULTBOOT}" = "1" ] && [ ! "${_menuitem_1}" = "none" ]; then
- _defboot="${_menuitem_1}"
- _defdescr="${_mndscr_1}"
- _defcard="${_mncrd_1}"
- elif [ "${DEFAULTBOOT}" = "2" ] && [ ! "${_menuitem_2}" = "none" ]; then
- _defboot="${_menuitem_2}"
- _defdescr="${_mndscr_2}"
- _defcard="${_mncrd_2}"
- elif [ "${DEFAULTBOOT}" = "3" ] && [ ! "${_menuitem_3}" = "none" ]; then
- _defboot="${_menuitem_3}"
- _defdescr="${_mndscr_3}"
- _defcard="${_mncrd_3}"
- elif [ "${DEFAULTBOOT}" = "4" ] && [ ! "${_menuitem_4}" = "none" ]; then
- _defboot="${_menuitem_4}"
- _defdescr="${_mndscr_4}"
- _defcard="${_mncrd_4}"
- elif [ "${DEFAULTBOOT}" = "5" ] && [ ! "${_menuitem_5}" = "none" ]; then
- _defboot="${_menuitem_5}"
- _defdescr="${_mndscr_5}"
- _defcard="${_mncrd_5}"
- elif [ "${DEFAULTBOOT}" = "6" ] && [ ! "${_menuitem_6}" = "none" ]; then
- _defboot="${_menuitem_6}"
- _defdescr="${_mndscr_6}"
- _defcard="${_mncrd_6}"
- elif [ "${DEFAULTBOOT}" = "7" ] && [ ! "${_menuitem_7}" = "none" ]; then
- _defboot="${_menuitem_7}"
- _defdescr="${_mndscr_7}"
- _defcard="${_mncrd_7}"
- elif [ "${DEFAULTBOOT}" = "8" ] && [ ! "${_menuitem_8}" = "none" ]; then
- _defboot="${_menuitem_8}"
- _defdescr="${_mndscr_8}"
- _defcard="${_mncrd_8}"
- fi
- if [ "${_defboot}" = "none" ]; then
- if [ ! "${_menuitem_1}" = "none" ]; then
- _defboot="${_menuitem_1}"
- _defdescr="${_mndscr_1}"
- _defcard="${_mncrd_1}"
- DEFAULTBOOT="1"
- elif [ ! "${_menuitem_2}" = "none" ]; then
- _defboot="${_menuitem_2}"
- _defdescr="${_mndscr_2}"
- _defcard="${_mncrd_2}"
- DEFAULTBOOT="2"
- elif [ ! "${_menuitem_3}" = "none" ]; then
- _defboot="${_menuitem_3}"
- _defdescr="${_mndscr_3}"
- _defcard="${_mncrd_3}"
- DEFAULTBOOT="3"
- elif [ ! "${_menuitem_4}" = "none" ]; then
- _defboot="${_menuitem_4}"
- _defdescr="${_mndscr_4}"
- _defcard="${_mncrd_4}"
- DEFAULTBOOT="4"
- elif [ ! "${_menuitem_5}" = "none" ]; then
- _defboot="${_menuitem_5}"
- _defdescr="${_mndscr_5}"
- _defcard="${_mncrd_5}"
- DEFAULTBOOT="5"
- elif [ ! "${_menuitem_6}" = "none" ]; then
- _defboot="${_menuitem_6}"
- _defdescr="${_mndscr_6}"
- _defcard="${_mncrd_6}"
- DEFAULTBOOT="6"
- elif [ ! "${_menuitem_7}" = "none" ]; then
- _defboot="${_menuitem_7}"
- _defdescr="${_mndscr_7}"
- _defcard="${_mncrd_7}"
- DEFAULTBOOT="7"
- elif [ ! "${_menuitem_8}" = "none" ]; then
- _defboot="${_menuitem_8}"
- _defdescr="${_mndscr_8}"
- _defcard="${_mncrd_8}"
- DEFAULTBOOT="8"
- fi
- fi
- }
- #-----------------------------------------------------------------------------------------------------------------
- os_detect
- # ======================================
- # === Main loop, never exit ===
- # === Wait for user OS/action select ===
- # ======================================
- _boot_delay=$BOOTDELAY
- check_source "/dev/sda1"
- # === Detect available Operating Systems ===
- while true; do
- printf "\r\033[2K"
- 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}"
- A="Z"
- if [ "${_instfound}" = "yes" ]; then
- # === UNIVERSAL INSTALLER ===
- if [ -f /install.script ]; then
- printf "\r\033[2K"
- printf " USB BACKUP FOUND! LAUNCHING INSTALL..."
- sleep 4
- umount /mnt1 > /dev/null 2>&1
- umount /mnt2 > /dev/null 2>&1
- sleep 1
- # ============================
- # Execute the installer script
- UPGRADE_ANDROID="no"
- /install.script
- # ============================
- A="Z"
- os_detect
- _boot_delay=$BOOTDELAY
- else
- printf "\r\033[2K"
- printf " INSTALL SCRIPT NOT FOUND!"
- sleep 4
- fi
- fi
- if read -n 1 -t 1 -s A; then
- _boot_delay=$BOOTDELAY
- if [ "${A}" = "B" ]; then
- # === BACKUP ===
- if [ -f /backup.script ]; then
- umount /mnt1 > /dev/null 2>&1
- umount /mnt2 > /dev/null 2>&1
- sleep 1
- # =========================
- # Execute the backup script
- /backup.script
- # =========================
- A="Z"
- os_detect
- _boot_delay=$BOOTDELAY
- else
- printf "\r\033[2K"
- printf " BACKUP SCRIPT NOT FOUND!"
- sleep 4
- fi
- elif [ "${A}" = "I" ]; then
- # === UNIVERSAL INSTALLER ===
- if [ -f /install.script ]; then
- umount /mnt1 > /dev/null 2>&1
- umount /mnt2 > /dev/null 2>&1
- sleep 1
- # ============================
- # Execute the installer script
- UPGRADE_ANDROID="no"
- /install.script
- # ============================
- A="Z"
- os_detect
- _boot_delay=$BOOTDELAY
- else
- printf "\r\033[2K"
- printf " INSTALL SCRIPT NOT FOUND!"
- sleep 4
- fi
- elif [ "${A}" = "U" ]; then
- # === ANDROID UPGRADE ====
- if [ -f /install.script ]; then
- umount /mnt1 > /dev/null 2>&1
- umount /mnt2 > /dev/null 2>&1
- sleep 1
- # =========================
- # Execute the backup script
- UPGRADE_ANDROID="yes"
- /install.script
- # =========================
- A="Z"
- os_detect
- _boot_delay=$BOOTDELAY
- else
- printf "\r\033[2K"
- printf " BACKUP SCRIPT NOT FOUND!"
- sleep 4
- fi
- elif [ "${A}" = "X" ]; then
- # === ENTER BUSYBOX ===
- clear
- printf "\n\n\n Entering \033[32mBusybox\033[37m shell\n"
- printf " Execute \033[32mexit\033[37m to return to menu\n\n"
- umount /mnt1 > /dev/null 2>&1
- umount /mnt2 > /dev/null 2>&1
- sleep 1
- #For C2 show cursor
- [ ! "${O_BOARD}" = "XU" ] && tput cnorm
- #===============
- break="bbox"
- maybe_break bbox
- #===============
- printf "\n \033[32mBusybox exited\033[37m\n"
- sleep 2
- #For C2 hide cursor
- [ ! "${O_BOARD}" = "XU" ] && tput civis
- A="Z"
- os_detect
- _boot_delay=$BOOTDELAY
- elif [ "${A}" = "R" ]; then
- # REBOOT ===
- _reboot_delay=10
- B="X"
- while [ $_reboot_delay -gt 0 ]; do
- printf "\r\033[2K"
- 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"
- if read -n 1 -t 1 -s B; then
- _reboot_delay=10
- if [ "${B}" = "a" ] || [ "${B}" = "A" ]; then
- printf "\r\033[2K"
- break
- elif [ "${B}" = "r" ] || [ "${B}" = "R" ]; then
- _reboot_delay=0
- break
- fi
- else
- let _reboot_delay=_reboot_delay-1
- fi
- done
- if [ $_reboot_delay -eq 0 ]; then
- cp -f /*.ppm /mnt1 > /dev/null 2>&1
- umount /mnt1 > /dev/null 2>&1
- umount /mnt2 > /dev/null 2>&1
- reboot
- fi
- elif [ "${A}" = "s" ]; then
- # SCREENSHOT ===
- fbcat > /mb_menu.ppm
- elif [ $_numos -gt 0 ]; then
- # === BOOT to selected OS
- boot_fail="no"
- [ "${A}" = "1" ] && [ ! "${_menuitem_1}" = "none" ] && do_boot "${_menuitem_1}" "${_mndscr_1}" "${_mncrd_1}"
- [ "${A}" = "2" ] && [ ! "${_menuitem_2}" = "none" ] && do_boot "${_menuitem_2}" "${_mndscr_2}" "${_mncrd_2}"
- [ "${A}" = "3" ] && [ ! "${_menuitem_3}" = "none" ] && do_boot "${_menuitem_3}" "${_mndscr_3}" "${_mncrd_3}"
- [ "${A}" = "4" ] && [ ! "${_menuitem_4}" = "none" ] && do_boot "${_menuitem_4}" "${_mndscr_4}" "${_mncrd_4}"
- [ "${A}" = "5" ] && [ ! "${_menuitem_5}" = "none" ] && do_boot "${_menuitem_5}" "${_mndscr_5}" "${_mncrd_5}"
- [ "${A}" = "6" ] && [ ! "${_menuitem_6}" = "none" ] && do_boot "${_menuitem_6}" "${_mndscr_6}" "${_mncrd_6}"
- [ "${A}" = "7" ] && [ ! "${_menuitem_7}" = "none" ] && do_boot "${_menuitem_7}" "${_mndscr_7}" "${_mncrd_7}"
- [ "${A}" = "8" ] && [ ! "${_menuitem_8}" = "none" ] && do_boot "${_menuitem_8}" "${_mndscr_8}" "${_mncrd_8}"
- if [ "${boot_fail}" = "yes" ]; then
- # === BOOT ERROR ===
- sleep 4
- os_detect
- _boot_delay=$BOOTDELAY
- fi
- fi
- else
- let _boot_delay=_boot_delay-1
- if [ $_boot_delay -eq 0 ]; then
- # Default boot
- [ $_numos -gt 0 ] && [ ! "${_defboot}" = "none" ] && do_boot "${_defboot}" "${_defdescr}" "${_defcard}"
- # === BOOT ERROR ===
- sleep 4
- os_detect
- _boot_delay=$BOOTDELAY
- fi
- fi
- printf "\r"
- done
- # Just in case...
- printf "\n\n"
- umount /mnt1 > /dev/null 2>&1
- umount /mnt2 > /dev/null 2>&1
- printf "\033[36m REBOOT ...\n"
- reboot
- #---------------------------------------------------------------------------
|