#!/bin/bash #: Title : fastboot #: Date Created: Sun Oct 30 09:42:11 CDT 2011 #: Last Edit : Sat Mar 3 9:08:11 CDT 2012 #: Author : James D. McDaniel #: Version : 1.40 #: Description : uses kexec to restart kernel #: Options : fastboot [#] for grub menu entry to use TITLE="FastBoot for Grub Legacy Menu using Kexec - Version 1.40" # # Written for the openSUSE forums on Saturday March 3, 2012 # # # Copy and Paste the text of this script into a text editor and save # it as the file fastboot in the folder /usr/local/bin as root. # in KDE use: kdesu kwrite fastboot & in gnome use: gnomesu gedit fastboot # This script must be marked executable to be used. Please run # the following Terminal command: sudo chmod +x /usr/local/bin/fastboot # # # This is the standard GPL Statement, leave at the top of the script. # Just use the command show_gpl after this function for it to be shown. # function show_gpl { color 7 0 B echo "" echo "fastboot is a bash script file written to be used with openSUSE." echo "Copyright (C) 2011 by James D. McDaniel, jmcdaniel3@austin.rr.com" echo "" echo "This program is free software; you can redistribute it and/or modify" echo "it under the terms of the GNU General Public License as published by" echo "the Free Software Foundation; either version 2 of the License, or" echo "(at your option) any later version." echo "" echo "This program is distributed in the hope that it will be useful," echo "but WITHOUT ANY WARRANTY; without even the implied warranty of" echo "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" echo "GNU General Public License for more details." echo "" echo "You should have received a copy of the GNU General Public License" echo "along with this program; if not, write to the Free Software" echo "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA" echo "" color 7 0 N return 0 } # # Do you want to see fastboot in color? ************************************ # The default is true, but can be set to false ******************************** # New Escape Sequences work without a Desktop loaded ************************** # use_color=true # # Color Display Request - color forground background [b/n] ******************** # Called from more than 10 locations in program # # 0:Black 1:Blue 2:Green 3:Cyan 4:Red 5:Magenta 6:Yellow 7:White # # Example: color 7 0 B # # where forground is white (7), backgroud is black (0) and text is in bold (B) # $1 $2 $3 # function color { if $use_color ; then if [[ $3 == [Bb] ]] ; then case "$1" in "0") echo -ne '\E[1;30m' ;; "1") echo -ne '\E[1;34m' ;; "2") echo -ne '\E[1;32m' ;; "3") echo -ne '\E[1;36m' ;; "4") echo -ne '\E[1;31m' ;; "5") echo -ne '\E[1;35m' ;; "6") echo -ne '\E[1;33m' ;; "7") echo -ne '\E[1;37m' ;; *) echo -ne '\E[1;37m' ;; esac else case "$1" in "0") echo -ne '\E[30m' ;; "1") echo -ne '\E[34m' ;; "2") echo -ne '\E[32m' ;; "3") echo -ne '\E[36m' ;; "4") echo -ne '\E[31m' ;; "5") echo -ne '\E[35m' ;; "6") echo -ne '\E[33m' ;; "7") echo -ne '\E[37m' ;; *) echo -ne '\E[37m' ;; esac fi case "$2" in "0") echo -ne '\E[40m' ;; "1") echo -ne '\E[44m' ;; "2") echo -ne '\E[42m' ;; "3") echo -ne '\E[46m' ;; "4") echo -ne '\E[41m' ;; "5") echo -ne '\E[45m' ;; "6") echo -ne '\E[43m' ;; "7") echo -ne '\E[47m' ;; *) echo -ne '\E[40m' ;; esac else echo -ne '\E[37;40m' fi if [[ $3 == [Nn] ]] ; then tput sgr0 fi return 0 } # # Produced using figlet ******************************************************* # function banner { color 2 0 B cat << "EOFBANNER" __ _ _ _ / _| __ _ ___| |_| |__ ___ ___ | |_ | |_ / _` / __| __| '_ \ / _ \ / _ \| __| | _| (_| \__ \ |_| |_) | (_) | (_) | |_ |_| \__,_|___/\__|_.__/ \___/ \___/ \__| ____ _ _ ____ _____ ___ _ __ ___ _ __ / ___|| | | / ___|| ____| / _ \| '_ \ / _ \ '_ \\___ \| | | \___ \| _| | (_) | |_) | __/ | | |___) | |_| |___) | |___ \___/| .__/ \___|_| |_|____/ \___/|____/|_____| |_| EOFBANNER color 7 0 B return 0 } # # fastboot can create a kde desktop icon if you want *************************** # fastbootcheck=true fastbooticon="$HOME/Desktop/fastboot.desktop" # # Check/Create fastboot Icon on the kde desktop ******************************* # function deskicon { if $fastbootcheck ; then let de=0 which ps 2>&1 > /dev/null if [ $? -eq 0 ] ; then ps nc -C plasma-desktop >/dev/null && let de=1 if [ $de -eq 1 ] ; then if [ ! -e $fastbooticon ] ; then cat >> "$fastbooticon" << "EOFTEXT" [Desktop Entry] Comment[en_US]= Comment= Exec=/usr/local/bin/fastboot GenericName[en_US]=fastboot GenericName=fastboot Icon=yast-bootloader MimeType= Name[en_US]=fastboot Name=fastboot Path= StartupNotify=true Terminal=true TerminalOptions= Type=Application X-DBUS-ServiceName= X-DBUS-StartupType= X-KDE-SubstituteUID=false X-KDE-Username= X-SuSE-translate=true EOFTEXT chmod +x $fastbooticon fi fi fi fi return 0 } # # Set columns & Widths ******************************************************** # function set_display { WIDTH=$(tput cols) HEIGHT=$(tput lines) # Starting Terminal Line Number for menu s_line=0 # Starting Terminal Column Number for Menu if [ $(($WIDTH)) -le 60 ] ; then s_col=0 else s_col=$((($WIDTH - 60) / 2 )) fi return 0 } # # fastboot header display ***************************************************** # function header { dash1="----------------------------------------------------------" tput clear tput cup $(( s_line )) $(( s_col )) color 2 0 B echo $dash1 color 7 2 B tput cup $(( s_line+1 )) $(( s_col )) echo " $TITLE " color 2 0 B tput cup $(( s_line+2 )) $(( s_col )) echo $dash1 color 7 0 B echo return 0 } # # Error display function ****************************************************** # function input_error { header color 4 0 B message=$1 len=${#message} if [ $len -lt 52 ] ; then let len=52-len let len=len/2 else len=0 fi tput cup $(( s_line+4 )) $(( s_col+len )) echo "Error: $message" color 7 0 B tput cup $(( s_line+6 )) $(( s_col+13 )) echo -n "Press Any Key to Try again ... " read something color 7 0 N exit $2 return 0 } # # Display Actual Kernel Loading command *************************************** # function kernel_command { P1=$(echo "$@" | awk '{print $1}') P2=$(echo "$@" | awk '{print $2}') ; len2=${#P2} ; P2=${P2:2:len2-2} P3=$(echo "$@" | awk '{print $3}') ; len3=${#P3} ; P3=${P3:2:len3-2} RC=$(echo "$@" | grep "resume=" ) if [ "$RC" == "" ] ; then let offset2=1 P5=$(echo "$@" | awk '{for(i=4; i<=NF; i++) {printf("%s ", $i)}}') else P4=$(echo "$@" | awk '{print $4}') P5=$(echo "$@" | awk '{for(i=5; i<=NF; i++) {printf("%s ", $i)}}') fi len=${#P1} if [ ${#P2} -gt $len ] ; then len=${#P2} fi if [ ${#P3} -gt $len ] ; then len=${#P3} fi if [ ${#P4} -gt $len ] ; then len=${#P4} fi if [ ${#P5} -gt $len ] ; then len=${#P5} fi let len=len+8 if [ $len -lt $WIDTH ] ; then s_col=$((($WIDTH - $len) / 2 )) else s_col=0 fi return 0 } # # fastboot Help Display Function ********************************************** # function help { tput clear color 3 0 B cat << EOFHELP $TITLE fastboot [x [y]] ( Example: fastboot 1 fastboot 1 3 ) fastboot requires no Startup Options, But if you use them, your choices are: fastboot x ; Select Kernel to be loaded [1 through max menu entries] fastbbot x y ; Same as above but adds kernel load option y like a 3 fastboot -h ; Shows this help fastboot --help ; Shows this help EOFHELP color 2 0 B echo -n " Press to read the GPL Statement for fastboot " read CHOICE color 7 0 B header banner show_gpl exit 0 return 0 } # # fastboot help request ******************************************************* # case "$1" in -h|--help) help ;; esac # # Check to see if we are root ************************************************ # if [[ $UID -ne 0 ]]; then deskicon cont=true tput clear while $cont ; do color 7 0 B id -Gn | grep -q wheel || echo "Root User Permissions are required, Please Enter the ..." echo sudo $0 $@ Exit_Code=$? if [ $Exit_Code -eq 0 ] ; then cont=false fi if [ $Exit_Code -eq 2 ] ; then cont=false fi done header banner show_gpl exit 0 else tput clear fi # # Determine if the package kexec-tools is installed *********************************** # which /sbin/kexec > /dev/null Exit_Code=$? if [ $(( Exit_Code )) -ge 1 ] ; then clear color 7 4 B echo "The kexec-tools Utility Package is not installed!" color 7 0 B echo echo -n "Would you like to install the kexec-tools package(y/N)? " read CHOICE if [[ $CHOICE == [Yy] ]] ; then sudo zypper in kexec-tools else color 7 4 B echo "The kexec-tools Utility Package was not installed!" color 7 0 B exit 1 fi fi # # Main Program Starts here **************************************************** # unset number dollar1=$1 set_display # Use the first parameter or show a menu if none is specified if [ "$1" != "" ] ; then # Make sure the selected number is an integer if [[ $1 =~ ^[0-9]+$ ]] ; then number=$1 else input_error "The selected parameter $1 is not valid number" 2 exit 0 fi else # # My Replacement Menu starts here ********************************************* # size=$(cat /boot/grub/menu.lst | grep -c "title" ) menu=true while $menu ; do header inc=1 offset=0 # Display The Kernel load options while [ $inc -le $size ] ; do titles[$inc]=$(cat /boot/grub/menu.lst | grep "title"| sed -n $(( inc ))p) len=${#titles[$inc]} titles[$inc]=${titles[$inc]:6:len-6} win=$( echo ${titles[$inc]} | grep -v -i "windows") if [ "$win" != "" ] ; then tput cup $(( s_line+3+$inc-offset )) $(( s_col )) if [ $inc -lt 10 ] ; then echo -n " $inc) " else echo -n " $inc) " fi color 3 0 B echo "${titles[$inc]}" color 7 0 B else let offset=offset+1 fi let inc=inc+1 done echo echo color 7 1 B tput cup $(( s_line+5+$size-offset )) $(( s_col )) echo -n "Type the Kernel # to Boot [1-$size] & press (Q=Quit):" color 7 0 B echo -n " " read number if [[ $number =~ ^[0-9]+$ ]] ; then if [[ $number -le $size ]] && [[ $number -gt 0 ]]; then menu=false fi fi if [[ $number == [Qq] ]] ; then exit 0 fi done fi # # determine the kernel commands *********************************************** # if [ "$2" == "" ] ; then options="" else shift options="$@" fi menu=true while $menu ; do unset kernel unset initrd unset append item=0 # Parse GRUBs menu.lst while read key val extra; do [[ $key = "title" ]] && ((item++)) # Count the number of title's (( item == number )) || continue # Wait until the right number [[ $key = "kernel" ]] && kernel="$val" && append="$extra" [[ $key = "initrd" ]] && initrd="$val" done < /boot/grub/menu.lst [[ $kernel ]] || input_error " No kernel with number $number & Windows can't use Kexec!" 1 # http://stackoverflow.com/questions/2167558/give-the-mount-point-of-a-path root="$(df /boot | tail -n 1 | awk '{ print $NF}')" set -- "$root$kernel" [[ -n "${initrd+set}" ]] && set -- "$@" --initrd="$root$initrd" set -- "$@" --append="$append $options" # # Show and Confirm Kernel to boot from **************************************** # if [ "$dollar1" == "" ] ; then kernel_command "$@" header tput cup $(( s_line+4 )) $(( s_col )) echo "You have selected to boot using Kexec & kernel ..." tput cup $(( s_line+6 )) $(( s_col )) echo -n "$number) " color 3 0 B echo "${titles[$number]}" color 7 0 B tput cup $(( s_line+8 )) $(( s_col )) color 6 1 B echo "kernel=$P1" tput cup $(( s_line+9 )) $(( s_col )) echo "$P2" tput cup $(( s_line+10 )) $(( s_col )) echo "$P3" RC=$(echo "$@" | grep "resume=" ) tput cup $(( s_line+11 )) $(( s_col )) if [ "$RC" == "" ] ; then echo "options: $P5" else echo "$P4" tput cup $(( s_line+12 )) $(( s_col )) echo "options: $P5" fi tput cup $(( s_line+14-offset2 )) $(( s_col )) color 7 1 B echo -n "Do you Wish to Continue? (Y/N) or A=Add kernel load option:" color 7 0 B echo -n " " read CHOICE echo if [[ $CHOICE == [Nn] ]] ; then menu=false exit 0 fi if [[ $CHOICE == [Qq] ]] ; then menu=false exit 0 fi if [[ $CHOICE == [Yy] ]] ; then menu=false fi if [[ $CHOICE == [Aa] ]] ; then color 7 4 B tput cup $(( s_line+16-offset2)) $(( s_col )) echo -n "Enter kernel load option to add & press :" color 7 0 B echo -n " " read options fi else menu=false fi done kexec "$@" color 7 4 B tput cup $(( s_line+17 )) $(( s_col )) echo "Booting Selected Kernel $number Now in Progress ... " color 7 0 N exit 0 # End Of Script