diff options
Diffstat (limited to 'packages/altboot/files/init.altboot')
-rw-r--r-- | packages/altboot/files/init.altboot | 606 |
1 files changed, 0 insertions, 606 deletions
diff --git a/packages/altboot/files/init.altboot b/packages/altboot/files/init.altboot deleted file mode 100644 index 74200d1ec9..0000000000 --- a/packages/altboot/files/init.altboot +++ /dev/null @@ -1,606 +0,0 @@ -#!/bin/sh -# -# altboot provides a simple bootmenu before init is beeing run. -# There are two default menu entries: "Normal boot" and "Single user mode" -# New menu entries can be created be putting files into /etc/altboot-menu. -# - -test -e /etc/altboot.func && . /etc/altboot.func || die "ERROR: /etc/altboot.func not found. Check your installation!" - -CURRENT_ENV="`set`" -VERSION="DEVELOPER SNAPSHOT" - -# Set some defaults in case altboot.cfg is missing -REAL_INIT="/sbin/init.sysvinit" - -# Read default runlevel from inittab -INIT_RUNLEVEL="`cat /etc/inittab | sed -n "/^id\:/s/id\:\([0-9]\)\:.*$/\1/p"`" -test -z "$INIT_RUNLEVEL" && INIT_RUNLEVEL=5 - -# If this step fails the results are fatal. Seen on Collie / kernel 2.4 (where else...) -OUT_TTY="`tty`" ; test -z "$OUT_TTY" && OUT_TTY="/dev/tty1" - -if ( echo "$OUT_TTY" | grep -q "not" ) -then - OUT_TTY="/dev/tty1" - echo "WARNING: Assignment of OUT_TTY failed (2)!" > "$OUT_TTY" -fi - -case "`uname -r`" in -2.6*) ALTBOOT_CFG_FILE="/etc/altboot-2.6.cfg";; -2.4*) ALTBOOT_CFG_FILE="/etc/altboot-2.4.cfg";; -*) echo "Warning: Unknown kernel [`uname -r`], using kernel 2.6 configuration!" - ALTBOOT_CFG_FILE="/etc/altboot-2.6.cfg";; -esac - -test -e "$ALTBOOT_CFG_FILE" && . "$ALTBOOT_CFG_FILE" || echo "WARNING: No $ALTBOOT_CFG_FILE found! Check your installation of Altboot!" > "$OUT_TTY" - -if test -e "${ALTBOOT_CFG_FILE}.next-reboot" -then - . "${ALTBOOT_CFG_FILE}.next-reboot" - rm "${ALTBOOT_CFG_FILE}.next-reboot" -fi - -ENABLE_DEBUG="$ENABLE_DEBUGGING" - -C_RED="\033[31m" -C_YELLOW="\033[33m" -C_BLUE="\033[34m" -C_WHITE="\033[37m" -C_RESET="\033[0m" - - -die() { - echo -e "${C_RED}ERROR: $1${C_RESET}" >"$OUT_TTY" - exec $SH_SHELL <"$OUT_TTY" >"$OUT_TTY" 2>&1 -} - -debug_shell() { - # VT 2 = Opie, VT 3 = GPE - test -z "$1" && VT=4 || VT=$1 - - echo -e "\033c" > /dev/tty$VT - - echo -en "\nPress <ENTER> to activate the debug shell." > /dev/tty$VT - read junk </dev/tty$VT - - echo "" > /dev/tty$VT - /bin/sh </dev/tty$VT >/dev/tty$VT 2>&1 - - #openvt -lf -c$VT -- /bin/sh </dev/tty$VT >/dev/tty$VT 2>&1 -} - -# This function prints the boot-menu -# $1: Directory containing the scripts for the menu-items -show_menu() { - test -z "$1" && die "DEBUG: Parameter 1 is empty in show_menu" - ! test -d "$1" && die "show_menu: [$1] not found or no directory." - - echo "" - echo -e "altboot v$VERSION\n" - - m_entry="" - - cd $1 - - cnt=0 ; reset_pref "menu_filelist" - for file in `ls -1` - do -# debug_echo "show_menu(): file = [$file]" - if ! test -d "$1/$file" - then - # NOTE: It is important to use "." here so that the script inherits - # the shell environment / all set variables! - M_TITLE="`. $1/$file title`" - FLAGS="`$1/$file flags`" - - if ! test -z "$M_TITLE" - then - let cnt=$cnt+1 - # Keep a list of existing "modules" together with an index number - # This sure is ugly, but Busybox sh doesn't do arrays.... - #m_entry="`echo -e "$m_entry\n$cnt:$file\n"`" - - set_pref "menu_filelist" "$cnt" "$file" - test -n "$FLAGS" && set_pref "menu_fileflags" "$cnt" "$FLAGS" - echo -e "\t\t[$cnt] $M_TITLE" - fi - M_TITLE="" - fi - done - -# debug_echo "FILES READ" - - # Display directories below /etc/altboot-menu as menu-item - # and add all scripts inside the directory to m_entry - for dir in `ls -1` - do - if test -d "$1/$dir" - then - M_TITLE="`basename "$1/$dir"`" - if ! test -z "$M_TITLE" - then - let cnt=$cnt+1 - # Keep a list of existing "modules" together with an index number - # This sure is ugly, but Busybox sh doesn't do arrays.... - - set_pref "menu_filelist" "$cnt" "$dir:DIR" - - # Set noRemember flag for directories - set_pref "menu_fileflags" "$cnt" "noRemember" - - echo -e "\t\t[$cnt] $M_TITLE" - - OLD_PWD="$PWD" - cd "$1/$dir" - for file in `ls -1` - do - if ! test -d "$1/$dir/$file" - then - M_TITLE="`$1/$dir/$file title`" - FLAGS="`$1/$dir/$file flags`" - - if ! test -z "$M_TITLE" - then - let cnt=$cnt+1 - # Keep a list of existing "modules" together with an index number - # This sure is ugly, but Busybox sh doesn't do arrays.... - - set_pref "menu_filelist" "$cnt" "$dir/$file" - test -n "$FLAGS" && set_pref "menu_fileflags" "$cnt" "$FLAGS" - fi - M_TITLE="" - fi - done - cd "$OLD_PWD" - - else - debug_echo "show_menu(): \$M_TITLE is empty" - fi - M_TITLE="" - fi - done - -# debug_echo "DIRS READ" - - echo "" -} - -# This function is used to display the content of directories below -# /etc/altboot-menu as menu-items -show_sub_menu() { - dirname="`basename "$1"`" - - d_entries="`dump_pref "menu_filelist" | grep "$dirname/"`" - - echo -e "\naltboot v$VERSION: $dirname menu\n" - - for d_entry in $d_entries - do - d_entry_number="`echo "$d_entry"| sed -n "s/\(.*\)\#\#\(.*\)\#\#\#/\1/p"`" - d_entry_file="`echo "$d_entry"| sed -n "s/\(.*\)\#\#\(.*\)\#\#\#/\2/p"`" - d_entry_title="`$d_entry_file title`" - - echo -e "\t\t[$d_entry_number] $d_entry_title" - done - - echo "" - -} - -get_kbd_ints(){ - if ( uname -r | grep -q ^2.6 ) - then - if test -z "$KBD_INT" - then - # find out how the keyboard is called - for kbd in Spitzkbd corgikbd locomokbd tosakbd "Neo1973 AUX button" - do - if ( cat /proc/interrupts | grep -q "$kbd" ) - then - debug_echo "run_timer(): Using [$kbd] as keyboard interrupt" - KBD_INT="$kbd" - break - fi - done - fi - key_ints="`cat /proc/interrupts | grep "$KBD_INT"`" - #debug_echo "run_timer(): key_ints = [$key_ints]" - else - KBD_INT="$kbd" - debug_echo "\nrun_timer(): Using [keyboard] as keyboard interrupt in kernel-2.4 mode" - key_ints="`cat /proc/interrupts | grep keyboard | awk '{print $2}'`" - fi - - test -z "$KBD_INT" && debug_echo "Couldn't read keyboard ints!" -} - -# Shows the timer and sets $launch_altboot to yes if a keypress was detected -run_timer() { - if test "$TIMEOUT" != 0 -a "$TIMEOUT" != "[none]" - then - - mount -t proc proc /proc >/dev/null 2>&1 - - get_kbd_ints - kbd_ints_old="$key_ints" - - #debug_echo "run_timer() old:`echo $key_ints | md5sum`" - - stty -echo <"$OUT_TTY" >"$OUT_TTY" 2>&1 - - case "$KBD_INT" in - Neo1973*) echo -en "\n\nPlease press [AUX] to launch altboot." > "$OUT_TTY" ;; - *) echo -en "\n\nPlease press any key to launch altboot." > "$OUT_TTY" ;; - esac - - test -z "$TIMEOUT" && TIMEOUT="3" - - cnt=0 - while test "$cnt" != "$TIMEOUT" - do - sleep 1 - - get_kbd_ints - kbd_ints_new="$key_ints" - - if test "$kbd_ints_new" != "$kbd_ints_old" -o -z "$kbd_ints_new" - then - launch_altboot=yes - stty echo <"$OUT_TTY" >"$OUT_TTY" 2>&1 - break - fi - echo -n "." >"$OUT_TTY" - let cnt=$cnt+1 - done - - if test "$launch_altboot" != "yes" - then - AUTOBOOT=yes - else - rm -f /etc/.altboot*.last - fi - - else - launch_altboot=yes - fi - - if test "$TIMEOUT" = "[none]" - then - echo "" - echo -e "altboot v$VERSION ($MACHINE)\n" - - echo "NOTE: The menu is not available on this device" - echo "Use \"set-bootdev\" to change the boot device" - - launch_altboot=no - fi -} - -# $1 = ID -parse_module_flags() { - if test -n "$1" - then - # Each module can set "flags" to influence handling of the module - get_pref "menu_fileflags" "$1" flags - - test -n "$flags" && debug_echo "parse_module_flags(): [$1] has flags [$flags]" - - for flag in $flags - do - case "$flag" in - noRemember) REMEMBER_LAST_SELECTION=no;; - esac - done - else - debug_echo "parse_module_flags(): Empty \$1" - fi -} - -# This function launches the selected menu item / script -# $1: Directory containing the scripts for the menu-items -launch_selection() { - test -z "$1" && die "Parameter 1 of launch_selection is empty!" - - case "$junk" in - *) #file="`echo "$m_entry"| sed -n "/$junk\:/s/^.*\:\(.*\)/\1/p"`" - - get_pref "menu_filelist" "$junk" file_ - type="`echo "$file_" | sed -n "s/\(.*\)\:\(.*\)/\2/p"`" - file="`echo "$file_" | sed -n "s/\(.*\)\:\(.*\)/\1/p"`" - test -z "$file" && file="$file_" - -# debug_echo "[$file_]: [$type] : [$flags] / [$file] ($junk)" - - # The selected menu-item points to a directory - if test "$type" = DIR - then - show_sub_menu /etc/altboot-menu/$file >"$OUT_TTY" - wait_for_input >"$OUT_TTY" - launch_selection /etc/altboot-menu >"$OUT_TTY" - fi - - if test "$type" = MAIN - then - show_sub_menu /etc/altboot-menu >"$OUT_TTY" - wait_for_input >"$OUT_TTY" - launch_selection /etc/altboot-menu >"$OUT_TTY" - fi - - - - . $1/$file run "$file" >"$OUT_TTY" - die "WARNING: Using failsafe shell" >"$OUT_TTY" - - ;; - esac -} - - -wait_for_input() { - - # Neo has only two buttons: AUX and PWR. - # Only AUX is easily readable from userspace, so are touchscreen taps - if test "$KBD_INT" = "Neo1973 AUX button" - then - ints_old="`cat /proc/interrupts | grep "$KBD_INT" | awk '{print $2}'`" - ts_ints_old="`cat /proc/interrupts |grep action| tail -1 | awk '{print $2}'`" - - echo "Please press [AUX] to set a menu number" <"$OUT_TTY" > "$OUT_TTY" 2>&1 - echo -e "Press the touchscreen to start\n" - - x="$last_selection" ; hold_events=0 - - echo -n "Your Choice: [$x / $cnt]" - - while true - do - - ts_ints_now="`cat /proc/interrupts |grep action| tail -1 | awk '{print $2}'`" - - if test "$ts_ints_now" = "$ts_ints_old" - then - ints_now="`cat /proc/interrupts | grep "$KBD_INT" | awk '{print $2}'`" - - if test "$ints_now" -gt "$ints_old" - then - # Only react on every second interupt as both PRESS and RELEASE generate - # one. - if test -n "$tmp" - then - #debug_echo "wait_for_input(): PRESS/RELEASE EVENT [$ints_now <-> $ints_old]" - - MAX_ENTRIES="$cnt" - - test "$x" = "$cnt" && x=1 || let x=$x+1 - - #\r : go to beginning of the current line - #\033[K : completely clear the current line - echo -en "\r\033[KYour Choice: [$x / $cnt]" - - - tmp="" - else - tmp=blahh - fi - fi - - ints_old="$ints_now" - else -# debug_echo "wait_for_input(): TOUCHSCREEN EVENT [$ts_ints_now <-> $ts_ints_old]" - ts_ints_old="$ts_ints_now" - - parse_module_flags "$x" - - if test "$REMEMBER_LAST_SELECTION" != no - then - # Don't remount rw if the drive is already mounted rw - # Only helpful for testing / debugging - if test "`mount|sed -n "/\/dev\/root/s/.*(\(.*\))/\1/p"`" != "rw" - then - mount -o remount,rw / >/dev/null 2>&1 - echo "$x" > /etc/altboot.conf - mount -o remount,ro / >/dev/null 2>&1 - else - echo "$x" > /etc/altboot.conf - fi - fi - - junk="$x" - break - - fi - done - else - while true - do - - # Do _not_ change the next few lines! - # - # This is required to work around an annoying busybox bug. - # Every key you press while this script runs will be - # picked up by the next "read $junk". - # So the next read would pick up the "any" key the user pressed - # above to launch the altboot menu. - - - # Bash throws an ugly error on kill - if ! (readlink /bin/sh | grep -q bash) - then - # This filters an "<ENTER>" from the user as "any key" - ( while :; do read x< "$OUT_TTY" 2>&1; done; ) > /dev/null 2>&1 & - sleep 1; kill $! >/dev/null 2>&1 - fi - - echo -n "Please choose one of the above [$last_selection]: " <"$OUT_TTY" > "$OUT_TTY" 2>&1 - stty echo <"$OUT_TTY" >"$OUT_TTY" 2>&1 - read junk< "$OUT_TTY" 2>&1 - - # This filters other chars the user may have used - - junk="`echo "$junk" | sed "s/[a-zA-Z]//g"`" - - if test "$junk" -lt "$cnt" -o "$junk" -eq "$cnt" - then - if test ! -z "$junk" - then - parse_module_flags "$junk" - - if test "$REMEMBER_LAST_SELECTION" != no - then - # Don't remount rw if the drive is already mounted rw - # Only helpful for testing / debugging - if test "`mount|sed -n "/\/dev\/root/s/.*(\(.*\))/\1/p"`" != "rw" - then - mount -o remount,rw / >/dev/null 2>&1 - echo "$junk" > /etc/altboot.conf - mount -o remount,ro / >/dev/null 2>&1 - else - echo "$junk" > /etc/altboot.conf - fi - fi - else - junk="$last_selection" - parse_module_flags "$junk" - break - fi - break - fi - done - fi -} - -# * * * * * * This is the main function * * * * * * - -if ( echo "$VERSION" | egrep -iq "(snapshot|-rc)" ) -then - if test "$ENABLE_DEBUGGING" = "auto" -o -z "$ENABLE_DEBUGGING" - then - ENABLE_DEBUG="yes" - fi -fi - -test "$ENABLE_DEBUG_SHELL" = "yes" && debug_shell 4 >/dev/null 2>&1 & - -if test "$ENABLE_DEBUGGING" = "yes" -then - ENABLE_DEBUG="yes" - debug_shell 4 >/dev/null 2>&1 & -fi - -# Note: this is positively ugly. If someone knows a better way to detect whether -# we are already booted into a runlevel _without_ reading /var and / or using `runlevel` -# PLEASE let me know. -# -# The NSLU2 is an exception as it uses the way-ugly busybox "ps" -# - -mount | grep -q "^/proc" || mount -t proc proc /proc -MACHINE="`cat /proc/cpuinfo | sed -n "/^Hardware/s/.*\:\ \(.*\)/\1/p"`" - -case "$MACHINE" in - *NSLU2) if test -f /proc/cmdline -a "`ps |wc -l|tr -d " "`" -gt 25 -a "$1" != "-force" -a "$1" != "+force" - then - user_called=1 - fi - ;; - - *) if test -f /proc/cmdline -a "`ps ax|wc -l|tr -d " "`" -gt 30 -a "$1" != "-force" -a "$1"!= "+force" >/dev/null 2>&1 - then - user_called=1 - fi - ;; -esac - -if test "`basename "$0"`" = "altboot" -then - show_menu /etc/altboot-menu - exit 0 -fi - -if test "$user_called" = "1" -then - echo "altboot: Using real init [$REAL_INIT] [$*] [`ps |wc -l|tr -d " "`] *" >"$OUT_TTY" - exec $REAL_INIT $* -# exec $SH_SHELL </dev/tty0 >/dev/tty0 2>&1 - exit 0 -else - # Boot original init if altboot is turned off - if test "$ENABLE_ALTBOOT" != "yes" - then - echo "altboot: Using real init [$REAL_INIT] **" >"$OUT_TTY" - exec $REAL_INIT $INIT_RUNLEVEL - exit 0 - fi - - # Execute scripts in /etc/altboot.rc before doing anything else. - # Required in special situations, like booting spitz - RC_FILES=`ls /etc/altboot.rc | grep \.sh$` - - for file in $RC_FILES - do - . /etc/altboot.rc/$file >"$OUT_TTY" 2>&1 || echo "/etc/altboot.rc/$file failed!" - done - - # Make sure altboots master password is set - set_password >"$OUT_TTY" - - test "$ASK_PW_ON_BOOT" = "yes" && verify_master_pw >"$OUT_TTY" - - # When started with -force, always print the menu - echo "$*" | grep -q -- "-force" && TIMEOUT=0 - - # This timeout works by reading /proc/interrupts to see if the keyboard interrupt - # increases while the timer is running. A TIMEOUT of 0 will always launch altboot. - run_timer >"$OUT_TTY" - - echo "" >"$OUT_TTY" - - # launch_altboot is set to "yes" by run_timer when the user presses the button during the timeout - if test "$launch_altboot" != yes - then - # last_selection is the previously selected menu item by the user - last_selection="`cat /etc/altboot.conf`" >/dev/null 2>&1 - test -z "$last_selection" && last_selection="1" - - echo "Booting last selection: [$last_selection]" >"$OUT_TTY" - - # Set up the wanna-be array of available menu entries and their numbers - show_menu /etc/altboot-menu >/dev/null 2>&1 - - junk="$last_selection" - launch_selection /etc/altboot-menu >"$OUT_TTY" - fi - - # Anything after this point will never be reached if $launch_altboot != yes - - # Show the altboot menu - stty -echo <"$OUT_TTY" >"$OUT_TTY" 2>&1 - show_menu /etc/altboot-menu >"$OUT_TTY" - - # Load last selection for use as default if <ENTER> is pressed at the prompt - last_selection="`cat /etc/altboot.conf`" >/dev/null 2>&1 - test -z "$last_selection" && last_selection="1" - - # Ask the user which menu-item to use - wait_for_input >"$OUT_TTY" - - # This should _never_ happen. - if test -z "$junk" - then - echo "WARNING: Trying failsafe mode" >"$OUT_TTY" - mount -o remount,rw / >"$OUT_TTY" 2>&1 - echo "Dumping environment to /altboot.env" - echo "$CURRENT_ENV" > /altboot.env - mount -o remount,ro / >"$OUT_TTY" 2>&1 - junk=1 - fi - - launch_selection /etc/altboot-menu >"$OUT_TTY" - - # Uhoh, something went terribly wrong if we reach this point! - die "WARNING: Failsafe fall-through activated. Spawning emergency shell" - -fi - - |