grub_cfg_net revision 2
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek#
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek#
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek#
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# This is the GRUB2 microconfig file for network booting. Its purpose is to
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# locate and source the per-client grub.cfg file, which can be found on the
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# TFTP server.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# The image that this file is built into must set its $prefix to a directory
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# whose last component is the GRUB2 platform name of the current system.
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozek# For example, on BIOS systems, $prefix should be ".../i386-pc". This is
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozek# essential for the Solaris network boot GRUB2 configuration file, because
bf9abef629707167d39fcc92ec9c18a6244b27b8Jakub Hrozek# that's what it looks for when trying to determine the current platform.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek#
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# This script should be built into a memdisk image -- it should NOT be
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# passed to grub-mkimage -c, because this script uses advanced scripting
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# functionality that's only part of the GRUB2 `normal' module.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek#
7a14e8f66c0e932fe2954d792614a3b61d444bd1Jakub Hrozek# By the time we get here, $root is set to "(tftp,<IP>)" and $prefix is
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# a platform-specific GRUB2 device path.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek#
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# IMPORTANT: The tests for existence of configfiles here MUST be done with
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# the -s test -- that's the only test that tries a file open and not a
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek# directory traversal, which tftp does not support.
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek#
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozekecho Oracle Solaris Network Boot
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozekecho -n Please wait while the network boot configuration file is located.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekif keystatus -s; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set debug=true
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Shift key pressed -- enabling network config file debug
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekelse
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek sleep 1
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if read -dn debug; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if regexp "[Dd][Dd]*" "$debug"; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo "'d' key pressed - enabling network config file debug"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set debug=true
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek unset debug
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekfi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekif [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo "<BEGIN GRUB2 ENVIRONMENT>"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo "<END OF GRUB2 ENVIRONMENT>"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Searching for config file
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekfi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekif [ -n "$net_efinet0_boot_file" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek # Booting via UEFI
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set net_bootfile="$net_efinet0_boot_file"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set net_mac="$net_efinet0_mac"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekelif [ -n "$net_pxe_boot_file" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek # Booting via BIOS/PXE
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set net_bootfile="$net_pxe_boot_file"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set net_mac="$net_pxe_mac"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekelif [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Neither net_efinet0_boot_file nor net_pxe_boot_file are set.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Config file search will only include one location.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekfi
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek# check for grub.cfg.01<MAC>
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozekif [ ! -z $net_mac ]; then
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek tr -U -s mac $net_mac
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek regexp ([^:]+):([^:]+):([^:]+):([^:]+):([^:]+):([^:]+) $mac -s 1:a -s 2:b -s 3:c -s 4:d -s 5:e -s 6:f
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set mac=$a$b$c$d$e$f
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set clientcfgfile=grub.cfg.01$mac
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo looking for $clientcfgfile
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo -n .
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -s $clientcfgfile ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Found. Press ENTER to continue.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek read discard
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo -n .
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek configfile $clientcfgfile
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek found=1
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek fi
ea929f1b022fc2cb77dec89b0e12accef983ec85Jakub Hrozekfi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# If there is a directory component of the boot file,
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# march up the directory hierarchy starting there
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# looking for the grub.cfg[.<clientid>]
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekif [ -z "$found" -a ! -z $net_bootfile ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if regexp ".*/.*" $net_bootfile ; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek regexp "(.*)/" $net_bootfile -s 1:path
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek while [ -n "$path" ]; do
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -n "$clientcfgfile" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo looking for "${path}/$clientcfgfile"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo -n .
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -s "${path}/$clientcfgfile" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Found. Press ENTER to continue.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek read discard
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo -n .
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek configfile "${path}/$clientcfgfile"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek found=1
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo looking for ${path}/grub.cfg
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo -n .
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -s "${path}/grub.cfg" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Found. Press ENTER to continue.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek read discard
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo -n .
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek configfile "${path}/grub.cfg"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek found=1
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek # go to the next path component:
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if ! regexp "(.*)/" $path -s 1:path; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek break
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek done
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek# Check for grub.cfg.<BootFile>
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek # For BIOS PXE:
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek regexp "pxegrub2\.(.*)" $net_bootfile -s 1:suffix
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -z $suffix ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek # For UEFI64 network boot application:
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek regexp "grub2netx64\.efi\.(.*)" $net_bootfile -s 1:suffix
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -z $suffix ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set suffix=$net_bootfile
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set cfgfile=grub.cfg.$suffix
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek if [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo looking for $cfgfile
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo -n .
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -s $cfgfile ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Found. Press ENTER to continue.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek read discard
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo -n .
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek configfile $cfgfile
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek found=1
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekfi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekif [ -z "$found" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek # Check for grub.cfg
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek set cfgfile=boot/grub/grub.cfg
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Final attempt: looking for $cfgfile
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo -n .
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -s $cfgfile ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ -n "$debug" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Found. Press ENTER to continue.
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek read discard
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek else
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo -n .
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek configfile $cfgfile
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek found=1
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekfi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekif [ -z "$found" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo No GRUB2 network configuration file could be located on the TFTP server!
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo "Press 'r'<ENTER> to reboot or press <ENTER> to enter GRUB"
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek read input
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek if [ "$input" = "r" -o "$input" = "R" ]; then
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek echo Rebooting...
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek reboot
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek fi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozekfi
7797e361155f7ce937085fd98e360469d7baf1b6Jakub Hrozek