]> git.ozlabs.org Git - petitboot/blobdiff - utils/pb-udhcpc
hooks/add-offb: Add leading slash to HVC node paths
[petitboot] / utils / pb-udhcpc
index 729de080885247280aa07ee3b82b886292a5989a..7ed9035d5e9dad89f7880a0815e645320b8939d4 100644 (file)
 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=$(cat /sys/class/net/$interface/address)
-       pb-event $params url=$basedir/$mac
+       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 pxepathprefix 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
-       if [ -n "${conffile}" ]
+       # Check if an explicit boot file present. If there is, add it as
+       # an option directly.
+       if [ -z "${bootfile}" ]
        then
-               url=$(resolve_url ${conffile})
-               pb-event conf@/net/${interface} url=$url method=dhcp
-               return
+               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
+       paramstr=""
 
-       # 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#*:}
+       # Collect relevant parameters to add an option to the bootfile
+       # parameter
+       for name in rootpath siaddr bootfile
+        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} name="netboot $interface ($bootfile)" \
+               $paramstr
 }
 
 pb_remove () {
-       pb-event remove@/net/${interface} name=netboot
+       pb-event remove@${interface}
 }
 
 case "$1" in
-bound | renew)
+bound)
        pb_add
        ;;
 deconfig)