rfa 8.1 KB

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