various fixes, internal mail server
[distro-setup] / distro-begin
index a76549110ad0e77c62eb93e00a46c5a3ed50dbdc..d2b6e083bbfa2c6093c97ee588c2bca2b8988ccf 100755 (executable)
@@ -567,7 +567,7 @@ EOF
     fi
 fi
 
-s mkdir -p /q/i/{w,k}
+s mkdir -p /q /i/{w,k}
 for dir in /{i,w,k}; do
     if mountpoint $dir; then continue; fi # already mounted
     s mkdir -p $dir
@@ -583,21 +583,27 @@ s mkdir -p /mnt/iroot
 # then waits endlessly for them on bootup, after the /dev/mapper disks
 # have already been created and exist. todo: create a simple repro
 # for this in a vm and report it upstream.
-s dd of=/root/imount <<'EOF'
+if has_btrfs || home_network; then
+    pi nfs-common
+    s dd of=/root/imount <<'EOF'
 #!/bin/bash
 [[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@"
 set -eE -o pipefail
 trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
-for dir in /i /mnt/iroot /w /k /kr; do
-  if ! mountpoint $dir &>/dev/null && \
-        awk '{print $2}' /etc/fstab | grep -xFq $dir; then
-    mount $dir
-  fi
+for dir in /i /mnt/iroot /k /kr; do
+    if ! mountpoint $dir &>/dev/null && \
+            awk '{print $2}' /etc/fstab | grep -xF $dir &>/dev/null; then
+        if awk '{print $3}' /etc/fstab | grep -xF nfs &>/dev/null; then
+            mount $dir || echo "warning: failed to mount nfs on $dir"
+        else
+            mount $dir
+        fi
+    fi
 done
 EOF
-s chmod +x /root/imount
+    s chmod +x /root/imount
 
-s dd of=/etc/systemd/system/imount.service <<'EOF'
+    s dd of=/etc/systemd/system/imount.service <<'EOF'
 [Unit]
 Description=Mount /i and related mountpoints
 
@@ -606,32 +612,39 @@ Type=oneshot
 ExecStart=/root/imount
 
 [Install]
+# note /kr needs networking, this target is the simplest way to
+# time it when the network should be up, but not do something
+# dumb like delay startup until the network is up. It happens
+# at some time after network.target
 WantedBy=multi-user.target
 EOF
-sudo systemctl daemon-reload # needed if the file was already there
-sudo systemctl enable imount.service
-sudo systemctl start imount.service
-
+    sudo systemctl daemon-reload # needed if the file was already there
+    sudo systemctl enable imount.service
+    sudo systemctl start imount.service
+fi
 
 dir=/nocow
-if ! mountpoint $dir; then
-    subvol=/mnt/root/nocow
-    if [[ ! -e $subvol ]]; then
-        s btrfs subvolume create $subvol
-        s chown root:1000 $subvol
-        s chattr +C $subvol
-    fi
+if has_btrfs; then
+    if ! mountpoint $dir; then
+        subvol=/mnt/root/nocow
+        if [[ ! -e $subvol ]]; then
+            s btrfs subvolume create $subvol
+            s chown root:1000 $subvol
+            s chattr +C $subvol
+        fi
 
-    first_root_crypt=$(awk '$2 == "/" {print $1}' /etc/mtab)
-    tu /etc/fstab <<EOF
+        first_root_crypt=$(awk '$2 == "/" {print $1}' /etc/mtab)
+        tu /etc/fstab <<EOF
 $first_root_crypt  /nocow  btrfs  noatime,subvol=nocow  0 0
 EOF
-    s mkdir -p $dir
-    s chown ian:ian $dir
-    s mount $dir
+        s mkdir -p $dir
+        s chown ian:ian $dir
+        s mount $dir
+    fi
+else
+    sudo mkdir -p $dir
 fi
 
-
 # ssh and probably some other things care about parent directory
 # ownership, and ssh doesn\'t allow any group writable parent
 # directories, so we are forced to use a directory structure similar
@@ -714,28 +727,33 @@ EOF
 
 
 if isdeb; then
-    # I've had problems with postfix on debian:
+    # I\'ve had problems with postfix on debian:
     # on stretch, a startup ordering issue caused all mail to fail.
     # postfix changed defaults to only use ipv6 dns, causing all my mail to fail.
     # exim4 is default on debian, so I assume it would
     # be packaged better to avoid these types of things.
-    # I haven't gotten around to getting a non-debian exim
+    # I haven\'t gotten around to getting a non-debian exim
     # setup.
     mail-setup exim4
-   else
-       mail-setup postfix
+else
+    mail-setup postfix
 fi
 
-   if isubuntu; then
-       # disable crash report annoying crap
-       s dd of=/etc/default/apport <<<'enabled=0'
-   fi
+if isubuntu; then
+    # disable crash report annoying crap
+    s dd of=/etc/default/apport <<<'enabled=0'
+fi
 
 # fai sets this an old way that doesn't work for stretch.
 # no harm in setting it universally here.
 # using debconf-set-selection, the area gets reset to ETC
 # on my linode test machine after doing a dpkg-reconfigure, or a reinstall,
 # so we are using expect :(
+# I got a random error when running this, so I added a sleep
+# rather than trying to write a whole detect and wait loop.
+# E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
+# E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
+sleep 1
 s apt-get -y install --no-install-recommends expect
 s expect <<EOF
 set force_conservative 0