static usb ethnet addresses
[automated-distro-installer] / faiserver-setup
index 17dfba3db75bfe8d3799620a3ebf23a4703733ff..168dcda6d0518e09652ebfbb0c59fbbfcc4bd56d 100755 (executable)
 
 x="$(readlink -f "$BASH_SOURCE")"; source "${x%/*}/bash-trace"
 
 
 x="$(readlink -f "$BASH_SOURCE")"; source "${x%/*}/bash-trace"
 
-[[ $EUID == 0 ]] || exec sudo -i "${BASH_SOURCE}" "$@"
+[[ $EUID == 0 ]] || exec sudo -E "${BASH_SOURCE[0]}" "$@"
+
 
 usage() {
 
 usage() {
-  cat <<EOF
-usage: ${0##*/} [-h|--help] [BASE_CODENAME]
+  cat <<'EOF'
+usage: ${0##*/} [-h|--help] [BASE_CODENAME] [ARCH]
 install fai-server on the current machine
 
 Initial setup of a fai server. works on localhost.  Set's the current ip
 install fai-server on the current machine
 
 Initial setup of a fai server. works on localhost.  Set's the current ip
@@ -29,11 +30,30 @@ as the tftp server. I vaguely remember 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.
 
 work.  Separate from running this, faiserver needs to be setup in dns to
 point to whatever host this is run on.
 
-Default BASE_CODENAME is stretch, and it expects corresponding
-$BASEFILE_DIR/${UPCASED_BASE_CODENAME}64.tar.gz to exist, and it must have been
+Default BASE_CODENAME is bookworm. Default ARCH is 64. The script expects corresponding
+$BASEFILE_DIR/${UPCASED_BASE_CODENAME}${ARCH}.tar.(zst|xz) to exist, and it must have been
 generated around the same time as the nfsroot, at least so it has the
 same kernel version.
 
 generated around the same time as the nfsroot, at least so it has the
 same kernel version.
 
+for copying and running this on a remote server,
+scp -tPrl fai SERVER:
+scp $(readlink -f ~/.ssh/home.pub) SERVER:.ssh
+scp /a/bin/cedit/cedit SERVER:/usr/local/bin
+# todo: make the above key be an option
+
+
+Note: there is a bug in 5.9.4, fixed by adding
+    sleep 2
+
+Note: in t9, there is a bug in recent fai packages (eg 2021+), where
+  unshare uses a too new argument. I was able to fix it by
+  just going to the site of the error and changing unshare to
+  chroot like it used to be, but I'm not bothering to make
+  any persistent fix, since I'm now on t10. If it ever came
+  up again, using an old fai package would also work.
+  /usr/sbin/fai-make-nfsroot:503, before apt-get update
+
+
 EOF
   exit $1
 }
 EOF
   exit $1
 }
@@ -42,15 +62,27 @@ case $1 in
 esac
 
 
 esac
 
 
-e() { echo "$@"; "$@"; }
+e() { echo "+ $@"; "$@"; }
+
 
 
+base=${1:-bookworm}
+arch=${2:-64}
 
 
-base=${1:-stretch}
-basefile=$BASEFILE_DIR/${base^^}64.tar.gz
+if [[ $base == [[:upper:]] ]]; then
+  echo $0: error: use lowercase base
+  exit 1
+fi
+
+basefile=($BASEFILE_DIR/${base^^}${arch^^}.tar.zst)
 sed="sed -ri --follow-symlinks"
 
 if [[ ! -e $basefile ]]; then
 sed="sed -ri --follow-symlinks"
 
 if [[ ! -e $basefile ]]; then
-  printf "%s\n" "$0: error BASEFILE_DIR=$BASEFILE_DIR  does not exist"
+  printf "%s\n" "$0: error basefile=$basefile  does not exist" >&2
+  exit 1
+fi
+
+if [[ ! -d $BASEFILE_DIR ]]; then
+  printf "%s\n" "$0: error BASEFILE_DIR=$BASEFILE_DIR  does not exist" >&2
   exit 1
 fi
 
   exit 1
 fi
 
@@ -63,56 +95,39 @@ armhf() {
   [[ $(dpkg --print-architecture) == armhf ]]
 }
 
   [[ $(dpkg --print-architecture) == armhf ]]
 }
 
-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
-deb-src http://http.us.debian.org/debian testing main contrib non-free
-
-deb http://security.debian.org/ testing/updates main contrib non-free
-deb-src http://security.debian.org/ testing/updates main contrib non-free
+# fai on ubuntu only has official support using the universe repo, but newer
+# tends to have less bugs.
+wget -O - https://fai-project.org/download/fai-project.gpg | sudo dd of=/etc/apt/trusted.gpg.d/fai-project.gpg
 
 
-deb http://http.us.debian.org/debian testing-updates main contrib non-free
-deb-src http://http.us.debian.org/debian testing-updates main contrib non-free
+update=false
+case $base in
+  stretch|buster|bullseye|bookworm)
+    if ! grep -qFx "deb https://fai-project.org/download $base koeln" /etc/apt/sources.list.d/fai.list; then
+      update=true
+    fi
+    cat >/etc/apt/sources.list.d/fai.list <<EOF
+deb https://fai-project.org/download $base koeln
 EOF
 EOF
