various minor fixes and improvements
[automated-distro-installer] / pxe-server
index a59e71c5d48676fd61a6cfc78954f01c8de623fe..944620ecc6647a2b20295b3d28c6576c1deafc9a 100755 (executable)
@@ -21,14 +21,14 @@ x="$(readlink -f "$BASH_SOURCE")"; source "${x%/*}/bash-trace"
 
 
 usage() {
-    cat <<EOF
+  cat <<EOF
 Usage: ${0##*/} [OPTIONS] [HOST TYPE]
 Configure dnsmasq boot options and fai-chboot if appropriate.
 
 Without HOST TYPE, disable  server and fai server.
 
 HOST       A hostname known to the dhcp server, or default for all.
-TYPE       One of arch, plain, fai.
+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.
@@ -46,17 +46,17 @@ TYPE       One of arch, plain, fai.
 -h|--help  Print help and exit
 
 
-Note, when switching between plain and arch, you will need to
+Note, when switching between plain and arch or parabola, you will need to
 do something like:
 ssh wrt
 cd /mnt/usb
 rm tftpboot
-ln -s <arch/debian iso dir> tftpboot
+ln -s <arch/parabola/debian iso dir> tftpboot
 
 
 Note: Uses GNU getopt options parsing style
 EOF
-    exit $1
+  exit $1
 }
 
 ##### begin command line parsing ########
@@ -69,126 +69,138 @@ chboot_args=()
 temp=$(getopt -l help adrSkwh "$@") || usage 1
 eval set -- "$temp"
 while true; do
-    case $1 in
-        -a) wait=true; set=false; shift ;;
-        -d) dhcp=false; 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 ;;
-        *) echo "$0: Internal error!" ; exit 1 ;;
-    esac
+  case $1 in
+    -a) wait=true; set=false; shift ;;
+    -d) dhcp=false; 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 ;;
+    *) echo "$0: Internal error!" ; exit 1 ;;
+  esac
 done
 
 read -r host type <<<"$@"
 
 case $# in
-    0|2);;
-    *)
-        echo "$0: error: expected 0 or 2 arguments"
+  0);;
+  2)
+    case $type in
+      arch|parabola) cmd=archlike ;;
+      fai) cmd=fai ;;
+      *)
+        echo "$0: error expected type of arch|parabola|fai"
         echo
         usage 1
         ;;
+    esac
+    ;;
+  *)
+    echo "$0: error: expected 0 or 2 arguments"
+    echo
+    usage 1
+    ;;
 esac
 
+
 if $wait && ! $dhcp; then
-    echo "$0: error -w conflicts with -d, choose one or other"
-    exit 1
+  echo "$0: error -w conflicts with -d, choose one or other"
+  exit 1
 fi
 
 
 if [[ $host && $host != default ]]; then
-    host_tag="tag:$host,"
+  host_tag="tag:$host,"
 fi
 
 ##### end command line parsing ########
 
 e() {
-    echo "$@"
-    "$@"
+  echo "$@"
+  "$@"
 }
 
-arch() {
-    cat <<EOF
-dhcp-option-force=209,boot/syslinux/archiso.cfg
-dhcp-option-force=210,/arch/
-dhcp-boot=${host_tag}/arch/boot/syslinux/lpxelinux.0
+archlike() {
+  cat <<EOF
+dhcp-option-force=209,boot/syslinux/${type}iso.cfg
+dhcp-option-force=210,/${type}/
+dhcp-boot=${host_tag}/${type}/boot/syslinux/lpxelinux.0
 EOF
 }
 
 plain() {
-    # if arch was used before, this additionally needs
-    # the tftp link in /mnt/usb to be changed.
-    cat <<EOF
+  # if arch based was used before, this additionally needs
+  # the tftp link in /mnt/usb to be changed.
+  cat <<EOF
 dhcp-boot=${host_tag}pxelinux.0
 EOF
 }
 
 fai() {
-    cat <<EOF
+  cat <<EOF
 dhcp-boot=${host_tag}pxelinux.0,faiserver.b8.nz,faiserver.b8.nz
 EOF
 }
 
 ack-wait() {
-    wait_count=$1
-    if [[ $host ]]; then
-        host_regex=" $host"
+  wait_count=$1
+  if [[ $host ]]; then
+    host_regex=" $host"
+  fi
+  regex=".*DHCPACK.*$host_regex$"
+  i=0
+  while (( i != wait_count )) && read -r line; do
+    if [[ $line =~ $regex ]]; then
+      i=$((i+1))
+      echo $line
     fi
-    regex=".*DHCPACK.*$host_regex$"
-    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)
-    e sleep 20
+  done < <(ssh wrt logread -f)
+  e sleep 20
 }
 
 set-pxe() {
-    $dhcp || return 0
-    echo "$0: updating dnsmasq.conf:"
-    $type
-    ${type:-:}|ssh wrt "cedit pxe /etc/dnsmasq.conf || /etc/init.d/dnsmasq restart
-$([[ $type == arch ]] && echo arch-pxe-mount)"
+  $dhcp || return 0
+  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)"
 }
 
 
 if $set; then
-    set-pxe
-    if [[ $type == fai ]]; then
-        e myfai-chboot ${chboot_args[@]} $host
-        if $redep; then
-            e fai-redep
-        fi
-    else
-        # This will fail if faiserver is not setup, so ignore any
-        # failure and don't bother us about it.
-        myfai-chboot &>/dev/null ||:
+  set-pxe
+  if [[ $type == fai ]]; then
+    e myfai-chboot ${chboot_args[@]} $host
+    if $redep; then
+      e fai-redep
     fi
+  else
+    # This will fail if faiserver is not setup, so ignore any
+    # failure and don't bother us about it.
+    myfai-chboot &>/dev/null ||:
+  fi
 fi
 
 if $wait; then
-    # fai's debian jessie 8.5ish does 2 dhcp requests when booting,
-    # roughly 4 seconds apart. Earlier
-    # versions did just 1. Now testing on a vm, it does 1.
-    # bleh.
-    echo "waiting for $acks dhcp acks then disabling pxe"
-    ack-wait $acks
-    type=
-    set-pxe
-
-    # previously tried waiting for one more ack then disabling faiserver,
-    # since it can contain sensitive info, so turn it off when not in use,
-    # but disabling that for now as it's inconvenient to clean this
-    # up and run it in the background etc.
-
-    # if [[ $type == fai ]]; then
-    #     echo "waiting for 1 dhcp ack then disabling fai server"
-    #     ack-wait 1
-    #     faiserver-disable
-    # fi
+  # fai's debian jessie 8.5ish does 2 dhcp requests when booting,
+  # roughly 4 seconds apart. Earlier
+  # versions did just 1. Now testing on a vm, it does 1.
+  # bleh.
+  echo "waiting for $acks dhcp acks then disabling pxe"
+  ack-wait $acks
+  type=
+  set-pxe
+
+  # previously tried waiting for one more ack then disabling faiserver,
+  # since it can contain sensitive info, so turn it off when not in use,
+  # but disabling that for now as it's inconvenient to clean this
+  # up and run it in the background etc.
+
+  # if [[ $type == fai ]]; then
+  #     echo "waiting for 1 dhcp ack then disabling fai server"
+  #     ack-wait 1
+  #     faiserver-disable
+  # fi
 fi