t11 and new partitioner fixes
[automated-distro-installer] / fai-revm
index 4b3d0d01501f3741c0e17e96cdf84b30e5a6792d..a016a762c30cbb70b4bc6f4d43152a197cf6ec3d 100755 (executable)
--- a/fai-revm
+++ b/fai-revm
@@ -1,4 +1,4 @@
-#!/bin/bash -l
+#!/bin/bash
 # Copyright (C) 2016 Ian Kelling
 
 # This program is free software; you can redistribute it and/or
 # Copyright (C) 2016 Ian Kelling
 
 # This program is free software; you can redistribute it and/or
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 
+[[ $EUID == 0 ]] || exec sudo -E "${BASH_SOURCE[0]}" "$@"
 
 
-x="$(readlink -f "$BASH_SOURCE")"
-script_dir="${x%/*}"
+
+readonly this_file="$(readlink -f -- "${BASH_SOURCE[0]}")"
+script_dir="${this_file%/*}"
+# shellcheck source=./bash-trace
 source "${script_dir}/bash-trace"
 source "${script_dir}/bash-trace"
+cd $script_dir
+PATH="$PATH:$PWD"
 
 e() { echo "$*"; "$@"; }
 
 
 usage() {
 
 e() { echo "$*"; "$@"; }
 
 
 usage() {
-    cat <<EOF
+  cat <<EOF
 # Usage: ${0##*/} [OPTIONS]
 Setup fai or arch pxe (depending on $0 name)
 then start a virtual machine to test the config
 # Usage: ${0##*/} [OPTIONS]
 Setup fai or arch pxe (depending on $0 name)
 then start a virtual machine to test the config
@@ -33,131 +38,182 @@ then start a virtual machine to test the config
 Note, sometimes shutting down the existing demohost vm
 fails. Just run again if that happens.
 
 Note, sometimes shutting down the existing demohost vm
 fails. Just run again if that happens.
 
--d         Don't do dhcp setup for when we aren't on Ian's home network.
+-d         When doing pxe, don't do dhcp setup. Good for when we
+           aren't on Ian's home network.
 -n         Create new qcow2(s) for vm. Good for testing partitioning
            script, to ensure a blank disk.
 -p         Use pxe instead of autodiscover iso with fai.
 -n         Create new qcow2(s) for vm. Good for testing partitioning
            script, to ensure a blank disk.
 -p         Use pxe instead of autodiscover iso with fai.
+-c         Use normal fai-cd iso is instead of autodiscover iso.
 -r         Do not boot after install is complete
 -h|--help  Print help and exit.
 
 Note: Uses GNU getopt options parsing style
 EOF
 -r         Do not boot after install is complete
 -h|--help  Print help and exit.
 
 Note: Uses GNU getopt options parsing style
 EOF
-    exit $1
+  exit $1
 }
 
 orig_args=("$@")
 new_disk=false
 pxe=false
 }
 
 orig_args=("$@")
 new_disk=false
 pxe=false
-temp=$(getopt -l help dnprh "$@") || usage 1
+iso=autodiscover.iso
+temp=$(getopt -l help dnpcrh "$@") || usage 1
 eval set -- "$temp"
 while true; do
 eval set -- "$temp"
 while true; do
-    case $1 in
-        -d) dhcp_arg=-d; shift ;;
-        -n) new_disk=true; shift ;;
-        -p) pxe=true; shift ;;
-        -r) reboot_arg=--noreboot; shift ;;
-        -h|--help) usage ;;
-        --) shift; break ;;
-        *) echo "$0: Internal error!" ; exit 1 ;;
-    esac
+  case $1 in
+    -d) dhcp_arg=-d; shift ;;
+    -n) new_disk=true; shift ;;
+    -p) pxe=true; shift ;;
+    -c) iso=netinst.iso; shift ;;
+    -r) reboot_arg=--noreboot; shift ;;
+    -h|--help) usage ;;
+    --) shift; break ;;
+    *) echo "$0: Internal error!" ; exit 1 ;;
+  esac
 done
 
 
 done
 
 
-# change this to test different disk counts. 1 and > 1 should be the only
-# important things to test.
+# change this to test different disk counts.
+disk_count=3
 disk_count=1
 
 
 disk_count=1
 
 
