#!/bin/sh # Echo help information usage() { cat < Tool for VCS repository administration. VCS support: $possible_vcs Options: -h, --help Print help message. Commands: add [repository2] ... Create new repository. del [repository2] ... Delete existing repository. fixmod [repository2] ... Fix access rights for repository. useradd [user2] ... Set access rights for user(s) to repository. userdel [user2] ... Remove access rights for user(s) to repository. EOF } group_add() { groupadd -K GID_MIN=${group_gid_min} ${group_r_prefix}$1 groupadd -K GID_MIN=${group_gid_min} ${group_w_prefix}$1 } group_del() { groupdel ${group_r_prefix}$1 groupdel ${group_w_prefix}$1 } svn_add() { repository_name=$1 repo_r=${repository_root}/${repository_name} repo_w=${repository_root}/${repository_name}/${repository_name} mkdir ${repo_r} saved_umask=`umask` umask 002 svnadmin --fs-type=fsfs create ${repo_w} umask ${saved_umask} } svn_fixmod() { repository_name=$1 repo_r=${repository_root}/${repository_name} repo_w=${repository_root}/${repository_name}/${repository_name} chmod 750 ${repo_r} chgrp ${group_r_prefix}${repository_name} ${repo_r} chgrp -R ${group_w_prefix}${repository_name} ${repo_w} dirs=`find ${repo_w} -type d` for dir in $dirs; do chmod g+s $dir done chmod -R g+w ${repo_w} } svn_del() { rm -Rf ${repository_root}/$1 } link_add() { ln -s ${repository_root}/$1/$1 ${repository_link}/$1 } link_del() { rm -f ${repository_link}/$1 } repository_add() { for rep_name in "$@"; do group_add $rep_name svn_add $rep_name svn_fixmod $rep_name link_add $rep_name done } repository_fixmod() { for rep_name in "$@"; do svn_fixmod $rep_name done } repository_del() { for rep_name in "$@"; do link_del $rep_name svn_del $rep_name group_del $rep_name done } user_add() { w=0 r=0 repository_name=$1 shift case "$1" in r) r=1 ;; w) w=1 ;; rw|wr) r=1 w=1 ;; *) echo "Illegal parameter $1" exit -1 ;; esac shift for user_name in "$@"; do if [ $r -ne 0 ]; then adduser ${user_name} ${group_r_prefix}${repository_name} fi if [ $w -ne 0 ]; then adduser ${user_name} ${group_w_prefix}${repository_name} fi done } user_del() { w=0 r=0 repository_name=$1 shift case "$1" in r) r=1 ;; w) w=1 ;; rw|wr) r=1 w=1 ;; *) echo "Illegal parameter $1" exit -1 ;; esac shift for user_name in "$@"; do if [ $r -ne 0 ]; then deluser ${user_name} ${group_r_prefix}${repository_name} fi if [ $w -ne 0 ]; then deluser ${user_name} ${group_w_prefix}${repository_name} fi done } #------------------ MAIN ----------------------------------------- possible_vcs="svn git" # Defaults for rfa.conf group_gid_min="3000" group_w_prefix="vcs_w-" group_r_prefix="vcs_r-" repository_root= repository_link= # Parse command line options action="help" opts_force=0 opts_conf="/etc/repoforge/rfa.conf" opts_vcs="svn" while test "x$1" != "x"; do option="$1" case "$option" in -h|--help) usage exit 0 ;; -f|--force) opts_force=1 ;; # Config file -c) shift opts_conf="$1" ;; --config=*) opts_conf=`echo "$option" | sed 's/--config=//'` ;; # Choose VCS -s) shift opts_vcs="$1" ;; --vcs=*) opts_vcs=`echo "$option" | sed 's/--vcs=//'` ;; # Default *) action="$option" shift break ;; esac shift done test "x$action" = "xhelp" && { usage; exit 0; } # Check options bad_vcs=1 for v in $possible_vcs; do test "x$opts_vcs" = "x$v" && { bad_vcs=""; break; } done test "x$bad_vcs" = "x" || { echo "Error: Illegal VCS \"$opts_vcs\"" 1>&2; exit 1; } # Include config file test -r "$opts_conf" && . $opts_conf # Compatibility (suppose SVN) test "x$repository_svn_root" = "x" && repository_svn_root="$repository_root" test "x$repository_svn_link" = "x" && repository_svn_link="$repository_link" eval repository_root="\$repository_${opts_vcs}_root" eval repository_link="\$repository_${opts_vcs}_link" test "x$repository_root" = "x" && { echo "Error: Illegal repository root \"\"" 1>&2; exit 1; } test "x$repository_link" = "x" && { echo "Error: Illegal repository link \"\"" 1>&2; exit 1; } test -d "$repository_root" || { echo "Error: Illegal repository root \"$repository_root\"" 1>&2; exit 1; } test -d "$repository_link" || { echo "Error: Illegal repository link \"$repository_link\"" 1>&2; exit 1; } # Action case "$action" in "add") test $# -lt 1 && { echo "Error: Repository name is expected" 1>&2; exit 1; } repository_add "$@" ;; "fixmod") test $# -lt 1 && { echo "Error: Repository name is expected" 1>&2; exit 1; } repository_fixmod "$@" ;; "del") test $# -lt 1 && { echo "Error: Repository name is expected" 1>&2; exit 1; } repository_del "$@" ;; "adduser"|"useradd") test $# -lt 3 && { echo "Error: Not enough parameters" 1>&2; exit 1; } user_add "$@" ;; "deluser"|"userdel") test $# -lt 3 && { echo "Error: Not enough parameters" 1>&2; exit 1; } user_del "$@" ;; *) echo "Error: Unknown command" 1>&2 exit 1 ;; esac exit 0