#!/bin/sh set -e SKEIN_CGIT_ROOT=${SKEIN_CGIT_ROOT:-/srv/cgit} SKEIN_GIT_ROOT=${SKEIN_GIT_ROOT:-/srv/git} usage() { printf 'usage: skein-infra setup|teardown\n' >&2 exit 1 } log() { printf ' %s %s\n' "$1" "$2" } ladd() { log + "$1" } ldel() { log - "$1" } remove_prefix() { printf "%s" "${1#$SKEIN_CGIT_ROOT/*}" } bind_mount() { mkdir "$2" mount --rbind "$1" "$2" mount --make-rslave "$2" ladd "$(remove_prefix "$2")" } bind_umount() { umount "$1" rmdir "$1" ldel "$(remove_prefix "$1")" } setup() { mkdir "$SKEIN_CGIT_ROOT"/dev mknod "$SKEIN_CGIT_ROOT"/dev/null c 1 3 chmod 666 "$SKEIN_CGIT_ROOT"/dev/null for i in "$SKEIN_CGIT_ROOT"/home/*; do test -d "$i" || continue user=$(basename "$i") id -ru "$user" >/dev/null || continue git_repo_dir="${SKEIN_GIT_ROOT}/$user" test -d "$git_repo_dir" || continue available_repos="$SKEIN_CGIT_ROOT"/home/$user/repos.avail bind_mount "$git_repo_dir" "$available_repos" chmod 0701 "$available_repos" done } teardown() { rm "$SKEIN_CGIT_ROOT"/dev/null rmdir "$SKEIN_CGIT_ROOT"/dev for i in "$SKEIN_CGIT_ROOT"/home/*/repos.avail; do bind_umount "$i" done } test $# -eq 1 || usage case $1 in setup) setup;; teardown) teardown;; *) usage;; esac