#!/bin/zsh setopt no_unset extended_glob warn_create_global typeset -g DSTROOT CONTAINER_NAME REPO_ROOT set -x DSTROOT=$1 CONTAINER_NAME=$2 REPO_ROOT=${0:P:h:h} die() { printf >&2 "FATAL: %s\n" "$@" exit 1 } ensure-container-started() { [[ $1 == */* ]] && die "Invalid container name: ${(qqq)1}" s6-svc -wU -T 4000 -o /run/service/container.$1 } to-current-inbox() { local from_container=$1 shift ensure-container-started $from_container link-to-container-inbox $from_container $CONTAINER_NAME.$USER "$@" || exit $? } # Copy over the versioned filesystem image copy-skel() { local skel dst [[ -d $REPO_ROOT/$1 ]] || die "skel dir $REPO_ROOT/$1 does not exist" s6-hiercopy $REPO_ROOT/$1/homedir $DSTROOT/home/$USER || exit $? for skel in $REPO_ROOT/$1/*/*(DN); do [[ ${skel:h:t} == homedir ]] && continue dst=$DSTROOT/${skel:h:t}/${skel:t} s6-hiercopy $skel $dst || exit $? done } setup-sndio() { local sndio_container=sndiod.$USER local sndio_dir=$DSTROOT/run/inbox/$sndio_container/tmp/sndio-$UID s6-svc -wU -T 4000 -o /run/service/container.$sndio_container || exit $? mkdir -p $sndio_dir || exit $? ln -fv /run/containers/$sndio_container/tmp/sndio-$UID/sock0 $sndio_dir/ || exit $? #ln -fv /run/containers/$sndio_container/tmp/sndio-$UID/sock{0,1} $sndio_dir/ || exit $? ln -sfv ../run/inbox/$sndio_container/tmp/sndio-$UID $DSTROOT/tmp || exit $? } setup-gpg-agent() { to-current-inbox gpg.$USER run/gnupg/gpg-agent.sock } setup-gpg-ssh-agent() { to-current-inbox gpg.$USER run/gnupg/gpg-agent-ssh.sock } setup-urxvt() { local sock session for sock in /run/containers/xsession.*.$USER/run/exec/urxvt(N); do session=${sock:h:h:h:t} link-to-container-inbox $session $CONTAINER_NAME.$USER run/exec/urxvt || exit $? done } setup-pass-show() { local -a svc_names local s svc_names=( "${@//\//!}" ) for s in $svc_names; do to-current-inbox pass.$USER run/pass/show/$s || exit $? done } setup-ssh-exec() { to-current-inbox ssh.$USER run/ssh-exec/$^@ || exit $? } setup-rcm-ssh-exec() { to-current-inbox rcm-ssh.$USER run/ssh-exec/$^@ || exit $? } main() { if ! [[ -d $DSTROOT ]]; then echo >&2 "Destination root not a directory: $DSTROOT" exit 2 fi local -a git_mirrors=( # codeberg.org git.busybox.net git.code.sf.net git.kernel.org git.skarnet.org # git.sr.ht # git.vuxu.org # gitea.blesmrt.net github.com gitlab.alpinelinux.org gitlab.com ) setup-urxvt case $CONTAINER_NAME in (xpra) copy-skel xpra-skel ;; (ssh|rcm-ssh) setup-gpg-ssh-agent ;; (pass) setup-gpg-agent ;; (ff-*-audio|mpd|mpv) setup-sndio ;; (alpine-recombee) setup-gpg-agent setup-gpg-ssh-agent ;; (mail-net) setup-pass-show smtp:/te2000.cz/ccx smtp:/disroot.org/ccx ;; (rcm-mail-net) setup-pass-show mailto:/recombee.com/jan.pobrislo ;; (mail|rcm-mail) to-current-inbox $CONTAINER_NAME-net.$USER run/exec/sync-mail setup-gpg-agent ;; (profanity) setup-pass-show xmpp:/blesmrt.net/ccx ;; (weechat) setup-pass-show weechat/P14s-gen2 ;; (bzr) setup-ssh-exec ccx@eva ccx@saturnin ccx@www_te2000 root@masterozo root@masterozo2 ;; (git) setup-ssh-exec ccx@eva ccx@saturnin ccx@www_te2000 setup-rcm-ssh-exec git@git.recombee.net to-current-inbox tinyproxy.$USER run/http_proxy/git-forges ;; (socials) to-current-inbox tor.$USER run/tor/socks ;; (pthbs-dev) to-current-inbox tinyproxy.$USER run/http_proxy/pthbs to-current-inbox git.$USER run/git/ro.$^git_mirrors run/git/rw.pthbs ;; (x11-dev) to-current-inbox tinyproxy.$USER run/http_proxy/pypi to-current-inbox git.$USER run/git/ro.github.com ;; (ssrn-master-dev) to-current-inbox tinyproxy.$USER run/http_proxy/pypi ;; (rcm-postgresql-dev) to-current-inbox git.$USER run/git/rw.git.recombee.net ;; (notes) to-current-inbox git.$USER run/git/rw.notes ;; esac case $CONTAINER_NAME in (ff-*) if [[ -d $HOME/chome/$CONTAINER_NAME/. && ! -d $HOME/chome/$CONTAINER_NAME/.mozilla/firefox/default ]]; then rsync -avi $HOME/chome/ff-template/.mozilla $HOME/chome/$CONTAINER_NAME/ || exec $? fi ;; esac return 0 } main