From f16a622038244e1324f0cc2952d8d1f3981296df Mon Sep 17 00:00:00 2001 From: jim-p Date: Tue, 20 Nov 2012 09:41:01 -0500 Subject: Fixup kernel detection during upgrade process to ensure someone can't end up with a kernel that doesn't exist any more. --- etc/rc.initial.firmware_update | 16 ++---- tmp/post_upgrade_command | 116 ++++++++++++++++++++++++++------------ usr/local/www/system_firmware.php | 6 +- 3 files changed, 87 insertions(+), 51 deletions(-) diff --git a/etc/rc.initial.firmware_update b/etc/rc.initial.firmware_update index f4363c6..0b600e2 100755 --- a/etc/rc.initial.firmware_update +++ b/etc/rc.initial.firmware_update @@ -155,25 +155,17 @@ function check_for_kernel_file() { } if(!file_exists("/boot/kernel/pfsense_kernel.txt")) { echo "\nPlease select which kernel you would like to use:\n"; - echo "\n1. Non SMP kernel"; - echo "\n2. SMP kernel"; - echo "\n3. Embedded kernel (no video or keyboard)"; - echo "\n4. Developers kernel (slower performing, more debugging)\n"; - echo "\nPlease enter a number [1-4]: "; + echo "\n1. Standard Kernel"; + echo "\n2. Embedded Kernel (no video or keyboard)"; + echo "\nPlease enter a number [1-2]: "; $selection = strtoupper(chop(fgets($fp))); switch ($selection) { case "1": - exec("echo UP > /boot/kernel/pfsense_kernel.txt"); - break; - case "2": exec("echo SMP > /boot/kernel/pfsense_kernel.txt"); break; - case "3": + case "2": exec("echo wrap > /boot/kernel/pfsense_kernel.txt"); break; - case "4": - exec("echo Developers > /boot/kernel/pfsense_kernel.txt"); - break; } echo "\n"; } diff --git a/tmp/post_upgrade_command b/tmp/post_upgrade_command index b497ccd..634afb0 100755 --- a/tmp/post_upgrade_command +++ b/tmp/post_upgrade_command @@ -3,34 +3,78 @@ /etc/rc.conf_mount_rw PFSENSETYPE=`cat /etc/platform` -KERNELTYPE=`cat /boot/kernel/pfsense_kernel.txt` -if [ $KERNELTYPE = "wrap" ]; then - if [ -f /kernels/kernel_wrap.gz ]; then - tar xzpf /kernels/kernel_wrap.gz --exclude loader.conf -C /boot/ - cp /etc/ttys_wrap /etc/ttys - fi +# check in two places for the old kernel type, since it could have been moved elsewhere in the upgrade process. +if [ -f /boot/kernel/pfsense_kernel.txt ]; then + OLDKERNEL=`cat /boot/kernel/pfsense_kernel.txt` +else + OLDKERNEL=`cat /tmp/pfsense_kernel.txt` fi -if [ $KERNELTYPE = "wrap_vga" ]; then - if [ -f /kernels/kernel_wrap_vga.gz ]; then - tar xzpf /kernels/kernel_wrap_vga.gz --exclude loader.conf -C /boot/ - fi -fi -if [ $KERNELTYPE = "Developers" ]; then - if [ -f /kernels/kernel_Dev.gz ]; then - tar xzpf /kernels/kernel_Dev.gz --exclude loader.conf -C /boot/ - cp /boot/kernel/kernel.gz - fi -fi -if [ $KERNELTYPE = "SMP" ]; then - if [ -f /kernels/kernel_SMP.gz ]; then - tar xzpf /kernels/kernel_SMP.gz --exclude loader.conf -C /boot/ - fi -fi -if [ $KERNELTYPE = "UP" ]; then - if [ -f /kernels/kernel_SMP.gz ]; then - tar xzpf /kernels/kernel_uniprocessor.gz --exclude loader.conf -C /boot/ - fi + +# Massage the existing kernel into one that actually exists. +# Leaving old entries so we can bring back other kernels later if desired. +case "$OLDKERNEL" in + "wrap") + KERNELTYPE=wrap + ;; + "wrap_vga") + KERNELTYPE=wrap_vga + ;; + "Developers") + KERNELTYPE=SMP + ;; + "UP") + KERNELTYPE=SMP + ;; + "SMP") + KERNELTYPE=SMP + ;; + *) + KERNELTYPE=SMP + ;; +esac + +# Overwrite the old kernel type with what we're using now to reflect what is about to be written out. +echo ${KERNELTYPE} > /boot/kernel/pfsense_kernel.txt +HAVE_KERNEL=false + +case "${KERNELTYPE}" in + "wrap") + if [ -f /kernels/kernel_wrap.gz ]; then + HAVE_KERNEL=true + tar xzpf /kernels/kernel_wrap.gz --exclude loader.conf -C /boot/ + cp /etc/ttys_wrap /etc/ttys + fi + ;; + "wrap_vga") + if [ -f /kernels/kernel_wrap_vga.gz ]; then + HAVE_KERNEL=true + tar xzpf /kernels/kernel_wrap_vga.gz --exclude loader.conf -C /boot/ + fi + ;; + "Developers") + if [ -f /kernels/kernel_Dev.gz ]; then + HAVE_KERNEL=true + tar xzpf /kernels/kernel_Dev.gz --exclude loader.conf -C /boot/ + fi + ;; + "UP") + if [ -f /kernels/kernel_uniprocessor.gz ]; then + HAVE_KERNEL=true + tar xzpf /kernels/kernel_uniprocessor.gz --exclude loader.conf -C /boot/ + fi + ;; + "SMP") + if [ -f /kernels/kernel_SMP.gz ]; then + HAVE_KERNEL=true + tar xzpf /kernels/kernel_SMP.gz --exclude loader.conf -C /boot/ + fi + ;; +esac + +if [ ${HAVE_KERNEL} = "false" ]; then + echo "ERROR: Unable to locate a kernel upgrade file!" + sleep 5 fi if [ $PFSENSETYPE = "pfSense" ] || [ $PFSENSETYPE = "nanobsd" ]; then @@ -38,17 +82,19 @@ if [ $PFSENSETYPE = "pfSense" ] || [ $PFSENSETYPE = "nanobsd" ]; then fi # Detect interactive logins and display the shell -echo "if [ \`env | grep SSH_TTY | wc -l\` -gt 0 ] || [ \`env | grep cons25 | wc -l\` -gt 0 ]; then" > $CVS_CO_DIR/root/.shrc -echo " /etc/rc.initial" >> $CVS_CO_DIR/root/.shrc -echo " exit" >> $CVS_CO_DIR/root/.shrc -echo "fi" >> $CVS_CO_DIR/root/.shrc -echo "if [ \`env | grep SSH_TTY | wc -l\` -gt 0 ] || [ \`env | grep cons25 | wc -l\` -gt 0 ]; then" >> $CVS_CO_DIR/root/.profile -echo " /etc/rc.initial" >> $CVS_CO_DIR/root/.profile -echo " exit" >> $CVS_CO_DIR/root/.profile -echo "fi" >> $CVS_CO_DIR/root/.profile +detect_command='[ -n "$SSH_TTY" -o "$TERM" = "cons25" ] && exec /etc/rc.initial' +echo "$detect_command" > $CVS_CO_DIR/root/.shrc +echo "$detect_command" >> $CVS_CO_DIR/root/.profile # Now turn on or off serial console as needed -/tmp/post_upgrade_command.php +echo "Checking for /tmp/$1/tmp/post_upgrade_command.php... " >> /conf/upgrade_log.txt +if [ -x /tmp/$1/tmp/post_upgrade_command.php ]; then + echo "Running /tmp/$1/tmp/post_upgrade_command.php $1" >> /conf/upgrade_log.txt + /tmp/$1/tmp/post_upgrade_command.php $1 >> /conf/upgrade_log.txt 2>&1 +elif [ -f /tmp/post_upgrade_command.php ]; then + echo "Running /tmp/post_upgrade_command.php $1" >> /conf/upgrade_log.txt + /tmp/post_upgrade_command.php $1 +fi # Remove any previous MD5 sum files rm -f /root/*.md5 diff --git a/usr/local/www/system_firmware.php b/usr/local/www/system_firmware.php index dfcd8d6..072bfb9 100755 --- a/usr/local/www/system_firmware.php +++ b/usr/local/www/system_firmware.php @@ -51,10 +51,8 @@ require_once("guiconfig.inc"); $curcfg = $config['system']['firmware']; $kerneltypes = array( - 'SMP' => gettext("Multiprocessor kernel"), - 'single' => gettext("Uniprocessor kernel"), - 'wrap' => gettext("Embedded kernel"), - 'Developers' => gettext("Developers kernel") + 'SMP' => gettext("Standard Kernel"), + 'wrap' => gettext("Embedded Kernel"), ); require_once("xmlrpc_client.inc"); -- cgit v1.1