minor improvements and misc changes
[automated-distro-installer] / pxe-server
index 3abb1bac0876916751ef25604c2205a25bb47602..c46c72eb34c1141433f9e8c3c177ab448f034d14 100755 (executable)
@@ -22,26 +22,28 @@ x="$(readlink -f "$BASH_SOURCE")"; source "${x%/*}/bash-trace"
 
 usage() {
   cat <<EOF
-Usage: ${0##*/} [OPTIONS] [HOST TYPE]
-Configure dnsmasq boot options and fai-chboot if appropriate.
+Usage: ${0##*/} [OPTIONS] [HOST] [TYPE]
+Configure dnsmasq boot options and fai-chboot if appropriate. This is
+not general purpose, it has code specific to dhcp servers I run.
 
-Without HOST TYPE, disable  server and fai server.
+Without TYPE, disable  server and fai server. In that case, HOST is only
+needed for fsf office network.
 
 HOST       A hostname known to the dhcp server, or default for all.
 TYPE       One of arch, parabola, plain, fai.
 
--d         Don't alter dhcp config. Only make sense for fai type, and on network
-           other than home network.
--r         Don't redeploy fai config. For example, if there is a different host
-           that is mid-install.
-
 -a         Don't setup pxe, just Wait for 2 dhcp acks, then disable the pxe
            server after a delay.  First ack is for pxe boot, 2nd ack is
            for os boot. Sometimes on debian, there is a 3rd one shortly
            after the 2nd. I can't remember exactly why this caused a
            problem, but I'm hoping the sleep will take care of it.
--S         sets FAI_ACTION=sysinfo, see myfai-chboot for more info.
+-d         Don't alter dhcp config. Only make sense for fai type, and on network
+           other than home or fsf.
 -k         Pass -k to myfai-chboot.
+-r         Don't redeploy fai config. For example, if there is a different host
+           that is mid-install.
+
+-S         sets FAI_ACTION=sysinfo, see myfai-chboot for more info.
 -w         Setup pxe, then wait like -a.
 -h|--help  Print help and exit
 
@@ -65,16 +67,22 @@ dhcp=true
 redep=true
 acks=2
 wait=false
+fsf=false
+
+case $HOSTNAME in
+  x3|kw) fsf=true ;;
+esac
+
 chboot_args=()
-temp=$(getopt -l help adrSkwh "$@") || usage 1
+temp=$(getopt -l help adkrSwh "$@") || usage 1
 eval set -- "$temp"
 while true; do
   case $1 in
     -a) wait=true; set=false; shift ;;
     -d) dhcp=false; shift ;;
+    -k) chboot_args+=(-k); shift ;;
     -r) redep=false; shift ;;
     -S) chboot_args+=(-S); shift ;;
-    -k) chboot_args+=(-k); shift ;;
     -w) wait=true; set=true; shift ;;
     -h|--help) usage ;;
     --) shift; break ;;
@@ -85,7 +93,7 @@ done
 read -r host type <<<"$@"
 
 case $# in
-  0);;
+  [01]);;
   2)
     case $type in
       arch|parabola) cmd=archlike ;;
@@ -98,7 +106,7 @@ case $# in
     esac
     ;;
   *)
-    echo "$0: error: expected 0 or 2 arguments"
+    echo "$0: error: expected 0-2 arguments"
     echo
     usage 1
     ;;
@@ -145,27 +153,52 @@ EOF
 }
 
 ack-wait() {
+  if $fsf; then
+    wait_cmd="ssh tarantula tail -n0 -f /var/log/syslog"
+  else
+    wait_cmd="ssh wrt logread -f"
+  fi
   wait_count=$1
   if [[ $host ]]; then
+    if $fsf; then
+      host_regex=" $(getent hosts kw | awk '{print $1}' | sed 's/\./\\./g')"
+      else
     host_regex=" $host"
+    fi
   fi
-  regex=".*DHCPACK.*$host_regex$"
+  regex=".*DHCPACK.*$host_regex\b"
   i=0
   while (( i != wait_count )) && read -r line; do
     if [[ $line =~ $regex ]]; then
       i=$((i+1))
       echo $line
     fi
-  done < <(ssh wrt logread -f)
+  done < <($wait_cmd ||:) # tail returns 2 it seems
   e sleep 20
 }
 
 set-pxe() {
   $dhcp || return 0
-  echo "$0: updating dnsmasq.conf:"
-  $cmd
-  ${cmd:-:}|ssh wrt "cedit pxe /etc/dnsmasq.conf || /etc/init.d/dnsmasq restart
+  if $fsf; then
+    if [[ ! $cmd ]]; then
+      echo "$0: removing pxe for $host on tarantula"
+      ssh tarantula bash -e <<EOF
+sed -ri 's/^( *host +$host *\{).*/\1/' /etc/dhcp3/dhcpd.conf
+/etc/init.d/dhcp3-server restart
+EOF
+    elif [[ $cmd == fai ]]; then
+      echo "$0: adding pxe for $host on tarantula"
+      ssh tarantula bash -e <<EOF
+sed -ri 's/^( *host +$host *\{).*/\1 next-server faiserver.office.fsf.org; filename "pxelinux.0";/' /etc/dhcp3/dhcpd.conf
+/etc/init.d/dhcp3-server restart
+EOF
+    fi
+  else
+    echo "$0: updating dnsmasq.conf:"
+    $cmd
+    ${cmd:-:}|ssh wrt "cedit pxe /etc/dnsmasq.conf || /etc/init.d/dnsmasq restart
 $([[ $type == arch || $type == parabola ]] && echo archlike-pxe-mount)"
+  fi
 }