minor files
[automated-distro-installer] / faiserver-setup
index f60ec4791a5c58d0fda16878136cfc8db7e8ac1b..cf0da93e24d49b00eadba6e267ee7b1cce4c6d18 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/bash
 #!/bin/bash
-# Copyright (C) 2016 Ian Kelling
+# Copyright (C) 2018 Ian Kelling
 
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
 
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-set -eE -o pipefail
-trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
+x="$(readlink -f "$BASH_SOURCE")"; source "${x%/*}/bash-trace"
 
 
-[[ $EUID == 0 ]] || exec sudo "${BASH_SOURCE}" "$@"
+[[ $EUID == 0 ]] || exec sudo -i "${BASH_SOURCE}" "$@"
 
 usage() {
 
 usage() {
-    cat <<EOF
+  cat <<EOF
 usage: ${0##*/} [-h|--help]
 install fai-server on the current machine
 
 usage: ${0##*/} [-h|--help]
 install fai-server on the current machine
 
@@ -31,41 +30,41 @@ that using a hostname does not work.
 Separate from running this, faiserver needs to be setup in dns
 to point to whatever host this is run on.
 
 Separate from running this, faiserver needs to be setup in dns
 to point to whatever host this is run on.
 
-For running on arm, it expects Ian's fai-basefiles repository at
-/a/bin/fai-basefiles
+It expects $BASEFILE_DIR/STRETCH64.tar.gz to exist, and it
+must have been generated around the same time as the nfsroot,
+at least so it has the same kernel version.
 
 EOF
 
 EOF
-    exit $1
+  exit $1
 }
 case $1 in
 }
 case $1 in
-    -h|--help) usage ;;
+  -h|--help) usage ;;
 esac
 
 
 e() { echo "$@"; "$@"; }
 
 esac
 
 
 e() { echo "$@"; "$@"; }
 
-# When stretch becomes stable, change this to stretch.
-# I\'ve tested this with stretch, it works, but notably,
 # the automatic basefile getting will be for stretch
 # instead of jessie, so if you install jessie, you need
 # to setup the basefile and it\'s corresponding class.
 # the automatic basefile getting will be for stretch
 # instead of jessie, so if you install jessie, you need
 # to setup the basefile and it\'s corresponding class.
-base=jessie
+base=stretch
 sed="sed -ri --follow-symlinks"
 
 sed="sed -ri --follow-symlinks"
 
+if [[ ! -e $BASEFILE_DIR/STRETCH64.tar.gz ]]; then
+  printf "%s\n" "$0: error BASEFILE_DIR=$BASEFILE_DIR \$BASEFILE_DIR/STRETCH64.tar.gz does not exist"
+  exit 1
+fi
+
+
 if ! type -p wget &>/dev/null; then
   apt-get install -y wget
 fi
 
 armhf() {
 if ! type -p wget &>/dev/null; then
   apt-get install -y wget
 fi
 
 armhf() {
-    [[ $(dpkg --print-architecture) == armhf ]]
+  [[ $(dpkg --print-architecture) == armhf ]]
 }
 
 }
 
-if grep -xFq 'VERSION="9 (stretch)"' /etc/os-release; then
-  # if we use stretch, no need for fai-project repo.
-  # this will need to be updated when there is a codename
-  # for stretch+1
-  rm -f /etc/apt/sources.list.d/fai.list
-elif armhf; then
+if armhf; then
   if apt-cache policy | grep o=Debian,a=testing,n=stretch &>/dev/null; then
     cat >/etc/apt/sources.list.d/testing.list <<'EOF'
 deb http://http.us.debian.org/debian testing main contrib non-free
   if apt-cache policy | grep o=Debian,a=testing,n=stretch &>/dev/null; then
     cat >/etc/apt/sources.list.d/testing.list <<'EOF'
 deb http://http.us.debian.org/debian testing main contrib non-free
@@ -88,18 +87,22 @@ Pin: release a=testing
 Pin-Priority: -10
 EOF
   fi
 Pin-Priority: -10
 EOF
   fi
-else
-    wget -O - http://fai-project.org/download/074BCDE4.asc | apt-key add -
-    cat >/etc/apt/sources.list.d/fai.list <<'EOF'
-deb http://fai-project.org/download jessie koeln
+elif grep -xFq 'VERSION="8 (jessie)"' /etc/os-release; then
+  gpg -a --recv-keys 2BF8D9FE074BCDE4; gpg -a --export 2BF8D9FE074BCDE4 | apt-key add -
+  cat >/etc/apt/sources.list.d/fai.list <<'EOF'
+deb https://fai-project.org/download jessie koeln
 EOF
 EOF
