rfa 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #!/bin/sh
  2. # Echo help information
  3. usage()
  4. {
  5. cat <<EOF
  6. Usage: $0 [options] <command> <parameters>
  7. Tool for VCS repository administration.
  8. VCS support: $possible_vcs
  9. Options:
  10. -h, --help
  11. Print help message.
  12. Commands:
  13. add <repository1> [repository2] ...
  14. Create new repository.
  15. del <repository1> [repository2] ...
  16. Delete existing repository.
  17. fixmod <repository1> [repository2] ...
  18. Fix access rights for repository.
  19. useradd <repository> <r/w/rw> <user1> [user2] ...
  20. Set access rights for user(s) to repository.
  21. userdel <repository> <r/w/rw> <user1> [user2] ...
  22. Remove access rights for user(s) to repository.
  23. EOF
  24. }
  25. group_add()
  26. {
  27. groupadd -K GID_MIN=${group_gid_min} ${group_r_prefix}$1
  28. groupadd -K GID_MIN=${group_gid_min} ${group_w_prefix}$1
  29. }
  30. group_del()
  31. {
  32. groupdel ${group_r_prefix}$1
  33. groupdel ${group_w_prefix}$1
  34. }
  35. svn_add()
  36. {
  37. repository_name=$1
  38. repo_r=${repository_root}/${repository_name}
  39. repo_w=${repository_root}/${repository_name}/${repository_name}
  40. mkdir ${repo_r}
  41. saved_umask=`umask`
  42. umask 002
  43. svnadmin --fs-type=fsfs create ${repo_w}
  44. umask ${saved_umask}
  45. }
  46. svn_fixmod()
  47. {
  48. repository_name=$1
  49. repo_r=${repository_root}/${repository_name}
  50. repo_w=${repository_root}/${repository_name}/${repository_name}
  51. chmod 750 ${repo_r}
  52. chgrp ${group_r_prefix}${repository_name} ${repo_r}
  53. chgrp -R ${group_w_prefix}${repository_name} ${repo_w}
  54. dirs=`find ${repo_w} -type d`
  55. for dir in $dirs; do
  56. chmod g+s $dir
  57. done
  58. chmod -R g+w ${repo_w}
  59. }
  60. svn_del()
  61. {
  62. rm -Rf ${repository_root}/$1
  63. }
  64. link_add()
  65. {
  66. ln -s ${repository_root}/$1/$1 ${repository_link}/$1
  67. }
  68. link_del()
  69. {
  70. rm -f ${repository_link}/$1
  71. }
  72. repository_add()
  73. {
  74. for rep_name in "$@"; do
  75. group_add $rep_name
  76. svn_add $rep_name
  77. svn_fixmod $rep_name
  78. link_add $rep_name
  79. done
  80. }
  81. repository_fixmod()
  82. {
  83. for rep_name in "$@"; do
  84. svn_fixmod $rep_name
  85. done
  86. }
  87. repository_del()
  88. {
  89. for rep_name in "$@"; do
  90. link_del $rep_name
  91. svn_del $rep_name
  92. group_del $rep_name
  93. done
  94. }
  95. user_add()
  96. {
  97. w=0
  98. r=0
  99. repository_name=$1
  100. shift
  101. case "$1" in
  102. r)
  103. r=1
  104. ;;
  105. w)
  106. w=1
  107. ;;
  108. rw|wr)
  109. r=1
  110. w=1
  111. ;;
  112. *)
  113. echo "Illegal parameter $1"
  114. exit -1
  115. ;;
  116. esac
  117. shift
  118. for user_name in "$@"; do
  119. if [ $r -ne 0 ]; then
  120. adduser ${user_name} ${group_r_prefix}${repository_name}
  121. fi
  122. if [ $w -ne 0 ]; then
  123. adduser ${user_name} ${group_w_prefix}${repository_name}
  124. fi
  125. done
  126. }
  127. user_del()
  128. {
  129. w=0
  130. r=0
  131. repository_name=$1
  132. shift
  133. case "$1" in
  134. r)
  135. r=1
  136. ;;
  137. w)
  138. w=1
  139. ;;
  140. rw|wr)
  141. r=1
  142. w=1
  143. ;;
  144. *)
  145. echo "Illegal parameter $1"
  146. exit -1
  147. ;;
  148. esac
  149. shift
  150. for user_name in "$@"; do
  151. if [ $r -ne 0 ]; then
  152. deluser ${user_name} ${group_r_prefix}${repository_name}
  153. fi
  154. if [ $w -ne 0 ]; then
  155. deluser ${user_name} ${group_w_prefix}${repository_name}
  156. fi
  157. done
  158. }
  159. #------------------ MAIN -----------------------------------------
  160. possible_vcs="svn git"
  161. # Defaults for rfa.conf
  162. group_gid_min="3000"
  163. group_w_prefix="vcs_w-"
  164. group_r_prefix="vcs_r-"
  165. repository_root=
  166. repository_link=
  167. # Parse command line options
  168. action="help"
  169. opts_force=0
  170. opts_conf="/etc/repoforge/rfa.conf"
  171. opts_vcs="svn"
  172. while test "x$1" != "x"; do
  173. option="$1"
  174. case "$option" in
  175. -h|--help)
  176. usage
  177. exit 0
  178. ;;
  179. -f|--force)
  180. opts_force=1
  181. ;;
  182. # Config file
  183. -c)
  184. shift
  185. opts_conf="$1"
  186. ;;
  187. --config=*)
  188. opts_conf=`echo "$option" | sed 's/--config=//'`
  189. ;;
  190. # Choose VCS
  191. -s)
  192. shift
  193. opts_vcs="$1"
  194. ;;
  195. --vcs=*)
  196. opts_vcs=`echo "$option" | sed 's/--vcs=//'`
  197. ;;
  198. # Default
  199. *)
  200. action="$option"
  201. shift
  202. break
  203. ;;
  204. esac
  205. shift
  206. done
  207. test "x$action" = "xhelp" && { usage; exit 0; }
  208. # Check options
  209. bad_vcs=1
  210. for v in $possible_vcs; do
  211. test "x$opts_vcs" = "x$v" && { bad_vcs=""; break; }
  212. done
  213. test "x$bad_vcs" = "x" || { echo "Error: Illegal VCS \"$opts_vcs\"" 1>&2; exit 1; }
  214. # Include config file
  215. test -r "$opts_conf" && . $opts_conf
  216. # Compatibility (suppose SVN)
  217. test "x$repository_svn_root" = "x" && repository_svn_root="$repository_root"
  218. test "x$repository_svn_link" = "x" && repository_svn_link="$repository_link"
  219. eval repository_root="\$repository_${opts_vcs}_root"
  220. eval repository_link="\$repository_${opts_vcs}_link"
  221. test "x$repository_root" = "x" && { echo "Error: Illegal repository root \"\"" 1>&2; exit 1; }
  222. test "x$repository_link" = "x" && { echo "Error: Illegal repository link \"\"" 1>&2; exit 1; }
  223. test -d "$repository_root" || { echo "Error: Illegal repository root \"$repository_root\"" 1>&2; exit 1; }
  224. test -d "$repository_link" || { echo "Error: Illegal repository link \"$repository_link\"" 1>&2; exit 1; }
  225. # Action
  226. case "$action" in
  227. "add")
  228. test $# -lt 1 && { echo "Error: Repository name is expected" 1>&2; exit 1; }
  229. repository_add "$@"
  230. ;;
  231. "fixmod")
  232. test $# -lt 1 && { echo "Error: Repository name is expected" 1>&2; exit 1; }
  233. repository_fixmod "$@"
  234. ;;
  235. "del")
  236. test $# -lt 1 && { echo "Error: Repository name is expected" 1>&2; exit 1; }
  237. repository_del "$@"
  238. ;;
  239. "adduser"|"useradd")
  240. test $# -lt 3 && { echo "Error: Not enough parameters" 1>&2; exit 1; }
  241. user_add "$@"
  242. ;;
  243. "deluser"|"userdel")
  244. test $# -lt 3 && { echo "Error: Not enough parameters" 1>&2; exit 1; }
  245. user_del "$@"
  246. ;;
  247. *)
  248. echo "Error: Unknown command" 1>&2
  249. exit 1
  250. ;;
  251. esac
  252. exit 0