rfa 8.0 KB

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