+    ;;
+  *)
+    echo "$0: error: script needs updating for new base" >&2
+    exit 1
+    ;;
+esac
 
 
-    cat >/etc/apt/preferences.d/fai <<'EOF'
-Package: fai-server fai-client fai-doc
-Pin: release a=testing
-Pin-Priority: 500
-
-Package: *
-Pin: release a=testing
-Pin-Priority: -10
-EOF
+f=/var/cache/apt/pkgcache.bin;
+if [[ -r $f ]]; then
+  cachetime=$(stat -c %Y $f );
+  now=$(date +%s)
+  limittime=$(( now - 60*60*2 ))
+  if (( cachetime > limittime )); then
+    update=true
   fi
   fi
-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
-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 -
-
-  case $base in
-    stretch)
-      cat >/etc/apt/sources.list.d/fai.list <<'EOF'
-deb https://fai-project.org/download stretch koeln
-EOF
-      ;;
-    buster)
-      cat >/etc/apt/sources.list.d/fai.list <<'EOF'
-deb https://fai-project.org/download buster koeln
-EOF
-      ;;
-  esac
-else
-  rm -f /etc/apt/sources.list.d/fai.list
 fi
 
 fi
 
-apt-get update
+if $update; then
+  apt-get update
+fi
 
 # Relevant packages from fai-quickstart depends and fai-server recommends.
 # I especially do not wait isc-dhcp-server or an inetd. Also excludes
 
 # Relevant packages from fai-quickstart depends and fai-server recommends.
 # I especially do not wait isc-dhcp-server or an inetd. Also excludes
@@ -120,7 +135,8 @@ apt-get update
 # kernel, or the ability to install it.
 # xorriso is for running fai-cd -a, not strictly need for fai-server
 # perl-tk is for fai-monitor-gui
 # kernel, or the ability to install it.
 # 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)
+# mtools is for fai-cd
+pkgs=(fai-doc tftpd-hpa tar reprepro squashfs-tools binutils xorriso perl-tk mtools)
 if modprobe nfsd &>/dev/null; then
   pkgs+=(nfs-kernel-server)
 else
 if modprobe nfsd &>/dev/null; then
   pkgs+=(nfs-kernel-server)
 else
@@ -128,48 +144,64 @@ else
 fi
 
 
 fi
 
 
-apt-get install -y ${pkgs[@]}
+apt-get install -y ${pkgs[@]}
 # 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
 # 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
+e apt-get install --no-install-recommends -y -o Dpkg::Options::=--no-force-confdef -o Dpkg::Options::=--force-confnew fai-server fai-client
 
 r=http://http.us.debian.org/debian
 # like default, but scrap httpredir, and nonfree.
 # All my systems should be able to get along without nonfree
 # for a base working system afaik.
 
 r=http://http.us.debian.org/debian
 # like default, but scrap httpredir, and nonfree.
 # All my systems should be able to get along without nonfree
 # for a base working system afaik.
+
 cat >/etc/fai/apt/sources.list <<EOF
 deb $r $base main contrib
 cat >/etc/fai/apt/sources.list <<EOF
 deb $r $base main contrib
