#!/bin/bash # # This script represents an interface between the postinstall and postuninstall # scripts of kernel rpms and the update-bootloader script. # # Interface: # ---------- # /usr/lib/bootloader/bootloader_entry [add|remove] # # Call Semantics: # --------------- # [ -x $cmd ] && $cmd # # # Author: aosthof@suse.de # # Print how to use this script correctly function usage() { echo "Unknown or missing parameter." echo "Usage: $0 [add|remove] " echo echo "The old interface with 4 parameters is still supported, but deprecated." echo "This interface will be dropped in the near future." echo "Usage: $0 [add|remove] " exit 1 } # Get all command line arguments function getargs() { # old interface with 4 parameters if [ $# -eq 4 ] ; then action=${1} # contains the action to be executed, e.g. "add" or "remove" flavor=${2#*-} # contains the kernel-flavor, e.g. "default" or "xen" flavor=${flavor%%-*} release=${2#*-*-} # contains the kernel-release, e.g. "2.6.18-4-default" release=${release%.*.*} release="${release}-${flavor}" image=${3} # contains the full image name, e.g. "vmlinuz-2.6.18-4-default" initrd=${4} # contains the full initrd name, e.g. "initrd-2.6.18-4-default" # new interface with 5 parameters else action=${1} # contains the action to be executed, e.g. "add" or "remove" flavor=${2} # contains the kernel-flavor, e.g. "default" or "xen" release=${3} # contains the kernel-release, e.g. "2.6.18-4-default" image=${4} # contains the full image name, e.g. "vmlinuz-2.6.18-4-default" initrd=${5} # contains the full initrd name, e.g. "initrd-2.6.18-4-default" fi } # Wrapper for the update-bootloader function function update_bootloader() { [ -x /sbin/update-bootloader -a "$YAST_IS_RUNNING" != instsys ] || return 0 /sbin/update-bootloader "$@" } ############################## # Add a new bootloader entry # ############################## function add_entry() { # Set up the new kernel if [ "$YAST_IS_RUNNING" != instsys ]; then case $flavor in (kdump|um) ;; (xen*) opt_xen_kernel= set -- $flavor set -- ${1#xen} opt_xen_kernel=--xen-kernel=/boot/xen${1:+-$1}.gz # Add the new bootloader entry update_bootloader --image /boot/$image \ --initrd /boot/$initrd \ --add \ --force $opt_xen_kernel \ --name "Kernel-$release" # Run the bootloader (e.g., lilo). update_bootloader --refresh ;; (*) # Add the new bootloader entry update_bootloader --image /boot/$image \ --initrd /boot/$initrd \ --default \ --add \ --force \ --name "Kernel-$release" # Run the bootloader (e.g., lilo). update_bootloader --refresh ;; esac fi } ####################################### # Remove an existing bootloader entry # ####################################### function remove_entry() { # Do not specify the name of a bootloader entry when removing it, thus # removing all sections matching the kernel image and initrd names # (either both a "linux" and a "failsafe" section, or a section # installed with the kernel postinstall script). # # Rationale: we do not know whether the old entry has # - the product name as its name (when installed with # yast-bootloader) or # - "Kernel-" (when installed with the kernel package's # postinstall script and perl-Bootloader). # # So we cannot use the name to find the correct section. # This is safe, because on grub, this does still not match other # sections on other partitions with the same name for the kernel # image and initrd (because they will still have the (hdx,y) prefix # in perl-Bootloader). Other bootloaders do not specify other # sections at all, or do only chainload them (BootLILO.ycp), and # thus do not match either. (#223030) if [ $flavor == "xen" ]; then update_bootloader --image /boot/$image \ --initrd /boot/$initrd \ --xen \ --remove \ --force else update_bootloader --image /boot/$image \ --initrd /boot/$initrd \ --remove \ --force fi # Run the bootloader (e.g., lilo). update_bootloader --refresh } ##################### M A I N ############################################### # Checks if correct amount of arguments is given if [ "$#" -ne "4" -a "$#" -ne "5" ] ; then usage fi # Get all given arguments getargs $@ # Find out which action should be executed case $action in add) # Add a new bootloader entry add_entry ;; remove) # Remove an existing bootloader entry remove_entry ;; *) # Unknown argument usage ;; esac