#!/bin/bash -x set -eE -o pipefail trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR if [[ $EUID != 0 ]]; then echo "$0: error: expected to be root." exit 1 fi if ! type -t fcopy &>/dev/null; then sudo apt-get -y install fai-client fi if [[ -e /a/bin/fai/fai-wrapper ]]; then chroot() { shift "$@" } fi # -r = recursive # -i = ignore non-matching class warnings, always exit 0 # -B = no backup files fcopy -riB /boot # this is also done by FABASE/10-misc by default (without B) fcopy -riB /root src=$FAI/distro-install-common/shadow dst=/q/root/shadow if [[ ! -e $dst && -e $src ]]; then # outside of fai context, we skip this mkdir -p $dst mount -o bind $src $dst fi $FAI/distro-install-common/end ### begin sources install + updates # these get copied in an earlier stage by fai, but leaving it here since # I run this as a single post-fai script to update things that have changed. tmpfile1=$(mktemp) # this can fail if we need an apt update chroot $FAI_ROOT /usr/bin/apt-cache policy >$tmpfile1 ||: fcopy -riBM /etc/apt tmpfile2=$(mktemp) chroot $FAI_ROOT /usr/bin/apt-cache policy >$tmpfile2 if ! diff -q $tmpfile1 $tmpfile2; then chroot $FAI_ROOT /usr/bin/apt update fi # outside of fai, this seems to regularly lead to # E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) # so add a sleep. 1 sec is probably way more than needed. sleep 1 f=$FAI_ROOT/var/cache/apt/pkgcache.bin if [[ ! -r $f ]] || (( $(( $(date +%s) - $(stat -c %Y $f ) )) > 60*60*2 )); then i=0 while fuser $FAI_ROOT/var/lib/dpkg/lock &>/dev/null; do sleep 1 i=$(( i+1 )) if (( i > 300 )); then echo "error: timed out waiting for /var/lib/dpkg/lock" >&2 exit 1 fi $ROOTCMD apt-get update done fi ### end sources install + updates #### misc configurations chroot $FAI_ROOT bash <<'EOFOUTER' if getent group systemd-journal >/dev/null; then # makes the journal be saved to disk. mkdir -p /var/log/journal chmod 755 /var/log/journal fi debconf-set-selections <$FAI_ROOT/etc/grub.d/40_custom </dev/null && [[ $(iw dev) ]]; then chroot $FAI_ROOT bash <$target/etc/NetworkManager/conf.d/99-iank.conf <<'EOF' [main] dns=systemd-resolved EOF if [[ $HOSTNAME == frodo ]]; then cat > $target/etc/network/interfaces <<-EOF # generated by FAI auto lo eth0 iface lo inet loopback iface eth0 inet static address 10.3.0.2/16 EOF fi else cat > $target/etc/network/interfaces <<-EOF # generated by FAI auto lo eth0 iface lo inet loopback iface eth0 inet dhcp iface eth0 inet6 auto EOF # previously had an else condition after #elif ifclass VM || ifclass LINODE; then # iface $NIC1 inet manual # iface br0 inet dhcp # bridge_ports $NIC1 # bridge_stp off # bridge_maxwait 0 # however, on t9, on startup, br0, became # rename1 and didn't come up. i dunno why, # but the bridge is for vms that I rarely use, # so not bothering to figure it out. fi if ifclass LINODE; then mkdir -p $target/etc/initramfs-tools/conf.d cat >$target/etc/initramfs-tools/conf.d/mine < $target/etc/network/interfaces <<-EOF # generated by FAI auto lo eth0 iface lo inet loopback iface eth0 inet dhcp # for the standard network config, uncomment this and comment the lines after it. #iface eth0 inet6 auto iface eth0 inet6 static # this is really a /128. it seems like we need to assign it for ipv6 to work. address 2600:3c00::f03c:91ff:fe6d:baf8/64 gateway fe80::1 iface eth0 inet6 static # from a requested /64 pool address 2600:3c00:e000:280::2/64 EOF fi fi # I prefer to stick with ifup/down for now. a. networkd is not in its # own package, so cant use in other init systems. b. it works fine. chroot $FAI_ROOT bash </dev/null; then usermod -aG $g iank fi done if getent group systemd-journal >/dev/null; then usermod -aG systemd-journal iank fi EOFOUTER rm -f $target/etc/resolv.conf ln -s ../run/systemd/resolve/stub-resolv.conf $target/etc/resolv.conf # needed for bitfolk image if [[ -e /a/bin/fai/fai-wrapper ]]; then systemctl enable systemd-resolved systemctl start systemd-resolved fi # reading through the groups that iank is in but user2 isn't, for g in plugdev audio video cdrom; do $ROOTCMD usermod -a -G $g user2 done