-fi
-
-# for ubuntu:
-#add-apt-repository -y ppa:fai/ppa
-
-# for debian:
+elif grep -xFq 'VERSION="9 (stretch)"' /etc/os-release || grep -iE 'flidas|xenail' /etc/os-release ; then
+  # fai on ubuntu only has official support using the universe repo, but newer
+  # tends to have less bugs.
+  gpg --keyserver hkp://pool.sks-keyservers.net -a --recv-keys 2BF8D9FE074BCDE4; gpg -a --export 2BF8D9FE074BCDE4 | apt-key add -
 
 
+  cat >/etc/apt/sources.list.d/fai.list <<'EOF'
+deb https://fai-project.org/download stretch koeln
+EOF
+else
+  rm -f /etc/apt/sources.list.d/fai.list
+fi
 
 apt-get update
 
 
 apt-get update
 
@@ -107,16 +110,20 @@ apt-get update
 # I especially do not wait isc-dhcp-server or an inetd. Also excludes
 # nfs-kernel-server. On an android chroot, we don\'t have nfs in the
 # kernel, or the ability to install it.
 # I especially do not wait isc-dhcp-server or an inetd. Also excludes
 # nfs-kernel-server. On an android chroot, we don\'t have nfs in the
 # kernel, or the ability to install it.
-pkgs=(fai-doc tftpd-hpa tar reprepro squashfs-tools binutils)
+# xorriso is for running fai-cd -a, not strictly need for fai-server
+# perl-tk is for fai-monitor-gui
+pkgs=(fai-doc tftpd-hpa tar reprepro squashfs-tools binutils xorriso)
 if modprobe nfsd &>/dev/null; then
   pkgs+=(nfs-kernel-server)
 else
 if modprobe nfsd &>/dev/null; then
   pkgs+=(nfs-kernel-server)
 else
-    pkgs+=(apache2)
+  pkgs+=(apache2)
 fi
 
 
 apt-get install -y ${pkgs[@]}
 fi
 
 
 apt-get install -y ${pkgs[@]}
-apt-get install --no-install-recommends -y fai-server
+# confnew since we edit /etc/fai/NFSROOT in an automated way
+# fai-client is already a fai-server dependency, but make sure it gets upgraded
+apt-get install --no-install-recommends -y -o Dpkg::Options::="--force-confnew" fai-server fai-client
 
 r=http://http.us.debian.org/debian
 # like default, but scrap httpredir, and nonfree.
 
 r=http://http.us.debian.org/debian
 # like default, but scrap httpredir, and nonfree.
@@ -127,15 +134,22 @@ deb $r $base main contrib
 deb http://security.debian.org/debian-security $base/updates main contrib
 EOF
 
 deb http://security.debian.org/debian-security $base/updates main contrib
 EOF
 
+
+case $base in
+  jessie|stretch)
+    cat >>/etc/fai/apt/sources.list <<EOF
+# use fai repo. it's commented in the defaults. it's got bug fixes.
+# and may contain newer packages.
+deb http://fai-project.org/download $base koeln
+EOF
+    ;;
+esac
+
 if [[ $base == jessie ]]; then
   cat >>/etc/fai/apt/sources.list <<'EOF'
 if [[ $base == jessie ]]; then
   cat >>/etc/fai/apt/sources.list <<'EOF'
-# uncommenting this from the defaults. it's got bug fixes.
-# repository that may contain newer fai packages for jessie
-deb http://fai-project.org/download jessie koeln
 # fix tar https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=819978
 deb http://ftp.debian.org/debian jessie-backports main
 EOF
 # fix tar https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=819978
 deb http://ftp.debian.org/debian jessie-backports main
 EOF
-
   # note, fai doesn\'t look at /etc/fai/apt/preferences.d
   cat >/etc/fai/apt/preferences <<'EOF'
 Package: tar
   # note, fai doesn\'t look at /etc/fai/apt/preferences.d
   cat >/etc/fai/apt/preferences <<'EOF'
 Package: tar
@@ -148,29 +162,38 @@ fi
 # tried out a stretch base, doesn't work yet.
 #
 $sed -f - /etc/fai/nfsroot.conf <<EOF
 # tried out a stretch base, doesn't work yet.
 #
 $sed -f - /etc/fai/nfsroot.conf <<EOF
