diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/pb-udhcpc | 103 |
1 files changed, 25 insertions, 78 deletions
diff --git a/utils/pb-udhcpc b/utils/pb-udhcpc index dd291b9..3494985 100644 --- a/utils/pb-udhcpc +++ b/utils/pb-udhcpc @@ -9,97 +9,44 @@ PBOOT_USER_EVENT_SOCKET="/tmp/petitboot.ev" log="/var/log/petitboot/pb-udhcpc.log" -resolve_url() { - file="$1" - - # URL? use as-is. - tmp=${file%://*} - if [ "$tmp" != "$file" ] - then - echo "$file" - return - fi - - # Otherwise, TFTP using an appropriate host. Start with the - # DHCP 'tftp' option: - host=${tftp} - - # next, try the DHCP next-server-address - [ -z "$host" ] && host=${siaddr} - - # finally, use the DHCP server we got this lease from: - [ -z "$host" ] && host=${serverid} - - echo "tftp://$host/$file" -} - -do_pxe() { - basedir=$1 - - params="conf@${interface} method=dhcp" +pb_add () { + # Looks like udhcpc will give us different names, depending if the + # parameter was in the header, or specified by options + [ -z "$bootfile" ] && bootfile=${boot_file} - # first, try by MAC - mac=$(tr ':' '-' < /sys/class/$interface/address) - pb-event $params url=$basedir/01-$mac + mac=$(< /sys/class/net/$interface/address) + paramstr='' - # try decreasing fragments of IP lease - ip_hex=$(printf '%02X%02X%02X%02X' $(echo $ip | tr '.' ' ')) - for i in $(seq 8 -1 1) + # Collect relevant DHCP response parameters into $paramstr + for name in conffile bootfile mac ip siaddr serverid tftp do - frag=${ip_hex:0:$i} - pb-event $params url=$basedir/$frag - done + value=$(eval "echo \${$name}") + [ -n "$value" ] || continue; - # last, use default - pb-event $params url=$basedir/default -} + paramstr="$paramstr $name=$value" + done -pb_add () { + pb-event dhcp@{interface} $paramstr - # Look for an explicit config file location in the DHCP config-file - # parameter + # Check if an explicit config file present if [ -n "${conffile}" ] then - url=$(resolve_url ${conffile}) - pb-event conf@${interface} url=$url method=dhcp - return - fi - - # Otherwise, we'll need the boot-file parameter. Looks like udhcpc - # will give us different names, depending if the parameter was in - # the header, or specified by options - [ -z "$bootfile" ] && bootfile=${boot_file} - - if [ -z "$bootfile" ] - then - return + return; fi - # PXE behaviour is to download the config file based on a file - # structure relative to the pxelinux binary - file=${bootfile} - [ -z "$file" ] && file=${boot_file} - if [ -n "$file" ] - then - basedir=${file%%/*} - do_pxe $basedir - fi + # Finally, add an option for the boot_file parameter + paramstr='name=netboot' - # Finally, add an option for the boot_file parameter - k_server_ip=${rootpath%%:*} - k_root_dir=${rootpath#*:} + # Collect relevant parameters to add an option to the boot_file parameter + for name in rootpath siaddr boot_file + do + value=$(eval "echo \${$name}") + [ -n "$value" ] || continue; - args= - if [ -n "$rootpath" ] - then - [ ${k_server_ip} != ${rootpath} ] || k_server_ip=${serverid} - args="root=/dev/nfs ip=any nfsroot=${k_server_ip}:${k_root_dir}" - fi + paramstr="$paramstr $name=$value" + done - pb-event add@${interface} \ - name=netboot \ - image=tftp://${siaddr}/${boot_file} \ - args="$args" + pb-event add@{interface} $paramstr } pb_remove () { |