Guest User

Untitled

a guest
Apr 4th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.21 KB | None | 0 0
  1. #!/bin/bash
  2. VIRTUAL_USERS_DIR=${VIRTUAL_USERS_DIR:-/ftp_users}
  3. DISKS_DIR=${DISKS_DIR:-/ftp_disks}
  4. ROOT_DIR=${ROOT_DIR:-/ftp_mountpoints}
  5. USER_QUOTA=${USER_QUOTA:-100MB}
  6.  
  7. DEFAULT_FTP_USER_ID=${DEFAULT_FTP_USER_ID:-14}
  8. DEFAULT_FTP_GROUP_ID=${DEFAULT_FTP_GROUP_ID:-50}
  9. CHMOD=${CHMOD:-0777}
  10.  
  11.  
  12. OWN_USER=$(id -u ftp 2>/dev/null)
  13. OWN_GROUP=$(id -g ftp 2>/dev/null)
  14. OWN_USER=${OWN_USER:-$DEFAULT_FTP_USER_ID}
  15. OWN_GROUP=${OWN_GROUP:-$DEFAULT_FTP_GROUP_ID}
  16.  
  17.  
  18. VUSER_TXT="${VIRTUAL_USERS_DIR}/virtual_users.txt"
  19. VUSER_DB="${VIRTUAL_USERS_DIR}/virtual_users.db"
  20.  
  21. function vsftpduser_add()
  22. {
  23. USER=$1
  24. PASSWORD=$2
  25.  
  26. if [ "$USER" == "" ]; then
  27. echo "error: missing user parameter"
  28. exit 1
  29. fi
  30.  
  31. if [ "$PASSWORD" == "" ]; then
  32. echo "error: password can not be empty"
  33. exit 1
  34. fi
  35.  
  36. find_user $USER
  37. if [ $? = 0 ]; then
  38. echo "adding $USER to virtual users registry"
  39. echo -e "${USER}\n${PASSWORD}" >> $VUSER_TXT
  40. make_db
  41. else
  42. echo "user: $USER already exists in registry"
  43. fi
  44.  
  45. make_user_disk $USER
  46. make_user_dir $USER
  47. mount_user_disk $USER
  48. echo "new user $USER created"
  49. }
  50.  
  51. function vsftpduser_del()
  52. {
  53. USER=$1
  54.  
  55. if [ "$USER" == "" ]; then
  56. echo "error: missing user parameter"
  57. exit 1
  58. fi
  59.  
  60.  
  61. find_user $USER
  62. if [ $? = 1 ]
  63. then
  64. echo "removing $USER from virtual users registry"
  65. sed -i '/\<'$USER'\>/{N;d}' $VUSER_TXT > /dev/null
  66. make_db
  67. else
  68. echo "user: $USER does not exists in registry"
  69. fi
  70.  
  71. remove_user_storage $USER
  72. }
  73.  
  74. function vsftpduser_passwd()
  75. {
  76. USER=$1
  77. PASSWORD=$2
  78.  
  79. if [ "$USER" == "" ]; then
  80. echo "error: missing user parameter"
  81. exit 1
  82. fi
  83.  
  84. if [ "$PASSWORD" == "" ]; then
  85. echo "error: password can not be empty"
  86. exit 1
  87. fi
  88.  
  89. find_user $USER
  90. if [ $? = 1 ]; then
  91. sed -i '/\<'$USER'\>/{n;d}' $VUSER_TXT > /dev/null
  92. sed -i '/\<'$USER'\>/a\'$PASSWORD'' $VUSER_TXT > /dev/null
  93. echo "password for user ${USER} has been modified"
  94. make_db
  95. else
  96. echo "user: $USER does not exists in registry"
  97. return 1
  98. fi
  99. }
  100.  
  101. function vsftpduser_ls()
  102. {
  103. echo $(sed -n '1~2p' $VUSER_TXT) | tr " " "\n"
  104. }
  105.  
  106. function vsftpduser_rebuild()
  107. {
  108.  
  109. FORCE="NO"
  110. POSITIONAL=()
  111. while [[ $# -gt 0 ]]
  112. do
  113. key="$1"
  114. case $key in
  115. -f|--force)
  116. FORCE="YES"
  117. shift
  118. ;;
  119. *)
  120. POSITIONAL+=("$1")
  121. shift
  122. ;;
  123. esac
  124. done
  125. set -- "${POSITIONAL[@]}" # restore positional parameters
  126.  
  127. if [ "$1" == "" ]; then
  128. rebuild_all $FORCE $@
  129. else
  130. USER=$1
  131. shift
  132. need_user $USER
  133. rebuild_user $USER $FORCE $@
  134. fi
  135. }
  136.  
  137. function vsftpduser_mount()
  138. {
  139. if [ "$1" == "" ]; then
  140. mount_all $@
  141. else
  142. USER=$1
  143. shift
  144. need_user $USER
  145. mount_user_disk $USER
  146. fi
  147. }
  148.  
  149. function vsftpduser_umount()
  150. {
  151. if [ "$1" == "" ]; then
  152. umount_all $@
  153. else
  154. USER=$1
  155. shift
  156. need_user $USER
  157. umount_user_disk $USER
  158. fi
  159. }
  160.  
  161. function vsftpduser_remount()
  162. {
  163. vsftpduser_umount $@
  164. vsftpduser_mount $@
  165. }
  166.  
  167. function rebuild_user()
  168. {
  169. USER=$1
  170. FORCE=$2
  171. echo "rebuilding user $USER"
  172. if [ "$FORCE" == "YES" ]; then
  173. remove_user_storage $USER
  174. fi
  175. make_user_disk $USER
  176. make_user_dir $USER
  177. mount_user_disk $USER
  178. }
  179. function rebuild_all()
  180. {
  181. FORCE=$1
  182. USER_LIST_ARRAY=($(sed -n '1~2p' $VUSER_TXT))
  183. for USER in "${USER_LIST_ARRAY[@]}" ; do
  184. rebuild_user $USER $FORCE
  185. done
  186. }
  187.  
  188. function mount_all()
  189. {
  190. USER_LIST_ARRAY=($(sed -n '1~2p' $VUSER_TXT))
  191. for USER in "${USER_LIST_ARRAY[@]}" ; do
  192. mount_user_disk $USER
  193. done
  194. }
  195.  
  196. function umount_all()
  197. {
  198. USER_LIST_ARRAY=($(sed -n '1~2p' $VUSER_TXT))
  199. for USER in "${USER_LIST_ARRAY[@]}" ; do
  200. umount_user_disk $USER
  201. done
  202. }
  203.  
  204. function need_user(){
  205. USER=$1
  206. find_user $USER
  207. if [ $? = 0 ]; then
  208. echo "user: $USER does not exists in registry"
  209. exit 1
  210. fi
  211. }
  212.  
  213. function find_user()
  214. {
  215. if [ -f $VUSER_TXT ];then
  216. ACCOUNTDB_TOTALLINES=`grep '.' -c $VUSER_TXT`
  217. else
  218. ACCOUNTDB_TOTALLINES=0
  219. fi
  220. C=1;
  221. if [ "$ACCOUNTDB_TOTALLINES" != "0" ]; then
  222. while [ $C -lt $ACCOUNTDB_TOTALLINES ]; do
  223. VALIDUSER=`sed -n -e "$C p" $VUSER_TXT`
  224. if [ "$1" == "$VALIDUSER" ];then
  225. USERNAMEOK=1
  226. break;
  227. else
  228. USERNAMEOK=0
  229. fi
  230. let C=$C+2;
  231. done
  232. fi
  233. return $USERNAMEOK
  234. }
  235.  
  236. function make_db()
  237. {
  238. db_load -T -t hash -f $VUSER_TXT $VUSER_DB
  239. }
  240.  
  241. function make_user_disk()
  242. {
  243. USER=$1
  244. USER_DISK="${DISKS_DIR}/${USER}.ext3"
  245. if [ ! -f "$USER_DISK" ]
  246. then
  247. echo "creating ${USER_DISK}"
  248. touch "${USER_DISK}"
  249. dd if=/dev/zero of="${USER_DISK}" bs="${USER_QUOTA}" count=1
  250. /sbin/mkfs --type=ext3 -F "${USER_DISK}"
  251. else
  252. echo "disk allready exists ${USER_DISK}"
  253. fi
  254. }
  255. function make_user_dir()
  256. {
  257. USER_DIR="$ROOT_DIR/$1"
  258. if [ ! -d "$USER_DIR" ]
  259. then
  260. echo "creating ${USER_DIR}"
  261. mkdir -p "${USER_DIR}"
  262. chown $OWN_USER:$OWN_GROUP "${USER_DIR}"
  263. chmod $CHMOD "${USER_DIR}"
  264. else
  265. echo "directory already exists ${USER_DIR}"
  266. fi
  267. }
  268. function mount_user_disk()
  269. {
  270. USER=$1
  271. USER_DISK="${DISKS_DIR}/${USER}.ext3"
  272. USER_DIR="$ROOT_DIR/$1"
  273. if mount | grep $USER_DIR > /dev/null; then
  274. echo "mountpoint allready mounted ${USER_DIR}"
  275. elif [ ! -f "$USER_DISK" ]; then
  276. echo "missing disk file ${USER_DISK} for user ${USER}"
  277. else
  278. echo "mounting ${USER_DISK} in ${USER_DIR}"
  279. mount -o loop,rw "${USER_DISK}" "${USER_DIR}"
  280. chmod $CHMOD "${USER_DIR}"
  281. if [ -d "${USER_DIR}/lost+found" ]; then
  282. if [ -z "$(ls -A ${USER_DIR}/lost+found)" ]; then
  283. rm -r "${USER_DIR}/lost+found"
  284. fi
  285. fi
  286. fi
  287. }
  288.  
  289. function remove_user_storage()
  290. {
  291. USER=$1
  292. USER_DIR="${ROOT_DIR}/${USER}"
  293. USER_DISK="${DISKS_DIR}/${USER}.ext3"
  294. umount_user_disk $USER
  295.  
  296. if [ -d "$USER_DIR" ]; then
  297. echo "removing $USER_DIR"
  298. rm -r "$USER_DIR"
  299. fi
  300.  
  301. if [ -f "$USER_DISK" ]; then
  302. echo "removing $USER_DISK"
  303. unlink "$USER_DISK"
  304. fi
  305. }
  306.  
  307. function umount_user_disk(){
  308. USER=$1
  309. USER_DIR="${ROOT_DIR}/${USER}"
  310. if mount | grep $USER_DIR > /dev/null; then
  311. echo "unmounting $USER_DIR"
  312. umount "$USER_DIR"
  313. fi
  314. }
  315.  
  316. function main()
  317. {
  318. if [ $# -lt 1 ];
  319. then
  320. echo "usage: vsftpduser add | del | passwd | ls | rebuild | mount | umount | remount"
  321. exit 1
  322. fi
  323.  
  324. CMD=$1
  325. shift
  326.  
  327. if [ $CMD = "add" ]; then
  328. vsftpduser_add $@
  329. elif [ $CMD = "del" ]; then
  330. vsftpduser_del $@
  331. elif [ $CMD = "passwd" ]; then
  332. vsftpduser_passwd $@
  333. elif [ $CMD = "ls" ]; then
  334. vsftpduser_ls $@
  335. elif [ $CMD = "rebuild" ]; then
  336. vsftpduser_rebuild $@
  337. elif [ $CMD = "mount" ]; then
  338. vsftpduser_mount $@
  339. elif [ $CMD = "umount" ]; then
  340. vsftpduser_umount $@
  341. elif [ $CMD = "remount" ]; then
  342. vsftpduser_remount $@
  343. else
  344. echo [$CMD] a bad argument.
  345. fi
  346. }
  347.  
  348. main $@
Add Comment
Please, Sign In to add comment