rfa 7.8 KB

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