Merge branch 'upstream'
authorIan Kelling <iank@fsf.org>
Thu, 4 Jul 2019 03:28:46 +0000 (23:28 -0400)
committerIan Kelling <iank@fsf.org>
Thu, 4 Jul 2019 03:28:46 +0000 (23:28 -0400)
Tested with flidas vm.

1  2 
fai/config/basefiles/mk-basefile
fai/config/class/DEBIAN.var
fai/config/hooks/instsoft.DEBIAN
fai/config/package_config/UBUNTU
fai/config/scripts/DEBIAN/30-interface
fai/config/scripts/GRUB_PC/10-setup
fai/config/scripts/LAST/50-misc

index 4037d094f09cf211d87f05dd7bae481031cb4317,deb12d4e59678407166e723095ec32e3fa0fc429..6dcd98697341207a714c6d3e72f2f754d2110023
@@@ -1,4 -1,5 +1,4 @@@
  #! /bin/bash
 -
  # mk-basefile, create basefiles for some distributions
  #
  # Thomas Lange, Uni Koeln, 2011-2018
  # For the first stage, set the CentOS/SLC mirror in /etc/rinse/rinse.conf
  MIRROR_DEBIAN=http://deb.debian.org/debian/
  MIRROR_UBUNTU=http://mirror.netcologne.de/ubuntu/
 +MIRROR_TRISQUEL=http://mirror.fsf.org/trisquel/
  MIRROR_CENTOS=http://mirror.netcologne.de/
  
  EXCLUDE_SQUEEZE=isc-dhcp-client,isc-dhcp-common,info
  EXCLUDE_WHEEZY=info
  EXCLUDE_JESSIE=info
  EXCLUDE_STRETCH=info
 -EXCLUDE_BUSTER=
 +EXCLUDE_BUSTER=info
  EXCLUDE_SID=
  
 +EXCLUDE_BELENOS=dhcp3-client,dhcp3-common,info
  EXCLUDE_TRUSTY=dhcp3-client,dhcp3-common,info
  EXCLUDE_XENIAL=udhcpc,dibbler-client,info
 +EXCLUDE_FLIDAS=udhcpc,dibbler-client,info
  EXCLUDE_BIONIC=udhcpc,dibbler-client,info
  
  # here you can add packages, that are needed very early
