various improvements
[distro-setup] / distro-end
index d72adea591e501549cfd1669e4fd6c210dd31fd0..84566b89fa4299468c147d69bd2e60ee97911166 100755 (executable)
@@ -14,8 +14,9 @@
 # limitations under the License.
 
 ### setup
-errcatch
-src="${BASH_SOURCE%/*}"
+source /a/bin/errhandle/err
+src="$(readlink -f -- "$BASH_SOURCE")"; src=${src%/*} # directory of this file
+
 source $src/pkgs
 
 set -x
@@ -27,10 +28,14 @@ end_msg() {
   IFS= read -r -d '' y  ||:
   end_msg_var+="$y"
 }
+die() {
+  printf "$0: %s\n" "$*" >&2; exit 1
+}
 spa() { # simple package add
   simple_packages+=($@)
 }
 distro=$(distro-name)
+codename_compat=$(debian-codename-compat)
 pending_reboot=false
 sed="sed --follow-symlinks"
 # template
@@ -43,8 +48,30 @@ if isdeb; then
   pi aptitude
 fi
 
+# avoid ptompts!
+s debconf-set-selections <<EOF
+popularity-contest popularity-contest/participate boolean true
+EOF
+
 ########### begin section including li ################
-pi ${p3[@]} $($src/distro-pkgs)
+pi ${p3[@]}
+
+#### desktop stuff
+case $codename_compat in
+  xenial)
+    # mate-indicator-applet and beyond are msc things I noticed diffing a
+    # standard install with mine.
+    pi xorg lightdm mate-desktop-environment mate-desktop-environment-extras mate-indicator-applet anacron
+    ;;
+  stretch)
+    pi task-mate-desktop
+    ;;
+  buster)
+    # mate doesnt have wayland support yet
+    pi task-gnome-desktop
+    ;;
+esac
+
 
 conflink
 
@@ -63,15 +90,11 @@ esac
 
 
 # no equivalent in other distros:
-case $distro in
-  debian|trisquel|ubuntu)
-    if ! dpkg -s apt-file &>/dev/null; then
-      # this condition is just a speed optimization
-      pi apt-file
-      s apt-file update
-    fi
-    ;;
-esac
+if isdeb && ! dpkg -s -- "$@" | grep -Fx "Status: install ok installed" &> /dev/null; then
+  # this condition is just a speed optimization
+  pi apt-file
+  s apt-file update
+fi
 
 
 # disable motd junk.
@@ -83,10 +106,6 @@ case $distro in
     # this says disabling the service, it will still get restarted
     # but this script doesn't do anything on restart, so it should be fine
     s dd of=/var/run/motd.dynamic if=/dev/null
-    # stretch doesn't have initscripts pkg installed by default
-    if [[ $(debian-codename) == jessie ]]; then
-      s update-rc.d motd disable
-    fi
     ;;
   trisquel|ubuntu)
     # this isn't a complete solution. It still shows me when updates are available,
@@ -95,59 +114,50 @@ case $distro in
     ;;
 esac
 
-# automatic updates
-# reference:
-# https://debian-handbook.info/browse/stable/sect.regular-upgrades.html
-# /etc/cron.daily/apt calls unattended-upgrades
-# /usr/share/doc/unattended-upgrades# cat README.md
-# /etc/apt/apt.conf.d/50unattended-upgrades
-if isdebian; then
-  setup-debian-auto-update
-fi
-
 
 ### begin docker install ####
 if isdeb; then
   # https://store.docker.com/editions/community/docker-ce-server-debian?tab=description
   pi  software-properties-common apt-transport-https
   curl -fsSL https://download.docker.com/linux/$(distro-name-compat)/gpg | sudo apt-key add -
-  sudo add-apt-repository \
-       "deb [arch=amd64] https://download.docker.com/linux/$(distro-name-compat) \
-         $(debian-codename-compat) \
-         stable"
-  p update
+  url=https://download.docker.com/linux/$(distro-name-compat)
+  l="deb [arch=amd64] $url $codename_compat stable"
+
+  if ! grep -xFq "$l" /etc/apt/sources.list{,.d/*.list}; then
+    sudo add-apt-repository "$l"
+    p update
+  fi
   # docker eats up a fair amount of cpu when doing nothing, so don't enable it unless
   # we really need it.
   pi-nostart docker-ce
+  # and docker is even more crap, it ignores that it shouldnt start
+  ser stop docker
+  ser disable docker
   case $HOSTNAME in
     li|lj)  sgo docker ;;
   esac
-  # other distros unknown
 fi
 ###  end docker install ####
 
 
+
 ### begin certbot install ###
-case $distro in
-  debian)
-    # note, need python-certbot-nginx for nginx, but it depends on nginx,
-    # and I'm not installing nginx by default right now.
-    # note python-certbot-apache is in suggests, but so is a doc package that brought in xorg
-    if [[ $(debian-codename) == jessie ]]; then
-      pi -t jessie-backports certbot python-certbot-apache
-    else
-      pi certbot python-certbot-apache
-    fi
-    ;;
-  trisquel|ubuntu)
-    # not packaged in xenial or flidas
-    pi software-properties-common
+if [[ $distro == debian ]]; then
+  # note, need python-certbot-nginx for nginx, but it depends on nginx,
+  # and I'm not installing nginx by default right now.
+  pi certbot python-certbot-apache
+elif [[ $codename_compat == xenial ]]; then
+  # not packaged in xenial or flidas
+  pi software-properties-common
+  l="deb http://ppa.launchpad.net/certbot/certbot/ubuntu xenial main"
+  if ! grep -xFq "$l" /etc/apt/sources.list{,.d/*.list}; then
     s add-apt-repository -y ppa:certbot/certbot ||:
     p update
-    pi python-certbot-apache
-    ;;
-  # todo: other distros unknown
-esac
+  fi
+  pi python-certbot-apache
+else
+  die "distro unknown for certbot"
+fi
 # make a version of the certbot timer that emails me.
 x=/systemd/system/certbot
 $sed -r -f - /lib$x.timer <<'EOF' |s dd of=/etc${x}mail.timer
@@ -161,15 +171,46 @@ sgo certbotmail.timer
 ### end certbot install ###
 
 
-# dogcam setup
-case $HOSTNAME in
-  lj|li)
-    /a/bin/webcam/install-server
-    ;;
-  kw)
-    /a/bin/webcam/install-client
-    ;;
-esac
+# dogcam setup. not using atm
+# case $HOSTNAME in
+#   lj|li)
+#     /a/bin/webcam/install-server
+#     ;;
+#   kw)
+#     /a/bin/webcam/install-client
+#     ;;
+# esac
+
+pi ${p1[@]}
+
+##### begin automatic upgrades ####
+# this makes it so we upgrade everything
+s debconf-set-selections <<'EOF'
+unattended-upgrades unattended-upgrades/origins_pattern string "codename=${distro_codename}";
+EOF
+s dpkg-reconfigure -u -fnoninteractive unattended-upgrades
+
+# Setup daily reboots, so all unattended upgrades go into affect
+# unattended upgrades happen at 6 am + rand(60 min).
+echo '20 7 * * * root /usr/local/bin/zelous-unattended-reboot' | s dd of=/etc/cron.d/unattended-upgrade-reboot
+##### end automatic upgrades ####
+
+# office is not exposed to internet yet
+if [[ $(hostname -f) != *.office.fsf.org ]]; then
+  ## prometheus node exporter setup
+  web-conf -f 9100 -p 9101 apache2 $(hostname -f) <<'EOF'
+#https://httpd.apache.org/docs/2.4/mod/mod_authn_core.html#authtype
+# https://stackoverflow.com/questions/5011102/apache-reverse-proxy-with-basic-authentication
+<Location />
+   AllowOverride None
+   AuthType basic
+   AuthName "Authentication Required"
+   # setup one time, with root:www-data, 640
+   AuthUserFile "/etc/prometheus-htpasswd"
+   Require valid-user
+</Location>
+EOF
+fi
 
 # website setup
 case $HOSTNAME in
@@ -568,43 +609,200 @@ esac
 
 ########### end section including li/lj ###############
 
-pi ${p4[@]} $(apt-cache search ruby[.0-9]+-doc| awk '{print $1}')
 
+case $(debian-codename) in
+  # needed for debootstrap scripts for fai since fai requires debian
+  flidas)
+    curl http://archive.ubuntu.com/ubuntu/project/ubuntu-archive-keyring.gpg | s apt-key add -
+    s dd of=/etc/apt/preferences.d/flidas-xenial <<EOF
+Package: *
+Pin: release a=xenial
+Pin-Priority: -100
+
+Package: *
+Pin: release a=xenial-updates
+Pin-Priority: -100
 
-case $distro in
-  trisquel|ubuntu)
-    l="deb http://ppa.launchpad.net/ansible/ansible/ubuntu xenial main"
-    f=/etc/apt/sources.list.d/ansible-ubuntu-ansible-xenial.list
-    if ! grep -qF "$l" $f; then
-      s add-apt-repository -y ppa:ansible/ansible
+Package: *
+Pin: release a=xenial-security
+Pin-Priority: -100
+EOF
+    s dd of=/etc/apt/sources.list.d/xenial.list 2>/dev/null <<EOF
+deb http://us.archive.ubuntu.com/ubuntu/ xenial main
+deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates main
+deb http://us.archive.ubuntu.com/ubuntu/ xenial-security main
+EOF
+
+    s apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
+    s dd of=/etc/apt/preferences.d/flidas-bionic <<EOF
+Package: *
+Pin: release a=bionic
+Pin-Priority: -100
+
+Package: *
+Pin: release a=bionic-updates
+Pin-Priority: -100
+
+Package: *
+Pin: release a=bionic-security
+Pin-Priority: -100
+EOF
+
+    # better to run btrfs-progs which matches our kernel version
+    # (note, renamed from btrfs-tools)
+    s dd of=/etc/apt/preferences.d/btrfs-progs <<EOF
+Package: btrfs-progs libzstd1
+Pin: release a=bionic
+Pin-Priority: 1005
+
+Package: btrfs-progs libzstd1
+Pin: release a=bionic-updates
+Pin-Priority: 1005
+
+Package: btrfs-progs libzstd1
+Pin: release a=bionic-security
+Pin-Priority: 1005
+EOF
+
+
+    t=$(mktemp)
+    cat >$t <<EOF
+deb http://us.archive.ubuntu.com/ubuntu/ bionic main
+deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates main
+deb http://us.archive.ubuntu.com/ubuntu/ bionic-security main
+EOF
+    f=/etc/apt/sources.list.d/bionic.list
+    if ! diff -q $t $f; then
+      s cp $t $f
+      s chmod 644 $f
       p update
     fi
-    s pip install --upgrade pip
-    # newer 2.7 versions have a bug that incorrectly detects trisquel version. fixed once 2.8 arrives
-    # in 2019
-    pip install --user ansible=2.7.4
-    #pi ansible
-    ;;
-esac
 
+    # no special reason, but its better for btrfs-progs to
+    # be closer to our kernel version
+    pi btrfs-progs
 
+    t=$(mktemp -d)
+    cd $t
+    aptitude download debootstrap/xenial
+    ex ./*
+    s cp ./usr/share/debootstrap/scripts/* /usr/share/debootstrap/scripts
 
+    s dd of=/etc/apt/preferences.d/flidas-etiona <<EOF
+Package: *
+Pin: release a=etiona
+Pin-Priority: -100
 
-case $distro in
-  debian)
-    pi chromium ;;
-  trisquel|ubuntu)
-    wget -qO - https://downloads.iridiumbrowser.de/ubuntu/iridium-release-sign-01.pub|sudo apt-key add -
-    cat <<EOF | sudo tee /etc/apt/sources.list.d/iridium-browser.list
-deb [arch=amd64] https://downloads.iridiumbrowser.de/deb/ stable main
-#deb-src https://downloads.iridiumbrowser.de/deb/ stable main
+Package: *
+Pin: release a=etiona-updates
+Pin-Priority: -100
+
+Package: *
+Pin: release a=etiona-security
+Pin-Priority: -100
+
+Package: *
+Pin: release a=etiona-backports
+Pin-Priority: -100
 EOF
-    p update
-    pi iridium-browser
+
+    t=$(mktemp)
+    cat >$t <<EOF
+deb http://mirror.fsf.org/trisquel/ etiona main
+deb http://mirror.fsf.org/trisquel/ etiona-updates main
+deb http://archive.trisquel.info/trisquel/ etiona-security main
+deb http://mirror.fsf.org/trisquel/ etiona-backports main
+EOF
+    f=/etc/apt/sources.list.d/etiona.list
+    if ! diff -q $t $f; then
+      s cp $t $f
+      s chmod 644 $f
+      p update
+    fi
+
+    s dd of=/etc/apt/preferences.d/debian-goodies <<EOF
+Package: debian-goodies
+Pin: release n=buster
+Pin-Priority: 1005
+EOF
+
+
+    s dd of=/etc/apt/preferences.d/flidas-buster <<EOF
+Package: *
+Pin: release n=buster
+Pin-Priority: -100
+EOF
+
+    # stupid buster uses some key algorithm not supported by flidas gpg that apt uses.
+    s dd of=/etc/apt/apt.conf.d/01iank <<'EOF'
+Acquire::AllowInsecureRepositories "true";
+EOF
+
+    t=$(mktemp)
+    cat >$t <<EOF
+deb http://http.us.debian.org/debian buster main
+deb-src http://http.us.debian.org/debian buster main
+
+deb http://security.debian.org/ buster/updates main
+deb-src http://security.debian.org/ buster/updates main
+
+deb http://http.us.debian.org/debian buster-updates main
+deb-src http://http.us.debian.org/debian buster-updates main
+EOF
+    f=/etc/apt/sources.list.d/buster.list
+    if ! diff -q $t $f; then
+      s cp $t $f
+      s chmod 644 $f
+      p update
+    fi
+
+    # newer version needed for false positive in checkrestart
+    p install -y --allow-unauthenticated debian-goodies
+
     ;;
 esac
 
 
+# TODO: some of the X programs can be removed from pall when using wayland
+
+# depends gcc is a way to install suggests. this is apparently the only
+# way to install suggests even if the main package is already
+# installed. reinstall doesn't work, uninstalling can cause removing
+# dependent packages.
+pi ${pall[@]} $(apt-cache search ruby[.0-9]+-doc| awk '{print $1}') $(apt-cache depends gcc|grep -i suggests:| awk '{print $2}') $($src/distro-pkgs)
+
+if ! type pip; then
+  x=$(mktemp)
+  wget -O$x https://bootstrap.pypa.io/get-pip.py
+  python3 $x --user
+fi
+
+sgo fsf-vpn-dns-cleanup
+
+
+# website is dead june 14 2019
+s rm -f /etc/apt/sources.list.d/iridium-browser.list
+# case $distro in
+#   debian)
+#     pi chromium ;;
+#   trisquel|ubuntu)
+#     wget -qO - https://downloads.iridiumbrowser.de/ubuntu/iridium-release-sign-01.pub|sudo apt-key add -
+#     t=$(mktemp)
+#     cat >$t <<EOF
+# deb [arch=amd64] https://downloads.iridiumbrowser.de/deb/ stable main
+# #deb-src https://downloads.iridiumbrowser.de/deb/ stable main
+# EOF
+#     f=/etc/apt/sources.list.d/iridium-browser.list
+#     if ! diff -q $t $f; then
+#       s cp $t $f
+#       s chmod 644 $f
+#       p update
+#     fi
+#     pi iridium-browser
+#     ;;
+# esac
+
+
 ### begin home vpn server setup
 
 
@@ -705,12 +903,45 @@ fi
 #########  end  pump.io periodic backup #############
 
 
+######### begin irc periodic backup #############
+if [[ $HOSTNAME == frodo ]]; then
+  s dd of=/etc/systemd/system/ircbackup.service <<'EOF'
+[Unit]
+Description=irc li backup
+After=multi-user.target
+
+[Service]
+User=iank
+Type=oneshot
+ExecStart=/a/bin/log-quiet/sysd-mail-once irc-backup rsync -rlptDhSAX --delete root@iankelling.org:/var/lib/znc/moddata/log/iank/freenode/ /k/irclogs
+EOF
+  s dd of=/etc/systemd/system/ircbackup.timer <<'EOF'
+[Unit]
+Description=irc li backup hourly
+
+[Timer]
+OnCalendar=hourly
+
+[Install]
+WantedBy=timers.target
+EOF
+  s systemctl daemon-reload
+  sgo ircbackup.timer
+fi
+
+
+######### end irc periodic backup #############
+
+
+# https://github.com/jlebon/textern
+cd /a/opt/textern
+make native-install USER=1
+
 case $distro in
   debian|trisquel|ubuntu)
-    # suggests because we want the resolvconf package. however, i install it earlier
-    # as well, so this is redundant.
+    # suggests resolvconf package. installing it here is redundant, but make sure anyways.
     # todo: check other distros to make sure it\'s installed
-    pi-nostart --install-suggests openvpn
+    pi-nostart openvpn resolvconf
     # pi-nostart does not disable
     ser disable openvpn
     ;;
@@ -814,8 +1045,8 @@ fi
 # sakura config is owned by ian
 reset-sakura
 reset-konsole
-sudo -u traci -i reset-konsole
-# traci xscreensaver we don't want to reset
+sudo -u user2 -i reset-konsole
+# user2 xscreensaver we don't want to reset
 reset-xscreensaver
 
 
@@ -900,40 +1131,6 @@ case $distro in
   # others unknown
 esac
 
-case $(debian-codename) in
-  # needed for debootstrap scripts for fai since fai requires debian
-  flidas)
-    s dd of=/etc/apt/preferences.d/flidas-xenial <<EOF
-Package: *
-Pin: release a=xenial
-Pin-Priority: -100
-
-Package: *
-Pin: release a=xenial-updates
-Pin-Priority: -100
-
-Package: *
-Pin: release a=xenial-security
-Pin-Priority: -100
-EOF
-    s dd of=/etc/apt/sources.list.d/xenial.list 2>/dev/null <<EOF
-deb http://us.archive.ubuntu.com/ubuntu/ xenial main
-deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates main
-deb http://us.archive.ubuntu.com/ubuntu/ xenial-security main
-EOF
-    curl http://archive.ubuntu.com/ubuntu/project/ubuntu-archive-keyring.gpg | s apt-key add -
-    p update
-
-    t=$(mktemp -d)
-    cd $t
-    aptitude download debootstrap
-    ex *
-    ex data.tar.gz
-    s cp ./usr/share/debootstrap/scripts/* /usr/share/debootstrap/scripts
-
-    ;;
-esac
-
 # /run and /dev/shm are listed as required for pulseaudio. All 4 in the group
 # listed in the default config as suggested.
 # /run/usr/1000 i noticed was missing for pulseaudio
@@ -961,6 +1158,10 @@ mkschroot() {
   esac
   n=$1
   shift
+  if schroot -l | grep -xFq chroot:$n; then
+    echo "$0: $n schroot already installed, skipping"
+    return 0
+  fi
   apps=($@)
   d=/nocow/schroot/$n
   s dd of=/etc/schroot/chroot.d/$n.conf <<EOF
@@ -970,7 +1171,7 @@ type=directory
 directory=$d
 profile=desktop
 preserve-environment=true
-users=$USER,traci
+users=$USER,user2
 EOF
   if [[ -e $d/bin ]]; then
     s chroot $d apt-get update
@@ -1008,22 +1209,54 @@ sgo schrootupdate.timer
 
 
 
-
 # for my roommate
 case $distro in
   trisquel)
     mkschroot debian stretch firefox-esr pulseaudio chromium
     ;;
+  debian)
+    pi chromium
+    ;;
 esac
 
 s mkdir -p /nocow/user
 s chown $USER:$USER /nocow/user
-case $distro in
-  trisquel|ubuntu)
-    pi anki
-    ;;
-  # others unknown
-esac
+pi anki
+
+
+# adapted from /var/lib/dpkg/info/transmission-daemon.postinst
+# 450 seems likely to be unused. we need to specify one or else
+# it won't be stable across installs.
+if ! getent passwd debian-transmission > /dev/null; then
+  s groupadd -g 450 debian-transmission
+  case $distro in
+    arch)
+      s useradd \
+        --system \
+        --create-home \
+        --gid 450 \
+        --uid 450 \
+        --home-dir /var/lib/transmission-daemon \
+        --shell /bin/false \
+        debian-transmission
+      ;;
+    *)
+      s adduser --quiet \
+        --gid 450 \
+        --uid 450 \
+        --system \
+        --no-create-home \
+        --disabled-password \
+        --home /var/lib/transmission-daemon \
+        debian-transmission
+      ;;
+  esac
+fi
+# We want group writable stuff from transmission.
+# However, after setting this, I learn that transmission sets it's
+# own umask based on it's settings file. Well, no harm leaving this
+# so it's set right from the beginning.
+s chfn debian-transmission -o umask=0002
 
 case $distro in
   debian|trisquel|ubuntu)
@@ -1042,6 +1275,9 @@ EOF
 
     # some reason it doesn\'t seem to start automatically anyways
     pi-nostart transmission-daemon
+    # be extra sure its not started
+    ser disable transmission-daemon
+    ser stop transmission-daemon
 
     # the folder was moved here after an install around 02/2017.
     # it contains runtime data,
@@ -1055,7 +1291,7 @@ EOF
     fi
     for f in /i/k/partial-torrents /i/k/torrents; do
       if [[ -e $f ]]; then
-        s chown -R debian-transmission:traci $f
+        s chown -R debian-transmission:user2 $f
       fi
     done
     s chown -R debian-transmission:debian-transmission /var/lib/transmission-daemon
@@ -1089,40 +1325,11 @@ File.write(p, JSON.pretty_generate(JSON.parse(File.read(p)).merge({
 })) + "\n")
 EOF
 
-    # make sure its not enabled, not sure if this is needed
-    ser disable transmission-daemon
     ;;
   # todo: others unknown
 esac
-# adapted from /var/lib/dpkg/info/transmission-daemon.postinst
-if ! getent passwd debian-transmission > /dev/null; then
-  case $distro in
-    arch)
-      s useradd \
-        --system \
-        --create-home \
-        --home-dir /var/lib/transmission-daemon \
-        --shell /bin/false \
-        debian-transmission
-      ;;
-    *)
-      s adduser --quiet \
-        --system \
-        --group \
-        --no-create-home \
-        --disabled-password \
-        --home /var/lib/transmission-daemon \
-        debian-transmission
-      ;;
-  esac
-fi
 
 
-# We want group writable stuff from transmission.
-# However, after setting this, I learn that transmission sets it's
-# own umask based on it's settings file. Well, no harm leaving this
-# so it's set right from the beginning.
-s chfn debian-transmission -o umask=0002
 
 # trisquel 8 = openvpn, debian stretch = openvpn-client
 vpn_ser=openvpn-client
@@ -1185,8 +1392,11 @@ EOF
 
   rpc_pass=$(</p/transmission-rpc-pass)
   for f in /home/*; do
-    d=$f/.config/transmission-remote-gtk
     u=${f##*/}