-deb http://security.debian.org/debian-security $base/updates main contrib
 EOF
 
 EOF
 
-
+### begin setup security repo ###
 case $base in
 case $base in
-  jessie|stretch|buster)
+  stretch|buster)
     cat >>/etc/fai/apt/sources.list <<EOF
     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
+deb http://security.debian.org/debian-security $base/updates main contrib
 EOF
     ;;
 EOF
     ;;
+  *)
+    # new naming convention
+    cat >>/etc/fai/apt/sources.list <<EOF
+deb http://security.debian.org/debian-security $base-security main contrib
+EOF
 esac
 esac
+### end setup security repo ###
 
 
-if [[ $base == jessie ]]; then
-  cat >>/etc/fai/apt/sources.list <<'EOF'
-# fix tar https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=819978
-deb http://ftp.debian.org/debian jessie-backports main
+
+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
 EOF
-  # note, fai doesn\'t look at /etc/fai/apt/preferences.d
-  cat >/etc/fai/apt/preferences <<'EOF'
-Package: tar
-Pin: release a=jessie-backports
-Pin-Priority: 500
+
+## Get latest kernel and btrfs for dealing with btrfs issues.
+# if [[ $base == buster ]]; then
+#   cat >>/etc/fai/apt/sources.list <<'EOF'
+# deb http://ftp.debian.org/debian buster-backports main
+# EOF
+#   # note, fai doesn\'t look at /etc/fai/apt/preferences.d
+#   cat >/etc/fai/apt/preferences <<'EOF'
+# Package: linux-* firmware-linux-free btrfs-progs
+# Pin: release a=buster-backports
+# Pin-Priority: 500
+# EOF
+# fi
+
+
+if [[ -s /q/root/shadow/standard ]]; then
+  $sed -f - /etc/fai/nfsroot.conf <<EOF
+$ a FAI_ROOTPW='$(</q/root/shadow/standard)'
+/^\s*FAI_ROOTPW/d
 EOF
 fi
 
 EOF
 fi
 
-
 $sed -f - /etc/fai/nfsroot.conf <<EOF
 $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",
 $ a SSH_IDENTITY=/root/.ssh/home.pub
 /^\s*SSH_IDENTITY/d
 s,^( *FAI_DEBOOTSTRAP=).*,\1"$base $r",
@@ -181,25 +213,34 @@ s,^( *FAI_DEBOOTSTRAP=).*,\1"$base $r",
 EOF
 
 $sed 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf
 EOF
 
 $sed 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf
+$sed -i '/^LOGUSER=/d' /etc/fai/fai.conf
 $sed -i '/^FAI_FLAGS=/d' /etc/fai/fai.conf
 echo "FAI_FLAGS=verbose" >>/etc/fai/fai.conf
 $sed -i '/^FAI_FLAGS=/d' /etc/fai/fai.conf
 echo "FAI_FLAGS=verbose" >>/etc/fai/fai.conf
+# note if this isnt set, the user isnt created
+echo "LOGUSER=fai" >>/etc/fai/fai.conf
 
 # from man fai-make-nfsroot,
 # figured out after partitioning ignored my crypt partition
 
 
 
 # from man fai-make-nfsroot,
 # figured out after partitioning ignored my crypt partition
 
 
-if ! grep cryptsetup /etc/fai/NFSROOT &>/dev/null; then
-  cat >>/etc/fai/NFSROOT <<'EOF'
+cedit /etc/fai/NFSROOT <<'EOF' || [[ $? == 1 ]]
 # inserted by faserver-setup
 PACKAGES install
 cryptsetup
 # inserted by faserver-setup
 PACKAGES install
 cryptsetup
+# default one is linux-image-server, doesnt exist anymore
+linux-image-amd64
+# default is btrfs-tools which doesnt exist anymore
+btrfs-progs
+iw
+# got an error in error.log about not having gpg.
+# system seemed to still install ok, so i havent tested if this fixes it.
+gpg
 EOF
 EOF
-fi
 
 if armhf; then
   cd /srv/fai
 
 if armhf; then
   cd /srv/fai
