123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- #!/bin/sh
- # Echo help information
- usage()
- {
- cat <<EOF
- Usage: $0 [options] <command> <parameters>
- Tool for VCS repository administration.
- VCS support: $possible_vcs
- Options:
- -h, --help
- Print help message.
- Commands:
- add <repository1> [repository2] ...
- Create new repository.
- del <repository1> [repository2] ...
- Delete existing repository.
- fixmod <repository1> [repository2] ...
- Fix access rights for repository.
- useradd <repository> <r/w/rw> <user1> [user2] ...
- Set access rights for user(s) to repository.
- userdel <repository> <r/w/rw> <user1> [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
|