X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=utils%2Fpb-udhcpc;h=4ff0dcf2dc9328d71cd8deaff2b69e4120a2dc58;hp=252bb11d3ec1cd54ce3572e01e03e7aeb657c1f0;hb=44e10d816427c001d60eb5e7b3e75b740e5a2823;hpb=f41f900809ab0338f5c159b08f07de53dcb46ca3;ds=sidebyside diff --git a/utils/pb-udhcpc b/utils/pb-udhcpc index 252bb11..4ff0dcf 100644 --- a/utils/pb-udhcpc +++ b/utils/pb-udhcpc @@ -9,104 +9,52 @@ 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" - 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@/net/${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/net/$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 pxeconffile 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@/net/${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@/net/${interface} \ - name=netboot \ - image=tftp://${siaddr}/${boot_file} \ - args="$args" + pb-event add@{interface} $paramstr } pb_remove () { - pb-event remove@/net/${interface} name=netboot + pb-event remove@${interface} name=netboot } case "$1" in -bound | renew) +bound) pb_add ;; deconfig)