pb-udhcpc: use plain kernel names for dhcp events
[petitboot] / utils / pb-udhcpc
index bc0f759c09c525805c08709ce22d00b01531a249..bac16dad5dc322b8c20cd0008b9dd6fdcb7c1ebe 100644 (file)
 #
 
 PBOOT_USER_EVENT_SOCKET="/tmp/petitboot.ev"
-log="pb-udhcpc.log"
+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
 
-       echo -ne "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 () {
-       echo -ne "remove@/net/${interface}\0name=netboot\0" | pb-event
+       pb-event remove@${interface} name=netboot
 }
 
 case "$1" in
@@ -33,6 +117,6 @@ deconfig)
        ;;
 esac
 
-echo "--- $1 ---" >> ${log}
+printf "--- $1 ---\n" >> ${log}
 set >> ${log}
-echo "---------------" >> ${log}
+printf "---------------\n" >> ${log}