#!/bin/bash # Config file name rfa_conf=/etc/repoforge/rfa.conf # Defaults for rfa.conf group_gid_min=3000 group_w_prefix=svn_w- group_r_prefix=svn_r- repository_root= repository_link= # Options opts_force=0 todo="" # Echo help information usage() { echo "Usage: "`basename $0`" [options] " echo "Tool for VCS repository administration. Now supports" \ "Subversion only." printf "Options:\n" printf "\t-h, --help\n" printf "\t\tPrint help message.\n" printf "Commands:\n" printf "\tadd [repository2] ...\n" printf "\t\tCreate new repository.\n" printf "\tdel [repository2] ...\n" printf "\t\tDelete existing repository.\n" printf "\tfixmod [repository2] ...\n" printf "\t\tFix access rights for repository.\n" printf "\tuseradd [user2] ...\n" printf "\t\tSet access rights for user(s) to repository.\n" printf "\tuserdel [user2] ...\n" printf "\t\tRemove access rights for user(s) to repository.\n" } 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 } # Parse command line options cmd_options=$(getopt -o "+hfl:" -l help,force,level -- "$@") if test "$?" != 0; then usage exit 1 fi eval set -- ${cmd_options} while test "$1" != "--"; do case "$1" in -h|--help) usage exit 0 ;; -f|--force) opts_force=1 ;; -l|--level) shift level=$1 ;; *) ;; esac shift done shift . $rfa_conf if [ $# -lt 1 ]; then echo "Command is expected" exit -1 fi case "$1" in "help") usage exit 0 ;; "add") if [ $# -lt 2 ]; then echo "Repository name is expected" exit -1 fi shift repository_add "$@" ;; "fixmod") if [ $# -lt 2 ]; then echo "Repository name is expected" exit -1 fi shift repository_fixmod "$@" ;; "del") if [ $# -lt 2 ]; then echo "Repository name is expected" exit -1 fi shift repository_del "$@" ;; "adduser"|"useradd") if [ $# -lt 4 ]; then echo "Not enought parameters" exit -1 fi shift user_add "$@" ;; "deluser"|"userdel") if [ $# -lt 4 ]; then echo "Not enought parameters" exit -1 fi shift user_del "$@" ;; *) echo "Unknown command" exit -1 ;; esac exit 0