+    if [[ ! $(id -u $u) -ge 1000 ]]; then
+      continue
+    fi
+    d=$f/.config/transmission-remote-gtk
     s -u $u mkdir -p $d
     s -u $u dd of=$d/config.json <<EOF
 {
@@ -1249,7 +1459,7 @@ esac
 
 
 # allow user to run vms, from debian handbook
-for x in iank traci; do s usermod -a -G libvirt,kvm $x; done
+for x in iank user2; do s usermod -a -G libvirt,kvm $x; done
 # bridge networking as user fails. google lead here, but it doesn\'t work:
 # oh well, I give up.
 # http://wiki.qemu.org/Features-Done/HelperNetworking
@@ -1265,24 +1475,40 @@ for x in iank traci; do s usermod -a -G libvirt,kvm $x; done
 
 case $distro in
   debian|trisquel|ubuntu)
+    if ! type -p go &>/dev/null; then
+      cd $(mktemp -d)
+      # just the latest stable at the time of writing
+      # TODO, maybe put this all into a build script,
+      # and do some automatic updates
+      wget -q https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz
+      s tar -C /usr/local -xzf go1.12.4.linux-amd64.tar.gz
+      rm -f ./*
+    fi
+    go get -u mvdan.cc/fdroidcl
     # a bit of googling, and added settings to bashrc
-    go get -u github.com/mvdan/fdroidcl/cmd/fdroidcl
     ;;
 esac
 
 case $distro in
   arch)
+    pi virt-install
     # otherwise we get error about accessing kvm module.
     # seems like there might be a better way, but google was a bit vague.
     s $sed -ri '/^ *user *=/d' /etc/libvirt/qemu.conf
     echo 'user = "root"' | s tee -a /etc/libvirt/qemu.conf
-    # https://bbs.archlinux.org/viewtopic.php?id=206206
-    # # this should prolly go in the wiki
-    sgo virtlogd.socket
     # guessing this is not needed
     #sgo virtlogd.service
-    sgo libvirtd
+
+    # iank: disabed as im not using libvirt usually
+    # # https://bbs.archlinux.org/viewtopic.php?id=206206
+    # # # this should prolly go in the wiki
+    # sgo virtlogd.socket
+    # sgo libvirtd
+    ;;
+  debian|trisquel|ubuntu)
+    pi-nostart virtinst virt-manager
     ;;
+
 esac
 
 
@@ -1296,7 +1522,7 @@ case $distro in
     ./configure --with-exuberant-ctags=/usr/bin/ctags
     make
     s make install
-    pip install pygments
+    pip install pygments
     ;;
   *)
     pi global
@@ -1311,104 +1537,23 @@ esac
 
 
 
-
-# note this failed running at the beginning of this file,
-# because no systemd user instance was running.
-# Doing systemd --user resulted in
-# Trying to run as user instance, but $XDG_RUNTIME_DIR is not set
-
-if isdebian-testing; then
-  # as of 7/2016, has no unstable deps, and is not in testing anymore.
-  pi synergy/unstable
-else
-  pi synergy
-fi
-
-# case $distro in
-#     # ubuntu unknown. probably the same as debian, just check if the
-#     # init scripts come with the package.
-#     debian)
-#         # copied from arch, but moved to etc
-#         s dd of=/etc/systemd/user/synergys.service <<'EOF'
-# [Unit]
-# Description=Synergy Server Daemon
-# After=network.target
-
-# [Service]
-# User=%i
-# ExecStart=/usr/bin/synergys --no-daemon --config /etc/synergy.conf
-# Restart=on-failure
-
-# [Install]
-# WantedBy=multi-user.target
-# EOF
-#         s dd of=/etc/systemd/user/synergys.socket <<'EOF'
-# [Unit]
-# Conflicts=synergys@.service
-
-# [Socket]
-# ListenStream=24800
-# Accept=false
-
-# [Install]
-# WantedBy=sockets.target
-# EOF
-#         # had this fail with 'Failed to connect to bus: No such file or directory'
-#         # then when I tried it manually, it worked fine...
-#         if ! systemctl --user daemon-reload; then
-#             sleep 2
-#             echo retrying systemd user daemon reload
-#             systemctl --user daemon-reload
-#         fi
-#         ;;&
-#     *)
-#         # taken from arch wiki.
-#         s dd of=/etc/systemd/system/synergyc@.service <<'EOF'
-# [Unit]
-# Description=Synergy Client
-# After=network.target
-
-# [Service]
-# User=%i
-# ExecStart=/usr/bin/synergyc --no-daemon frodo
-# Restart=on-failure
-# # per man systemd.unit, StartLimitInterval, by default we
-# # restart more than 5 times in 10 seconds.
-# # And this param defaults too 200 miliseconds.
-# RestartSec=3s
-
-# [Install]
-# WantedBy=multi-user.target
-# EOF
-#         s systemctl daemon-reload
-#         case $HOSTNAME in
-#             x2|x3|tp)
-#                 ser enable synergyc@iank
-#                 ser start synergyc@iank ||: # X might not be running yet
-#                 ;;
-#             frodo)
-#                 systemctl --user start synergys ||:
-#                 systemctl --user enable synergys
-#                 ;;
-#         esac
-#         ;;
-# esac
+# removed synergy since ive not used it in a long time
 
 
-pi --no-install-recommends kdeconnect-plasma
+pi --no-install-recommends kdeconnect
 ### kdeconnect for gnome. started in /a/bin/distro-setup/desktop-20-autostart.sh
 ### but gnome + xmonad not working in flidas, so i disabled it
-pi libgtk-3-dev python3-requests-oauthlib valac cmake python-nautilus libappindicator3-dev
-cd /a/opt/indicator-kdeconnect
-mkdir -p build
-cd build
-cmake .. -DCMAKE_INSTALL_PREFIX=/usr
-make
-sudo make install
-# we can start it manually with /usr/lib/x86_64-linux-gnu/libexec/kdeconnectd
-# it seems, according to
-# /etc/xdg/autostart/kdeconnectd.desktop
-# I'm not seeing the icon, but the clipboard replication is working
+pi libgtk-3-dev python3-requests-oauthlib valac cmake python-nautilus libappindicator3-dev
+cd /a/opt/indicator-kdeconnect
+mkdir -p build
+cd build
+cmake .. -DCMAKE_INSTALL_PREFIX=/usr
+make
+sudo make install
+# we can start it manually with /usr/lib/x86_64-linux-gnu/libexec/kdeconnectd
+# it seems, according to
+# /etc/xdg/autostart/kdeconnectd.desktop
+# I'm not seeing the icon, but the clipboard replication is working
 
 
 ### model 01 arduino support ###
@@ -1488,6 +1633,9 @@ s fc-cache
 /a/bin/distro-setup/mymimes
 
 
+sgo dynamicipupdate
+
+
 # stop autopoping windows when i plug in an android phone.
 # dbus-launch makes this work within an ssh connection, otherwise you get this message,
 # with still 0 exit code.
@@ -1497,7 +1645,7 @@ dbus-launch gsettings set org.gnome.desktop.media-handling automount-open false
 
 # on grub upgrade, we get prompts unless we do this
 devs=()
-for dev in $(s btrfs fi show /boot | sed -nr 's#.*path\s+(\S+)$#\1#p'); do
+for dev in $(s btrfs fil show /boot | sed -nr 's#.*path\s+(\S+)$#\1#p'); do
   devs+=($(devbyid $dev),)
 done
 devs[-1]=${devs[-1]%,} # jonied by commas
@@ -1514,21 +1662,6 @@ sgo btrfsmaintstop.timer
 s lnf /p/c/machine_specific/li/mw_vars /root
 s lnf /k/backup/wiki_backup /root
 
-s cedit /etc/goaccess.conf <<'EOF' || [[ $? == 1 ]]
-# all things found from looking around the default config
-# copied existing NCSA Combined Log Format with Virtual Host, plus %L
-log-format %^:%^ %h %^[%d:%t %^] "%r" %s %b "%R" "%u" %D
-time-format %H:%M:%S
-date-format %d/%b/%Y
-log-file /var/log/apache2/access.log
-color-scheme 2
-
-# tip: copy access.log files to a stretch host directory, then run
-# jessie's goaccess is too old for some options, and it\'s
-# not easily installed from a testing.
-# goaccess --ignore-crawlers -f <(cat *) -a -o html > x.html
-EOF
-
 
 case $distro in
   trisquel|ubuntu|debian)
@@ -1552,8 +1685,6 @@ EOF
     ;;
 esac
 
-# note, for jessie, it depends on a higher version of btrfs-tools.
-#
 # # disabled due to my patch being in btrbk
 # case $distro in
 #     arch|debian|trisquel|ubuntu) pi btrbk ;;
@@ -1562,13 +1693,9 @@ esac
 cd /a/opt/btrbk
 s make install
 
-# ian: temporarily disabled while hosts are in flux.
-# if [[ $HOSTNAME == tp ]]; then
-#     # backup/sync manually on others hosts for now.
-#     sgo btrbk.timer
-#     # note: to see when it was last run,
-#     # ser list-timers
-# fi
+sgo btrbk.timer
+# note: to see when it was last run,
+# ser list-timers
 
 
 end_msg <<'EOF'
@@ -1590,6 +1717,28 @@ esac
 
 /a/bin/buildscripts/pithosfly
 
+
+# based on guix manual instructions, also added code to profile
+pi nscd
+if ! type -p guix >/dev/null; then
+  cd $(mktemp -d)
+  wget https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh
+  # added some stuff to envonment.sh for profile based on
+  # manual instructions
+  # wget https://sv.gnu.org/people/viewgpg.php?user_id=15145 -qO - | gpg --import -
+  # echo is to get past prompt
+  yes | sudo -E HOME=$HOME bash guix-install.sh || [[ $? == 141 ]]
+  guix install glibc-utf8-locales
+  guix package --install guile
+fi
+
+# install rust.
+curl https://sh.rustup.rs -sSf | bash -s -- -y
+# todo: update this. updates in rust are stupidly complicate
+if ! which rg &>/dev/null; then
+  cargo install ripgrep
+fi
+
 #### tor
 case $distro in
   # based on
@@ -1661,16 +1810,12 @@ make sure to reload the firewall to load the persistent configuration
 
 EOF
     pi nfs-utils
-    sgo nfs-server
     ;;
   debian|trisquel|ubuntu)
-    pi nfs-server
+    pi-nostart nfs-server
     ;;
   arch)
     pi nfs-utils || pending_reboot=true
-    sgo rpcbind
-    # this failed until I rebooted
-    sgo nfs-server
     ;;
 esac