#!/usr/bin/env fish # # # function definitions # # set _REPO_PERMISSIONS /etc/repo-permissions set _REPO_REGEX "^((?:\/[a-zA-Z-]+)+.git)\$" function createUser set -l user $argv[1] echo "Setting up user: $user" if [ "$user" = git ] echo "Error: User git is reserved" return 1 end set -l HOME "/home/$user" # user is not restricted, this is done in ssh config with forceCommand # we need to be able to run a fish script to check for permissions adduser --home $HOME -D "$user" # unlock account to allow ssh logins passwd -u "$user" mkdir "$HOME/.ssh" cp "/var/ssh/clients/$user" "$HOME/.ssh/authorized_keys" chown -R $user "$HOME" chmod -R 700 "$HOME" end function setupRepo set -l repoConfig $argv[1] set -l parsedConfig (string split ':' $repoConfig) set -l repo $parsedConfig[1] # check repo name set -l matcher (string match -r -g $_REPO_REGEX $repo) if test -z $matcher[1] echo "Invalid repo name $repo" return 1 end # we assume all repos to be in /srv/repos set -l repoDir srv repos set -l repoDir /(string join -n '/' $repoDir (string split '/' $repo)) echo "Setting up repo: $repo" # write user as allowed into permission file for user in $parsedConfig[2..] echo "$repoDir:$user" >> $_REPO_PERMISSIONS end # setup repo dir if not test -d $repoDir mkdir -p $repoDir git init --bare $repoDir -b trunk end chown -R git:git "$repoDir" chmod -R 700 "$repoDir" end # # # main # # argparse 'g/git-uid=?' 'u/user=+' 'r/repo=+' 'h/help' -- $argv or exit 1; if set -q _flag_h echo "Usage: $(status filename) [ OPTIONS ]..." echo -e "" echo -e "OPTIONS" echo -e "\t -h, --help \t\t Display this page" echo -e "\t -g, --git-uid \t UID of the git user that is used also as ownership for all repos" echo -e "\t -u, --user \t\t Setting up a user" echo -e "\t -r, --repo \t\t Setting up a repo in form [:user1]+ for each user who should have access to it" echo -e "" return end # read environment variables set -l users $_flag_u for user in (set -n | string match -r "^USER_\S+") set users $users (eval echo \$$user) end set -l repos $_flag_r for repo in (set -n | string match -r "^REPO_\S+") set repos $repos (eval echo \$$repo) end # Setup users adduser git -u $GIT_UID -D --shell "/usr/bin/git-shell" for user in $users createUser "$user" end # Setup repos echo > $_REPO_PERMISSIONS for repoConfig in $repos setupRepo "$repoConfig" end echo "Setting up server" # generate host keys in case mkdir -p /var/ssh/host/etc/ssh/ && ssh-keygen -A -f /var/ssh/host # run ssh daemon /usr/sbin/sshd -D -e