-  rm -rf nfsroot
-  tar Jxf $basefile
+  rm -rf nfsroot
+  tar Jxf $basefile
   # 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
@@ -218,13 +259,8 @@ if armhf; then
     # tftp environment
     local pxebin
 
     # tftp environment
     local pxebin
 
-    # wheezy path
-    if [ -f $NFSROOT/usr/lib/PXELINUX/pxelinux.0 ]; then
-      pxebin=$NFSROOT/usr/lib/PXELINUX/pxelinux.0
-    else
-      # jessie+ path
-      pxebin=$NFSROOT/usr/lib/syslinux/pxelinux.0
-    fi
+    # jessie+ path
+    pxebin=$NFSROOT/usr/lib/syslinux/pxelinux.0
 
     rm -f $NFSROOT/boot/*.bak
     mkdir -p $TFTPROOT/pxelinux.cfg
 
     rm -f $NFSROOT/boot/*.bak
     mkdir -p $TFTPROOT/pxelinux.cfg
@@ -245,12 +281,12 @@ if armhf; then
 type setup_tftp
 EOF
                               )
 type setup_tftp
 EOF
                               )
-  setup_tftp
+  setup_tftp
 
   # -g causes skipping set_root_pw() in fai-make-nfsroot, -ag
   # is the only way to make it run without chrooting. the options
   # seem contradictory, but it works.
 
   # -g causes skipping set_root_pw() in fai-make-nfsroot, -ag
   # is the only way to make it run without chrooting. the options
   # seem contradictory, but it works.
-  fai-setup -evag
+  fai-setup -evag
 
 else # not armhf
   # note, this copies the -B arg to
 
 else # not armhf
   # note, this copies the -B arg to
@@ -258,6 +294,12 @@ else # not armhf
   e fai-setup -evf -B $basefile
   # fai-setup expert mode avoids writing to /var/log/fai/variables
   # at least config_src is needed for autodiscover
   e fai-setup -evf -B $basefile
   # fai-setup expert mode avoids writing to /var/log/fai/variables
   # at least config_src is needed for autodiscover
+
+
+  # lld /var/log/fai/remote-logs:
+  # d 750  fai nogroup 100 08-07 08:51 pm /var/log/fai/remote-logs
+  # We could change the group or something, but why not just give me more permissions :)
+  e usermod -a -G nogroup iank
   $sed '/^FAI_CONFIGDIR|^FAI_CONFIG_SRC|^LOGUSER/d' /var/log/fai/variables
   tee -a /var/log/fai/variables <<'EOF'
 LOGUSER=fai
   $sed '/^FAI_CONFIGDIR|^FAI_CONFIG_SRC|^LOGUSER/d' /var/log/fai/variables
   tee -a /var/log/fai/variables <<'EOF'
 LOGUSER=fai
@@ -265,15 +307,27 @@ FAI_CONFIGDIR=/srv/fai/config
 FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
 EOF
   # make the faiserver also the apt proxy server
 FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
 EOF
   # make the faiserver also the apt proxy server
-  apt-get -y install apt-cacher-ng
+  apt-get -y install apt-cacher-ng
 fi
 
 rm -f /srv/fai/nfsroot/root/.ssh/known_hosts
 fi
 
 rm -f /srv/fai/nfsroot/root/.ssh/known_hosts
-key=$(ssh-keyscan localhost |& grep -o "ecdsa-sha2-nistp256.*")
+if [[ $HOSTNAME == kd ]]; then
+  keyscan_arg="-p 8989"
+fi
+key=$(ssh-keyscan $keyscan_arg 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
 
 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
 
+# make it the root because pxe-kexec only looks there.
+# It wouldn't be too hard to change if we needed.
+# We could also just dump things in /srv/tftp, but fai
+# has some defaults, which I don't even use, which expect
+# the other directory, so it's kind of a tossup, whatever.
+# This means fai's example isc-dhcp-server filename directory should remove the fai/ prefix.
+sed -ri 's,^ *(TFTP_DIRECTORY=).*,\1"/srv/tftp/fai",' /etc/default/tftpd-hpa
+systemctl restart tftpd-hpa
+
 
 # serial console
 # mainly from
 
 # serial console
 # mainly from