#!/bin/zsh setopt no_unset extended_glob warn_create_global # helpers die() { printf >&2 '%s\n' "$@" exit 1 } ensure-container-started() { [[ $1 == */* ]] && die "Invalid container name: ${(qqq)1}" s6-svc -wU -T 4000 -o /run/service/container.$1 || die "failed to start container ${(qqq)1}" } cmd_up() { local name for name in "$@"; do ensure-container-started $name done } typeset -f -t cmd_up cmd_down() { local name for name in "$@"; do [[ $name == */* ]] && die "Invalid container name: ${(qqq)name}" s6-svc -wd -T 1000 -d /run/service/container.$name || \ s6-svc -wd -T 1000 -dk /run/service/container.$name done } typeset -f -t cmd_down cmd_link() { local old new relpath [[ $1 == */* ]] && die "Invalid container name: ${(qqq)1}" old=$1 [[ $2 == */* ]] && die "Invalid container name: ${(qqq)2}" new=$2 shift 2 || exit $? for relpath in "$@"; do [[ $relpath == /* ]] && die "Invalid relpath: ${(qqq)relpath}" [[ $PWD/$relpath != ${relpath:a} ]] && die "Invalid relpath: ${(qqq)relpath}" done ensure-container-started $old ensure-container-started $new link-to-container-inbox $old $new "$@" || exit $? } typeset -f -t cmd_link cmd_services() { local -a args local c s while (($#)); do case $1 in (-o) args+=( $1 $2 ) shift 2 || exit $? ;; (-*) args+=( $1 ) shift || exit $? ;; (*) die "non_whitelisted argument: ${(qqq)1}" ;; esac done for c in /run{,/user/$UID}/service/*/supervise/control(pN); do s=${c:h:h} printf '%s\t' $s s6-svstat "$args[@]" $s done } main() { [[ $# -gt 0 ]] || die "xsession-cmd: argument required" local cmd=$1 shift if (($+functions[cmd_$cmd])); then cmd_$cmd "$@" || die "command failed: ${(qqq)cmd}" else die "unknown command: ${(qqq)cmd}" fi } main "$@"