rfa 4.0 KB

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