+$ a FAI_ROOTPW='$(</q/root/shadow/standard)'
+/^\s*FAI_ROOTPW/d
+$ a SSH_IDENTITY=/root/.ssh/home.pub
+/^\s*SSH_IDENTITY/d
 s,^( *FAI_DEBOOTSTRAP=).*,\1"$base $r",
 # add --arch amd64. this is needed on arm system which is
 # used to install amd64 clients. On amd64 servers, it's redundant.
 # disabled for now, since creating fai nfsroot on my arm machine
 # is not working
 #/--arch amd64/!s/^(\s*FAI_DEBOOTSTRAP_OPTS=")/\1--arch amd64 /
 s,^( *FAI_DEBOOTSTRAP=).*,\1"$base $r",
 # add --arch amd64. this is needed on arm system which is
 # used to install amd64 clients. On amd64 servers, it's redundant.
 # disabled for now, since creating fai nfsroot on my arm machine
 # is not working
 #/--arch amd64/!s/^(\s*FAI_DEBOOTSTRAP_OPTS=")/\1--arch amd64 /
-/^\s*FAI_ROOTPW/d
-$ a FAI_ROOTPW="$(</q/root/shadow/standard)"
 EOF
 
 $sed 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf
 EOF
 
 $sed 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf
+$sed -i '/^FAI_FLAGS=/d' /etc/fai/fai.conf
+echo "FAI_FLAGS=verbose" >>/etc/fai/fai.conf
+
 # from man fai-make-nfsroot,
 # figured out after partitioning ignored my crypt partition
 
 
 if ! grep cryptsetup /etc/fai/NFSROOT &>/dev/null; then
 # from man fai-make-nfsroot,
 # figured out after partitioning ignored my crypt partition
 
 
 if ! grep cryptsetup /etc/fai/NFSROOT &>/dev/null; then
-  $sed '/^PACKAGES install$/a cryptsetup' /etc/fai/NFSROOT
+  cat >>/etc/fai/NFSROOT <<'EOF'
+# inserted by faserver-setup
+PACKAGES install
+cryptsetup
+EOF
 fi
 
 if armhf; then
   cd /srv/fai
   rm -rf nfsroot
 fi
 
 if armhf; then
   cd /srv/fai
   rm -rf nfsroot
-  tar Jxf /a/bin/fai-basefiles/base.tar.xz
+  tar Jxf $BASEFILE_DIR/STRETCH64.tar.xz
   # background: Can't build the nfsroot on my arm system now.  First,
   # fai-make-nfsroot won't work out of the box. One idea to make it work
   # is by installing qemu-user-static, then copying qemu-x86_64-static
   # background: Can't build the nfsroot on my arm system now.  First,
   # fai-make-nfsroot won't work out of the box. One idea to make it work
   # is by installing qemu-user-static, then copying qemu-x86_64-static
