rfa 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  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" || return 1
  28. groupadd -K GID_MIN=${group_gid_min} "${group_w_prefix}$1" || return 1
  29. }
  30. group_del()
  31. {
  32. groupdel "${group_r_prefix}$1" || return 1
  33. groupdel "${group_w_prefix}$1" || return 1
  34. }
  35. create_repo_svn()
  36. {
  37. svnadmin --fs-type=fsfs create "$1" || return 1
  38. }
  39. create_repo_git()
  40. {
  41. local saved_dir=""
  42. saved_dir=`pwd`
  43. mkdir "$1" || return 1
  44. cd "$1"
  45. git init --bare --shared >/dev/null || return 1
  46. cd "$saved_dir"
  47. }
  48. data_add()
  49. {
  50. local r_name="$1"
  51. local r_root="$2"
  52. local r_link="$3"
  53. local repo_r="${r_root}/${r_name}"
  54. local repo_w="${r_root}/${r_name}/${r_name}"
  55. mkdir -p "${repo_r}"
  56. local saved_umask=`umask`
  57. umask 002
  58. local create_vcs_func="create_repo_$opts_vcs"
  59. $create_vcs_func "$repo_w" || return 1
  60. umask ${saved_umask}
  61. }
  62. data_fixmod()
  63. {
  64. local r_name="$1"
  65. local r_root="$2"
  66. local r_link="$3"
  67. local repo_r="${r_root}/${r_name}"
  68. local repo_w="${r_root}/${r_name}/${r_name}"
  69. chmod 750 "${repo_r}" || return 1
  70. chgrp "${group_r_prefix}${r_name}" "${repo_r}" || return 1
  71. chgrp -R "${group_w_prefix}${r_name}" "${repo_w}" || return 1
  72. local dirs=""
  73. dirs=`find "$repo_w" -type d`
  74. local dir=""
  75. for dir in $dirs; do
  76. chmod g+s "$dir" || return 1
  77. done
  78. chmod -R g+w "${repo_w}" || return 1
  79. }
  80. data_del()
  81. {
  82. local r_name="$1"
  83. local r_root="$2"
  84. rm -Rf "$r_root/$r_name"
  85. }
  86. link_add()
  87. {
  88. local r_name="$1"
  89. local r_root="$2"
  90. local r_link="$3"
  91. ln -sf "$r_root/$r_name/$r_name" "$r_link/$r_name"
  92. }
  93. link_del()
  94. {
  95. local r_name="$1"
  96. local r_link="$2"
  97. rm -f "$r_link/$r_name"
  98. }
  99. repository_add()
  100. {
  101. local rep_name=""
  102. for rep_name in "$@"; do
  103. find_repo "$rep_name"
  104. test "x$repo_root" = "x" || { echo "Error: The repository \"$rep_name\" already exists." 1>&2; exit 1; }
  105. eval repo_root="\$repository_${opts_vcs}_root"
  106. eval repo_link="\$repository_${opts_vcs}_link"
  107. test "x$repo_root" = "x" && { echo "Error: Illegal repository root \"\"" 1>&2; exit 1; }
  108. test "x$repo_link" = "x" && { echo "Error: Illegal repository link \"\"" 1>&2; exit 1; }
  109. test -d "$repo_root" || { echo "Error: Illegal repository root \"$repo_root\"" 1>&2; exit 1; }
  110. test -d "$repo_link" || { echo "Error: Illegal repository link \"$repo_link\"" 1>&2; exit 1; }
  111. group_add "$rep_name" || { echo "Error: Can't add group for repository \"$rep_name\"" 1>&2; exit 1; }
  112. data_add "$rep_name" "$repo_root" "$repo_link" || { echo "Error: Can't add repository \"$rep_name\"" 1>&2; exit 1; }
  113. data_fixmod "$rep_name" "$repo_root" "$repo_link" || { echo "Error: Can't fix mode for repository \"$rep_name\"" 1>&2; exit 1; }
  114. link_add "$rep_name" "$repo_root" "$repo_link" || { echo "Error: Can't add link for repository \"$rep_name\"" 1>&2; exit 1; }
  115. echo "The repository \"$rep_name\" was succesfully created."
  116. done
  117. }
  118. repository_del()
  119. {
  120. local rep_name=""
  121. local sure=""
  122. for rep_name in "$@"; do
  123. find_repo "$rep_name"
  124. test "x$repo_root" = "x" -o "x$repo_link" = "x" && { echo "Error: Can't find repository \"$rep_name\"" 1>&2; exit 1; }
  125. if test "x$opts_force" = "x"; then
  126. read -r -p "Deleting repository \"$rep_name\". Are you sure (y/n)? " sure
  127. test "x$sure" = "xy" -o "x$sure" = "xY" || { echo "The repository \"$rep_name\" will be not deleted."; continue; }
  128. fi
  129. link_del "$rep_name" "$repo_link" || { echo "Error: Can't remove link for repository \"$rep_name\"" 1>&2; exit 1; }
  130. data_del "$rep_name" "$repo_root" || { echo "Error: Can't remove repository \"$rep_name\"" 1>&2; exit 1; }
  131. group_del "$rep_name" || { echo "Error: Can't remove group for repository \"$rep_name\"" 1>&2; exit 1; }
  132. echo "The repository \"$rep_name\" was succesfully deleted."
  133. done
  134. }
  135. repository_fixmod()
  136. {
  137. local rep_name=""
  138. for rep_name in "$@"; do
  139. find_repo "$rep_name"
  140. test "x$repo_root" = "x" -o "x$repo_link" = "x" && { echo "Error: Can't find repository \"$rep_name\"" 1>&2; exit 1; }
  141. data_fixmod "$rep_name" "$repo_root" "$repo_link" || { echo "Error: Can't fix repository's \"$rep_name\" mode" 1>&2; exit 1; }
  142. link_add "$rep_name" "$repo_root" "$repo_link" || { echo "Error: Can't create link for repository \"$rep_name\"" 1>&2; exit 1; }
  143. echo "The repository \"$rep_name\" was succesfully fixed."
  144. done
  145. }
  146. user_add()
  147. {
  148. local w=0
  149. local r=0
  150. local repository_name="$1"
  151. local user_name=""
  152. shift
  153. case "$1" in
  154. r)
  155. r=1
  156. ;;
  157. w)
  158. w=1
  159. ;;
  160. rw|wr)
  161. r=1
  162. w=1
  163. ;;
  164. *)
  165. echo "Error: Illegal parameter \"$1\"" 1>&2
  166. exit 1
  167. ;;
  168. esac
  169. shift
  170. for user_name in "$@"; do
  171. test $r -ne 0 && adduser "${user_name}" "${group_r_prefix}${repository_name}"
  172. test $w -ne 0 && adduser "${user_name}" "${group_w_prefix}${repository_name}"
  173. done
  174. }
  175. user_del()
  176. {
  177. local w=0
  178. local r=0
  179. local repository_name=$1
  180. local user_name=""
  181. shift
  182. case "$1" in
  183. r)
  184. r=1
  185. ;;
  186. w)
  187. w=1
  188. ;;
  189. rw|wr)
  190. r=1
  191. w=1
  192. ;;
  193. *)
  194. echo "Error: Illegal parameter \"$1\"" 1>&2
  195. exit 1
  196. ;;
  197. esac
  198. shift
  199. for user_name in "$@"; do
  200. test $r -ne 0 && deluser "${user_name}" "${group_r_prefix}${repository_name}"
  201. test $w -ne 0 && deluser "${user_name}" "${group_w_prefix}${repository_name}"
  202. done
  203. }
  204. find_repo()
  205. {
  206. local r=""
  207. local r_root=""
  208. repo_root=""
  209. repo_link=""
  210. for r in $possible_vcs; do
  211. eval r_root="\$repository_${r}_root"
  212. test "x$r_root" = "x" && continue
  213. test -d "$r_root/$1" || continue
  214. repo_root="$r_root"
  215. eval repo_link="\$repository_${r}_link"
  216. break
  217. done
  218. return 0
  219. }
  220. #------------------ MAIN -----------------------------------------
  221. possible_vcs="svn git"
  222. # Defaults for rfa.conf
  223. group_gid_min="3000"
  224. group_w_prefix="vcs-w-"
  225. group_r_prefix="vcs-r-"
  226. repository_root=
  227. repository_link=
  228. # Parse command line options
  229. action="help"
  230. opts_force=""
  231. opts_conf="/etc/repoforge/rfa.conf"
  232. opts_vcs="svn"
  233. while test "x$1" != "x"; do
  234. option="$1"
  235. case "$option" in
  236. -h|--help)
  237. usage
  238. exit 0
  239. ;;
  240. -f|--force)
  241. opts_force=1
  242. ;;
  243. # Config file
  244. -c)
  245. shift
  246. opts_conf="$1"
  247. ;;
  248. --config=*)
  249. opts_conf=`echo "$option" | sed 's/--config=//'`
  250. ;;
  251. # Choose VCS
  252. -s)
  253. shift
  254. opts_vcs="$1"
  255. ;;
  256. --vcs=*)
  257. opts_vcs=`echo "$option" | sed 's/--vcs=//'`
  258. ;;
  259. # Default
  260. *)
  261. action="$option"
  262. shift
  263. break
  264. ;;
  265. esac
  266. shift
  267. done
  268. # Early help message
  269. test "x$action" = "xhelp" && { usage; exit 0; }
  270. # Check options
  271. bad_vcs=1
  272. for v in $possible_vcs; do
  273. test "x$opts_vcs" = "x$v" && { bad_vcs=""; break; }
  274. done
  275. test "x$bad_vcs" = "x" || { echo "Error: Illegal VCS \"$opts_vcs\"" 1>&2; exit 1; }
  276. # Include config file
  277. test -r "$opts_conf" && . $opts_conf
  278. # Compatibility (suppose SVN)
  279. test "x$repository_svn_root" = "x" && repository_svn_root="$repository_root"
  280. test "x$repository_svn_link" = "x" && repository_svn_link="$repository_link"
  281. # Action
  282. case "$action" in
  283. "add")
  284. test $# -lt 1 && { echo "Error: Repository name is expected" 1>&2; exit 1; }
  285. repository_add "$@"
  286. ;;
  287. "fixmod")
  288. test $# -lt 1 && { echo "Error: Repository name is expected" 1>&2; exit 1; }
  289. repository_fixmod "$@"
  290. ;;
  291. "del")
  292. test $# -lt 1 && { echo "Error: Repository name is expected" 1>&2; exit 1; }
  293. repository_del "$@"
  294. ;;
  295. "adduser"|"useradd")
  296. test $# -lt 3 && { echo "Error: Not enough parameters" 1>&2; exit 1; }
  297. user_add "$@"
  298. ;;
  299. "deluser"|"userdel")
  300. test $# -lt 3 && { echo "Error: Not enough parameters" 1>&2; exit 1; }
  301. user_del "$@"
  302. ;;
  303. *)
  304. echo "Error: Unknown command" 1>&2
  305. exit 1
  306. ;;
  307. esac
  308. exit $?