@@@ -106,14 -104,6 +106,14 @@@ EO
  
  cleanup-deb() {
  
 +    if [[ $cmd ]]; then
 +        if [[ -e $cmd ]]; then
 +            cp "$cmd" $xtmp/tmp
 +            chroot $xtmp "/tmp/$cmd"
 +        else
 +            chroot $xtmp $cmd
 +        fi
 +    fi
      chroot $xtmp apt-get clean
      rm -f $xtmp/etc/hostname $xtmp/etc/resolv.conf \
            $xtmp/var/lib/apt/lists/*_* $xtmp/usr/bin/qemu-*-static \
@@@ -184,6 -174,7 +184,7 @@@ debgeneric() 
  
      dist=${DIST%%[0-9][0-9]}
      local exc="EXCLUDE_$dist"
+     [ -n "${!exc}" ] && exc="--exclude=${!exc}" || unset exc
      dist=${dist,,}
  
      check
      fi
  
      if [ -n "$arch" ]; then
-       qemu-debootstrap --arch $arch --exclude=${!exc} $inc $dist $xtmp $mirror
+       qemu-debootstrap --arch $arch ${exc} $inc $dist $xtmp $mirror
        target="${target}_${arch^^}"
      else
        if [[ $DIST =~ 64 ]]; then
        else
              arch=i386
        fi
-       debootstrap --arch $arch --exclude=${!exc} $dist $xtmp $mirror
+       debootstrap --arch $arch ${exc} $inc $dist $xtmp $mirror
      fi
      cleanup-deb
      tarit
@@@ -243,8 -234,6 +244,8 @@@ Usage: mk-basefile [OPTION] ... DISTRIB
     -z                   Use gzip for compressing the tar file.
     -J                   Use xz for compressing the tar file.
     -k                   Keep the temporary subtree structure, do not remove it.
 +   -x CMD               Run CMD in chroot. If CMD exists as a file, copy it and run it.
 +                        Debian based only
     -h                   Print help.
  
   Usage example: mk-basefile -J STRETCH64
@@@ -262,7 -251,7 +263,7 @@@ attributes
  cleanup=1
  attributes="--xattrs --selinux --acls"
  
 -while getopts ashzJd:kf: opt ; do
 +while getopts ashzJd:kf:x: opt ; do
      case "$opt" in
          a) echo "$0: Warning. -a is ignored, because xtattrs, acls and selinux are always added." ;;
          d) export TMPDIR=$OPTARG ;;
          k) cleanup=0 ;;
          h) usage ;;
          s) prtdists ; exit 0;;
 +        x) cmd="$OPTARG" ;;
          ?) exit 3 ;; # error in option parsing
      esac
  done
@@@ -300,8 -288,6 +301,8 @@@ case "$target" i
      SLC6_32) slc i386 6 ;;
      SLC6_64) slc amd64 6 ;;
      SLC7_64) slc amd64 7 ;;
 +    BELENOS*|FLIDAS*)
 +        debgeneric $target $MIRROR_TRISQUEL ;;
      TRUSTY*|XENIAL*|BIONIC*)
          debgeneric $target $MIRROR_UBUNTU ;;
      SQUEEZE*|WHEEZY*|JESSIE*|STRETCH*|BUSTER*|SID*)
index 2ce239bc2c58e54cefb033d07df9505f268bc118,e9a275695156be45497decce5d88854dca64b1e2..f343669f34cc99085a552c65e806e7e9fd78a683
@@@ -1,4 -1,4 +1,4 @@@
- release=stretch
+ release=buster
  apt_cdn=http://deb.debian.org
  security_cdn=http://security.debian.org
  
@@@ -13,9 -13,7 +13,9 @@@ MODULESLIST="usbhid psmouse
  
  # if you have enough RAM (>2GB) you may want to enable this line. It
  # also puts /var/cache into a ramdisk.
 -#FAI_RAMDISKS="$target/var/lib/dpkg $target/var/cache"
 +# ian: uncommented
 +FAI_RAMDISKS="$target/var/lib/dpkg $target/var/cache"
  
  # if you want to use the faiserver as APT proxy
 -#APTPROXY=http://faiserver:3142
 +# ian: uncommented
 +APTPROXY=http://faiserver:3142
index 41191730a3a11a48ad13f07857184ce65dcdc0be,35ac3064f48afe0b4848f917bec04f1353705a8e..34e6ebbfbc92764394109d684c6ffc27c3b2d0ed
@@@ -1,6 -1,5 +1,6 @@@
  #! /bin/bash
  
 +set -x
  # if package locales will be installed, then install it early, before
  #  other packages
  if [ $FAI_ACTION != "install" -a $FAI_ACTION != "dirinstall" ]; then
@@@ -8,13 -7,12 +8,11 @@@
  fi
  
  fcopy -Bi /etc/apt/apt.conf.d/force_confdef
 -ainsl -a  /etc/ucf.conf "^conf_force_conffold=YES"
  
- # ian: on flidas this gives an error: update-locale: Error: invalid locale settings:  LANG=en_US.UTF-8
- # # in case the locales are already included inside the base file (Ubuntu)
- # if [ -f $target/usr/sbin/locale-gen ]; then
- #     $ROOTCMD dpkg-reconfigure -fnoninteractive locales
- #     exit
- # fi
+ # in case the locales are already included inside the base file (Ubuntu)
+ if [ -f $target/usr/sbin/locale-gen ]; then
+     exit
+ fi
  
  # if we want to install locales, install them now
  install_packages -l 2>/dev/null | egrep  -q  ' locales|locales '
index 81670da2456755c1bd0e776cb2865fe4bd3eaff8,47e9e73eeeeaa04977e34e5bcb411b9c81bf3ec2..a2de98e5a82f66b6bfdce1da53dc597a06e0e1e8
@@@ -1,17 -1,3 +1,17 @@@
 +# duplicated in DEBIAN
 +PACKAGES install-norec
 +debconf-utils
 +file
 +less
 +rsync
 +openssh-client openssh-server
 +time
 +procinfo
 +locales
 +console-setup kbd
 +pciutils usbutils
 +unattended-upgrades
 +
  PACKAGES install I386
  linux-image-generic
  memtest86+
@@@ -23,15 -9,12 +23,13 @@@ PACKAGES install AMD6
  linux-image-generic
  memtest86+
  
 +# duplicated in DEBIAN
  PACKAGES install GRUB_PC
 -grub-pc
 +grub-pc cryptsetup btrfs-tools mbuffer sudo bridge-utils netcat-openbsd resolvconf lsof
 +
  
 -PACKAGES install
 -ubuntu-minimal
 -ubuntu-server
 +PACKAGES install FLIDAS64 XENIAL64
 +linux-image-generic-hwe-8.0
  
- PACKAGES install XORG
- ubuntu-desktop
- ubuntu-standard
- ubuntu-minimal
+ PACKAGES install GERMAN
+ language-pack-gnome-de
index 72f04a00781407bce1e5fa7b17b9f18787082d8c,34c98e81aa5591b790912bf64a26b1dd84d4f625..5955f7b3b9bdf76efa4ec398f288bac79f398eb1
@@@ -1,20 -1,62 +1,65 @@@
  #! /bin/bash
  
 +# modified from upstream fai example
 +error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
 +
+ netplan_yaml() {
+     # network configuration using ubuntu's netplan.io
+     local IFNAME="$1"
+     local METHOD="$2"
+     echo     "Generating netplan configuration for $IFNAME ($METHOD)" >&2
+     echo     "# generated by FAI"
+     echo     "network:"
+     echo     "  version: 2"
+     echo     "  renderer: $RENDERER"
+     case "$RENDERER" in
+       networkd)
+         echo     "  ethernets:"
+         echo     "    $IFNAME:"
+         case "$METHOD" in
+           dhcp)
+             echo "      dhcp4: true"
+             ;;
+           static)
+             echo "      addresses: [$CIDR]"
+             echo "      gateway4: $GATEWAYS_1"
+             echo "      nameservers:"
+             echo "        search: [$DOMAIN]"
+             echo "        addresses: [${DNSSRVS// /, }]"
+             ;;
+         esac
+     esac
+ }
+ iface_stanza() {
+     # classic network configuration using /etc/network/interfaces
+     local IFNAME="$1"
+     local METHOD="$2"
+     echo "Generating interface configuration for $IFNAME ($METHOD)" >&2
+     echo "# generated by FAI"
+     echo "auto $IFNAME"
+     echo "iface $IFNAME inet $METHOD"
+     case "$METHOD" in
+       static)
+         echo "    address $IPADDR"
+         echo "    netmask $NETMASK"
+         echo "    broadcast $BROADCAST"
+         echo "    gateway $GATEWAYS"
+         ;;
+     esac
+ }
  newnicnames() {
  
      # determine predictable network names only for stretch and above
  
      [ $do_init_tasks -eq 0 ] && return
+     [ -z "$NIC1" ] && return
      ver=$($ROOTCMD dpkg-query --showformat='${Version}' --show udev)
      if dpkg --compare-versions $ver lt 220-7; then
        return
      fi
  
-     [ -z "$NIC1" ] && return
  
      fields="ID_NET_NAME_FROM_DATABASE ID_NET_NAME_ONBOARD ID_NET_NAME_SLOT ID_NET_NAME_PATH"
      for field in $fields; do
            break
        fi
      done
 +    # This condition is only needed because the nfsroot I use
 +    # is based on Jessie, which has an old udev which can't
 +    # figure out the persistent interface name used in stretch.
 +    if ifclass VM; then NIC1=ens3; return; fi
      if [[ ! $name ]]; then
        echo "$0: error: could not find systemd predictable network name. Using $NIC1."
      fi
  }
  
  if [ -z "$NIC1" ]; then
-     echo "ERROR: \$NIC1 is not defined. Cannot configure /etc/network/interfaces properly."
+     echo "WARNING: \$NIC1 is not defined. Cannot add ethernet to /etc/network/interfaces."
  fi
- newnicnames
  CIDR=$(ip -o -f inet addr show $NIC1 | awk '{print $4}')
- if ifclass DHCPC && [ $FAI_ACTION = "install" -o $FAI_ACTION = "dirinstall" ]; then
+ newnicnames
+ case "$FAI_ACTION" in
+   install|dirinstall)
+     ifclass DHCPC && METHOD=dhcp || METHOD=static
+     ifclass XORG && RENDERER=NetworkManager || RENDERER=networkd
  
-     if ifclass VM; then
+     if [ -d $target/etc/netplan ]; then
+         # Ubuntu >= 17.10 with netplan.io
+         if [ -n "$NIC1" ]; then
+             netplan_yaml $NIC1 $METHOD > $target/etc/netplan/01-${NIC1}.yaml
+         fi
+     elif [ -d $target/etc/network/interfaces.d ]; then
+         # ifupdown >= 0.7.41 (Debian >= 8, Ubuntu >= 14.04)
 -        iface_stanza lo loopback > $target/etc/network/interfaces.d/lo
 -        if [ -n "$NIC1" -a ! -f $target/etc/NetworkManager/NetworkManager.conf ]; then
 -            iface_stanza $NIC1 $METHOD > $target/etc/network/interfaces.d/$NIC1
 -        fi
++      if ifclass VM; then
 +        # note, this condition would apply to the elif below too,
 +        # but I don't specify a static ip in fai, so not bothering
 +        cat > $target/etc/network/interfaces <<-EOF
 +      # generated by FAI
 +      auto lo $NIC1
 +      iface lo inet loopback
 +      iface $NIC1 inet dhcp
 +EOF
-     else
++      else
 +        cat > $target/etc/network/interfaces <<-EOF
 +        # generated by FAI
 +        auto lo br0
 +        iface lo inet loopback
 +        iface $NIC1 inet manual
 +        # make a bridge by default so we can have bridged vms.
 +        # Some example I read had stp on, but i don't need stp,
 +        # and it causes a vm to fail pxe boot, presumably unless
 +        # you add some delay.
 +        # http://wiki.libvirt.org/page/PXE_boot_%28or_dhcp%29_on_guest_failed
 +        iface br0 inet dhcp
 +          bridge_ports $NIC1
 +          bridge_stp off
 +          bridge_maxwait 0
 +EOF
++      fi
+     else
 -        (
 -            iface_stanza lo loopback
 -            iface_stanza $NIC1 $METHOD
 -        ) > $target/etc/network/interfaces
++      (
++        iface_stanza lo loopback
++        iface_stanza $NIC1 $METHOD
++      ) > $target/etc/network/interfaces
      fi
- elif [ $FAI_ACTION = "install" -o $FAI_ACTION = "dirinstall" ]; then
-     [ -n "$CIDR" ] && cat > $target/etc/network/interfaces <<-EOF
-       # generated by FAI
-       auto lo $NIC1
-       iface lo inet loopback
-       iface $NIC1 inet static
-         address $CIDR
-         gateway $GATEWAYS
- EOF
-     [ -n "$NETWORK" ] && echo "localnet $NETWORK" > $target/etc/networks
-     if [ ! -L $target/etc/resolv.conf -a -e /etc/resolv.conf ]; then
-       cp -p /etc/resolv.conf $target/etc
+     if ! ifclass DHCPC ; then
+         [ -n "$NETWORK" ] && echo "localnet $NETWORK" > $target/etc/networks
+         if [ ! -L $target/etc/resolv.conf -a -e /etc/resolv.conf ]; then
+             cp -p /etc/resolv.conf $target/etc
+         fi
      fi
- fi
+     ;;
+ esac
  
  # here fcopy is mostly used, when installing a client for running in a
  # different subnet than during the installation
index 00829e110a7ecc3acff8ab60f789c4a9c3e9481c,55632754b2eab15de9759def493baa7c2d38ae80..a78df0cb408dfa5b8b6b18773bfa7fbc80c7bb4e
@@@ -3,7 -3,6 +3,7 @@@
  
  error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
  
 +set -x
  set -a
  
  # do not set up grub during dirinstall
@@@ -28,32 -27,25 +28,29 @@@ f
  
  GROOT=$($ROOTCMD grub-probe -tdrive -d $BOOT_DEVICE)
  
+ # handle /boot in lvm-on-md
+ _bdev=$(readlink -f $BOOT_DEVICE)
+ if [ "${_bdev%%-*}" = "/dev/dm" ]; then
+   BOOT_DEVICE=$( lvs --noheadings -o devices $BOOT_DEVICE | sed -e 's/^*\([^(]*\)(.*$/\1/' )
+ fi
  
  # Check if RAID is used for the boot device
  if [[ $BOOT_DEVICE =~ '/dev/md' ]]; then
 +    GROOT=$($ROOTCMD grub-probe -tdrive -d $BOOT_DEVICE)
      raiddev=${BOOT_DEVICE#/dev/}
      # install grub on all members of RAID
      for device in `LC_ALL=C perl -ne 'if(/^'$raiddev'\s.+raid\d+\s(.+)/){ $_=$1; s/\d+\[\d+\]//g; print }' /proc/mdstat`; do
        echo Install grub on /dev/$device
        $ROOTCMD grub-install --no-floppy "/dev/$device"
      done
- elif [[ $GROOT =~ 'hostdisk' ]]; then
-     for dev in $BOOT_DEVICE; do
-         $ROOTCMD grub-install --no-floppy --modules=part_msdos $dev
-         if [ $? -eq 0 ]; then
-             echo "Grub installed on hostdisk $BOOT_DEVICE"
-         fi
-     done
  else
 -    $ROOTCMD grub-install --no-floppy "$GROOT"
 -    if [ $? -eq 0 ]; then
 -        echo "Grub installed on $BOOT_DEVICE = $GROOT"
 -    fi
 +    for dev in $BOOT_DEVICE; do
 +        GROOT=$($ROOTCMD grub-probe -tdrive -d $dev)
 +        $ROOTCMD grub-install --no-floppy "$GROOT"
 +        if [ $? -eq 0 ]; then
 +            echo "Grub installed on $dev = $GROOT"
 +        fi
 +    done
  fi
  $ROOTCMD update-grub
  
index 36615518fa78483b6e0f71b880b51fc5edc69a58,eebb3792e3922e684b96be6af9d841a162d7bc3d..c2d6b5c85327a891a9527ab02ec760553c05a500
@@@ -15,15 -15,13 +15,15 @@@ els
      fi
    fi
  
 -  usedm=$(dmsetup ls 2>/dev/null | egrep -v '^live-rw|^live-base|^No devices found' | wc -l)
 -  if [ $usedm -ne 0 ]; then
 -    if [ ! -d $target/etc/lvm ]; then
 -      echo ERROR: Found lvm devices, but the lvm2 package was not installed
 -      error=1
 -    fi
 -  fi
 +  # i use dm for crypt, not lvm, so this gives false positive. todo, send patch to remove this
 +  # upstream.
 +  # usedm=$(dmsetup ls 2>/dev/null | egrep -v '^live-rw|^live-base|^No devices found' | wc -l)
 +  # if [ $usedm -ne 0 ]; then
 +  #   if [ ! -d $target/etc/lvm ]; then
 +  #       echo ERROR: Found lvm devices, but the lvm2 package was not installed
 +  #       error=1
 +  #   fi
 +  # fi
  fi
  
  # remove backup files from cfengine, but only if cfengine is installed
@@@ -47,8 -45,7 +47,8 @@@ if [ $do_init_tasks -eq 1 ] ; the
  fi
  
  # Make sure everything is configured properly
 -if ifclass DEBIAN ; then
 +if ifclass DEBIAN || ifclass UBUNTU; then
 +        echo "Running \"apt-get -f install\" for the last time."
          $ROOTCMD apt-get -f install
  fi
  
@@@ -75,7 -72,7 +75,7 @@@ setrel() 
        return
      fi
  
-     dists="jessie stretch buster xenial trusty"
+     dists="jessie stretch buster bullseye bookworm bionic xenial trusty"
      for d in $dists; do
        if grep -iq $d $target/etc/os-release; then
            release=$d