X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=utils%2Fpb-udhcpc;h=dd291b9a0fa61441f072b2b75251abdf160056b5;hp=91d40f6c01f37eb89ea468cd8ee9a8afca8b699e;hb=ab7076882bc49d895209bf0ecb84e4003e034dd9;hpb=e3ebf4d2ebe3464257655f059ea020565a536643 diff --git a/utils/pb-udhcpc b/utils/pb-udhcpc index 91d40f6..dd291b9 100644 --- a/utils/pb-udhcpc +++ b/utils/pb-udhcpc @@ -9,21 +9,105 @@ 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" + + # first, try by MAC + mac=$(tr ':' '-' < /sys/class/$interface/address) + pb-event $params url=$basedir/01-$mac + + # try decreasing fragments of IP lease + ip_hex=$(printf '%02X%02X%02X%02X' $(echo $ip | tr '.' ' ')) + for i in $(seq 8 -1 1) + do + frag=${ip_hex:0:$i} + pb-event $params url=$basedir/$frag + done + + # last, use default + pb-event $params url=$basedir/default +} + pb_add () { + + # Look for an explicit config file location in the DHCP config-file + # parameter + 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 + 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 k_server_ip=${rootpath%%:*} k_root_dir=${rootpath#*:} - [ ${k_server_ip} != ${rootpath} ] || k_server_ip=${serverid} + 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 - printf "add@/net/${interface}\0name=netboot\0image=tftp://${siaddr}/${boot_file}\0args=root=/dev/nfs ip=any nfsroot=${k_server_ip}:${k_root_dir}\0" | pb-event + pb-event add@${interface} \ + name=netboot \ + image=tftp://${siaddr}/${boot_file} \ + args="$args" } pb_remove () { - printf "remove@/net/${interface}\0name=netboot\0" | pb-event + pb-event remove@${interface} name=netboot } case "$1" in -bound | renew) +bound) pb_add ;; deconfig)