#!/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 -riBM /boot # this is also done by FABASE/10-misc by default. fcopy -riBM /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 if ifclass VOL_STRETCH_BOOTSTRAP; then fcopy -riM /etc/systemd/system chroot $FAI_ROOT bash <<'EOFOUTER' systemctl enable fai_check.service EOFOUTER exit 0 # avoid unnecessary stuff in bootstrap vol fi # 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) 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 #### 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 </dev/null; then usermod -aG $g iank fi done if getent group systemd-journal >/dev/null; then usermod -aG systemd-journal iank fi # this is usefull. Only thing reason I see this being disabled by default is # that a normal user can disrupt the system, eg cause a reboot. sed -i '$a kernel.sysrq=1 /^kernel.sysrq=/d' /etc/sysctl.conf EOFOUTER # bitfolk installer handles the rest case $HOSTNAME in bk) exit 0 ;; esac if [[ $FAI_ACTION != dirinstall ]] && ! ifclass NOCRYPT; then # luks options, see man systemd-cryptsetup-generator # all i know is that with luks.crypttab=no, swap still timed out on boot. # and with rd.luks.crypttab=no, it works. if ifclass LINODE; then speed=19200 cmdline="rd.luks.crypttab=no net.ifnames=0 console=ttyS0,${speed}n8" else speed=115200 cmdline="rd.luks.crypttab=no net.ifnames=0 console=ttyS0,${speed}n8 console=tty0" fi cat >$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 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 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 if ifclass LINODE; then mkdir -p $target/etc/initramfs-tools/conf.d cat >$target/etc/initramfs-tools/conf.d/mine <