+rm -f /tmp/fai-revm-did-pxe
+
+if ! ip l show br0 &>/dev/null; then
+  cat <<'EOF'
+fai-rvm error: no bridge detected. add one to interfaces like this:
+iface eth0 inet manual
+iface br0 inet dhcp
+  bridge_ports eth0
+  bridge_stp off
+  bridge_maxwait 0
+EOF
+  exit 1
+fi
+
 if [[ $script_dir == /a/bin/* ]]; then
 if [[ $script_dir == /a/bin/* ]]; then
-    # Copy our script elsewhere so we can develop it
-    # and save it at the same time it's running
-    rm -rf /tmp/faifreeze
-    cp -ar /a/bin/fai /tmp/faifreeze
-    exec /tmp/faifreeze/${BASH_SOURCE##*/} "${orig_args[@]}"
+  # Copy our script elsewhere so we can develop it
+  # and save it at the same time it's running
+  rm -rf /tmp/faifreeze
+  cp -ar /a/bin/fai /tmp/faifreeze
+  exec /tmp/faifreeze/${BASH_SOURCE##*/} "${orig_args[@]}"
 fi
 
 fi
 
-cd $script_dir
 
 is_arch_revm() {
 
 is_arch_revm() {
-    [[ ${0##*/} == arch-revm ]]
+  [[ ${0##*/} == arch-revm ]]
 }
 
 }
 
-cleanup() {
-    echo "doing cleanup"
+err-cleanup() {
+  echo "doing cleanup"
+  if [[ -e /tmp/fai-revm-did-pxe ]]; then
     e ./pxe-server $dhcp_arg
     e ./pxe-server $dhcp_arg
-    ./faiserver-disable
+  fi
+  ./faiserver-disable
 }
 }
-_errcatch_cleanup=cleanup
 
 boot_arg=--pxe
 if is_arch_revm; then
 
 boot_arg=--pxe
 if is_arch_revm; then
-    e ./pxe-server $dhcp_arg demohost arch
-    sleep 2
-    # via osinfo-query os. guessing arch is closest to latest fedora.
-    variant=fedora22
+  e ./pxe-server $dhcp_arg demohost arch
+  touch /tmp/fai-revm-did-pxe
+  sleep 2
+  # via osinfo-query os. guessing arch is closest to latest fedora.
+  variant=fedora22
 else
   if $pxe; then
     e ./pxe-server $dhcp_arg demohost fai
 else
   if $pxe; then
     e ./pxe-server $dhcp_arg demohost fai
+    touch /tmp/fai-revm-did-pxe
     sleep 2
     sleep 2
-    else
-      boot_arg="--cdrom /a/bin/fai-basefiles/autodiscover.iso"
-     e fai-redep
-     e myfai-chboot default
-fi
-    # I don't think these variants actually make a diff for us, but I
-    # use the appropriate one when trying a new distro just in case.
-    variant=ubuntu14.04
-    #variant=ubuntu16.04
-    #variant=debian8
+  else
+    killall fai-monitor &>/dev/null ||:
+    fai-monitor &
+    if [[ ! $BASEFILE_DIR ]]; then
+      BASEFILE_DIR=/tmp
+    fi
+    isopath=$BASEFILE_DIR/$iso
+    isosrc=$BASEFILE_DIR/BULLSEYE64.tar.gz
+    if [[ ! -e $isopath || $(stat -c %Y $isopath) -lt $(stat -c %Y $isosrc) ]]; then
+      e fai-cd -g $(readlink -f grub.cfg.${iso%%.*}) -f -A $isopath
+    fi
+    boot_arg="--cdrom $isopath"
+    e fai-redep
+    cat ~/.ssh/demo.pub | /a/exe/cedit -s /srv/fai/nfsroot/root/.ssh/authorized_keys
+    e myfai-chboot default
+  fi
+  # I don't think these variants actually make a diff for us, but I
+  # use the appropriate one when trying a new distro just in case.
+  #variant=ubuntu14.04
+  #variant=ubuntu16.04
+  #variant=debian8
+  variant=ubuntu20.04
 fi
 
 name=demohost
 
 fi
 
 name=demohost
 
-e s virshrm $name ||:
+e virsh destroy $name ||:
+sleep 1
+e virsh destroy $name ||:
+e virsh undefine $name ||:
+sleep 1
 
 
 disk_arg=()
 for ((i=1; i <= disk_count; i++)); do
 
 
 disk_arg=()
 for ((i=1; i <= disk_count; i++)); do
-    f=/var/lib/libvirt/images/${name}$i
-    disk_arg+=("--disk path=$f")
-    if $new_disk || [[ ! -e $f ]]; then
-        s rm -f $f
-        e s qemu-img create -o preallocation=metadata -f qcow2 $f 50G
-    fi
+  f=/var/lib/libvirt/images/${name}$i
+  disk_arg+=("--disk path=$f")
+  if $new_disk || [[ ! -e $f ]]; then
+    rm -f $f
+    # https://btrfs.wiki.kernel.org/index.php/FAQ
+    touch $f
+    chattr +C $f
+    e qemu-img create -o preallocation=metadata -f qcow2 $f 50G
+  fi
 done
 
 if [[ $SSH_CLIENT ]]; then
 done
 
 if [[ $SSH_CLIENT ]]; then
-    console_arg=--noautoconsole
+  console_arg=--noautoconsole
 fi
 
 # docker makes forward default to drop, which blocks the vm pxe on flidas. easiest solution:
 fi
 
 # docker makes forward default to drop, which blocks the vm pxe on flidas. easiest solution:
-s iptables -P FORWARD ACCEPT
+e iptables -P FORWARD ACCEPT
 
 # --cpu host: this causes mkfs.btrfs to fail with a stack trace which began
 # something like:
 # init_module+0x108/0x1000 [raid6_pq]
 #
 # uniq is to stop gtk-warning spam
 
 # --cpu host: this causes mkfs.btrfs to fail with a stack trace which began
 # something like:
 # init_module+0x108/0x1000 [raid6_pq]
 #
 # uniq is to stop gtk-warning spam
-# e virt-install --os-variant $variant  -n $name --pxe -r 2048 --vcpus 1 \
-#   ${disk_arg[*]} -w bridge=br0,mac=52:54:00:9c:ef:ad $reboot_arg \
-#   --graphics spice,listen=0.0.0.0 $console_arg |& grep -v '^ *$' | uniq &
+# e virt-install --os-variant $variant  -n $name --pxe -r 2048 --vcpus 1 \
+  #   ${disk_arg[*]} -w bridge=br0,mac=52:54:00:9c:ef:ad $reboot_arg \
+  #   --graphics spice,listen=0.0.0.0 $console_arg |& grep -v '^ *$' | uniq &
 
 
+cpus=1
+if (( $(nproc) > 2 )); then
+  cpus=2
+fi
 
 
-e s virt-install --os-variant $variant  -n $name $boot_arg -r 2048 --vcpus 1 \
+e systemctl start libvirtd
+e virt-install --rng /dev/urandom --os-variant $variant  -n $name $boot_arg -r 2048 --vcpus $cpus \
   ${disk_arg[*]} -w bridge=br0,mac=52:54:00:9c:ef:ad $reboot_arg \
   --graphics spice,listen=0.0.0.0 $console_arg |& grep -v '^ *$' | uniq &
 
 
 if [[ $SSH_CLIENT ]]; then
   ${disk_arg[*]} -w bridge=br0,mac=52:54:00:9c:ef:ad $reboot_arg \
   --graphics spice,listen=0.0.0.0 $console_arg |& grep -v '^ *$' | uniq &
 
 
 if [[ $SSH_CLIENT ]]; then
-    fg
+  fg
 fi
 
 fi
 
-sleep 30
-while ! timeout -s 9 10 ssh -oBatchMode=yes root@$name /bin/true; do
-    e sleep 5
+sleep 90
+while ! timeout -s 9 10 ssh -oBatchMode=yes root@$name true; do
+  e sleep 5
 done
 done
-unset _errcatch_cleanup
-e pxe-server
+unset -f err-cleanup
+if $pxe; then
+  rm -f /tmp/fai-revm-did-pxe
+  e ./pxe-server $dhcp_arg
+fi
+
+# this tends to remove it too soon
+#echo | /a/exe/cedit -s /srv/fai/nfsroot/root/.ssh/authorized_keys
+
 if is_arch_revm; then
 if is_arch_revm; then
-    ./arch-init-remote $name
+  ./arch-init-remote $name
 fi
 fi