@@ -186,33 +209,36 @@ if armhf; then
   # and if not, run it.
   setup_tftp(){
 
   # and if not, run it.
   setup_tftp(){
 
-      # tftp environment
-      local pxebin
-
-      # wheezy path
-      if [ -f $NFSROOT/usr/lib/PXELINUX/pxelinux.0 ]; then
-        pxebin=$NFSROOT/usr/lib/PXELINUX/pxelinux.0
-      else
-         # jessie/stretch path
-          pxebin=$NFSROOT/usr/lib/syslinux/pxelinux.0
-      fi
-
-      rm -f $NFSROOT/boot/*.bak
-      mkdir -p $TFTPROOT/pxelinux.cfg
-      chmod a+r $NFSROOT/boot/initrd.img-* || die 9 "No initrd was created. Check the package name of the linux-image package in /etc/fai/NFSROOT."
-      cp -p $v $NFSROOT/boot/vmlinu?-* $NFSROOT/boot/initrd.img-* $TFTPROOT
-      cp -u $pxebin $TFTPROOT
-      if [ -f $NFSROOT/usr/lib/syslinux/modules/bios/ldlinux.c32 ]; then
-       cp -u $NFSROOT/usr/lib/syslinux/modules/bios/ldlinux.c32 $TFTPROOT
-      fi
-      if [ X$verbose = X1 ]; then
-       echo "TFTP environment prepared. Enable DHCP and start the TFTP daemon on root $TFTPROOT."
-      fi
+    # tftp environment
+    local pxebin
+
+    # wheezy path
+    if [ -f $NFSROOT/usr/lib/PXELINUX/pxelinux.0 ]; then
+      pxebin=$NFSROOT/usr/lib/PXELINUX/pxelinux.0
+    else
+      # jessie/stretch path
+      pxebin=$NFSROOT/usr/lib/syslinux/pxelinux.0
+    fi
+
+    rm -f $NFSROOT/boot/*.bak
+    mkdir -p $TFTPROOT/pxelinux.cfg
+    if ! chmod a+r $NFSROOT/boot/initrd.img-*; then
+      echo "$0: error: No initrd was created. Check the package name of the linux-image package in /etc/fai/NFSROOT."
+      exit 1
+    fi
+    cp -p $v $NFSROOT/boot/vmlinu?-* $NFSROOT/boot/initrd.img-* $TFTPROOT
+    cp -u $pxebin $TFTPROOT
+    if [ -f $NFSROOT/usr/lib/syslinux/modules/bios/ldlinux.c32 ]; then
+      cp -u $NFSROOT/usr/lib/syslinux/modules/bios/ldlinux.c32 $TFTPROOT
+    fi
+    if [ X$verbose = X1 ]; then
+      echo "TFTP environment prepared. Enable DHCP and start the TFTP daemon on root $TFTPROOT."
+    fi
   }
   diff -u <(type setup_tftp) <(cat <(sed -n '/^setup_tftp(){/,/^}/p' $(which fai-make-nfsroot) ) - <<'EOF' |bash
 type setup_tftp
 EOF
   }
   diff -u <(type setup_tftp) <(cat <(sed -n '/^setup_tftp(){/,/^}/p' $(which fai-make-nfsroot) ) - <<'EOF' |bash
 type setup_tftp
 EOF
-)
+                              )
   setup_tftp
 
   # -g causes skipping set_root_pw() in fai-make-nfsroot, -ag
   setup_tftp
 
   # -g causes skipping set_root_pw() in fai-make-nfsroot, -ag
@@ -220,15 +246,40 @@ EOF
   # seem contradictory, but it works.
   fai-setup -evag
 
   # seem contradictory, but it works.
   fai-setup -evag
 
-else
-    e fai-setup -e -vf
-    # make the faiserver also the apt proxy server
-    apt-get -y install apt-cacher-ng
+else # not armhf
+  # note, this copies the -B arg to
+  # /srv/fai/nfsroot/var/tmp/base.tar.xz
+  e fai-setup -evf -B $BASEFILE_DIR/STRETCH64.tar.gz
+  # fai-setup expert mode avoids writing to /var/log/fai/variables
+  # at least config_src is needed for autodiscover
+  $sed '/^FAI_CONFIGDIR|^FAI_CONFIG_SRC|^LOGUSER/d' /var/log/fai/variables
+  tee -a /var/log/fai/variables <<'EOF'
+LOGUSER=fai
+FAI_CONFIGDIR=/srv/fai/config
+FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
+EOF
+  # make the faiserver also the apt proxy server
+  apt-get -y install apt-cacher-ng
 fi
 
 fi
 
-{ head -n 1 /srv/fai/nfsroot/root/.ssh/known_hosts | awk '{print $1}' \
-    | tr '\n' ' '; ssh-keyscan localhost |& grep -o "ecdsa-sha2-nistp256.*"; \
-  } >>/srv/fai/nfsroot/root/.ssh/known_hosts
+rm -f /srv/fai/nfsroot/root/.ssh/known_hosts
+key=$(ssh-keyscan localhost |& grep -o "ecdsa-sha2-nistp256.*")
+for ip in faiserver $(ip addr show up| grep -w '^ *inet' | awk '{print $2}'| cut -d / -f 1 | grep -vF 127.0.0.1); do
+  echo "$ip $key" >>/srv/fai/nfsroot/root/.ssh/known_hosts
+done
+
+
+# serial console
+# mainly from
+# https://wiki.archlinux.org/index.php/working_with_the_serial_console
+# at runtime, running this from ssh worked:
+# https://unix.stackexchange.com/questions/242778/what-is-the-easiest-way-to-configure-serial-port-on-linux
+# stty -F /dev/ttyS0 115200 cs8 -cstopb -parenb
+# /sbin/agetty 115200 ttyS0 linux
+# dated info, but validation that this might work on debian:
+# https://help.ubuntu.com/community/SerialConsoleHowto
+# note in the nfsroot, systemd is not running.
+echo "c0:2345:respawn:/sbin/agetty 115200 ttyS0 linux" >>/srv/fai/nfsroot/etc/inittab
 
 # initially did the basic fai-chboot -Iv $std_arg default
 # but found in console that it wanted to mount nfsroot
 
 # initially did the basic fai-chboot -Iv $std_arg default
 # but found in console that it wanted to mount nfsroot