v_update_user_backups 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. #!/bin/bash
  2. # info: update user backups
  3. # options: user
  4. #
  5. # The function rescan backup directory and updates backup database.
  6. #----------------------------------------------------------#
  7. # Variable&Function #
  8. #----------------------------------------------------------#
  9. # Importing variables
  10. source $VESTA/conf/vesta.conf
  11. source $VESTA/func/shared.sh
  12. # Argument defenition
  13. user=$1
  14. type="${2-$BACKUP_SYSTEM}"
  15. # Defining tar parser function
  16. get_backup_info() {
  17. backup=$1 # full path to backup
  18. backup_type="$2" # backup type
  19. backup_name=$(basename $backup )
  20. backup_date=$(echo $backup_name |cut -f 2 -d '.' )
  21. backup_time=$(stat --printf=%y $backup |cut -f 2 -d ' ' |cut -f 1 -d '.')
  22. backup_size=$(du -sm $backup |cut -f 1 )
  23. backup_data=$(tar -tf $backup)
  24. # Checking system data
  25. vst_data=$(echo "$backup_data" |grep "^./vesta/" |grep -v "^./vesta/$")
  26. if [ -z "$vst_data" ]; then
  27. vst=''
  28. else
  29. vst='yes'
  30. fi
  31. # Checking pam
  32. pam_data=$(echo "$backup_data" |grep "^./pam/" |grep -v "^./pam/$")
  33. if [ -z "$pam_data" ]; then
  34. pam=''
  35. else
  36. pam='yes'
  37. fi
  38. # Checking web data
  39. web_data=$(echo "$backup_data" |grep "^./web/" |grep -v "^./web/$" |sort)
  40. if [ -z "$web_data" ]; then
  41. web=''
  42. else
  43. i=1
  44. for domain in $web_data; do
  45. domain="$(basename $domain|sed -e 's/.tar.gz$//')"
  46. if [ "$i" -eq 1 ]; then
  47. web="$domain"
  48. i=2
  49. else
  50. web="$web,$domain"
  51. fi
  52. done
  53. fi
  54. # Checking dns data
  55. dns_data=$(echo "$backup_data" |grep "^./dns/" |grep ".db$" |sort)
  56. if [ -z "$dns_data" ]; then
  57. dns=''
  58. else
  59. i=1
  60. for domain in $dns_data; do
  61. domain="$(basename $domain|sed -e 's/.db$//')"
  62. if [ "$i" -eq 1 ]; then
  63. dns="$domain"
  64. i=2
  65. else
  66. dns="$dns,$domain"
  67. fi
  68. done
  69. fi
  70. # Checking mail
  71. mail_data=$(echo "$backup_data"|grep "^./mail/"|grep -v "^./mail/$"|sort)
  72. if [ -z "$mail_data" ]; then
  73. ml=''
  74. else
  75. i=1
  76. for domain in $mail_data; do
  77. domain="$(basename $domain|sed -e 's/.tar.gz$//')"
  78. if [ "$i" -eq 1 ]; then
  79. ml="$domain"
  80. i=2
  81. else
  82. ml="$ml,$domain"
  83. fi
  84. done
  85. fi
  86. # Checking databases
  87. db_data=$(echo "$backup_data"|grep "^./db/"|grep ".sql.gz$"|sort)
  88. if [ -z "$db_data" ]; then
  89. db=''
  90. else
  91. i=1
  92. for dbase in $db_data; do
  93. dbase=$(basename $dbase|sed -e "s/.\(my\|pg\)sql.sql.gz$//")
  94. if [ "$i" -eq 1 ]; then
  95. db="$dbase"
  96. i=2
  97. else
  98. db="$db,$dbase"
  99. fi
  100. done
  101. fi
  102. # Checking certificates
  103. ssl_data=$(echo "$backup_data"|grep "^./ssl/"|grep ".crt$"|sort)
  104. if [ -z "$ssl_data" ]; then
  105. ssl=''
  106. else
  107. i=1
  108. for certificate in $ssl_data; do
  109. certificate="$(basename $certificate|sed -e "s/.crt$//")"
  110. if [ "$i" -eq 1 ]; then
  111. ssl="$certificate"
  112. i=2
  113. else
  114. ssl="$ssl,$certificate"
  115. fi
  116. done
  117. fi
  118. # Checking cron data
  119. cron_data=$(echo "$backup_data" |grep "^./cron/" |grep -v "^./cron/$")
  120. if [ -z "$cron_data" ]; then
  121. cron=''
  122. else
  123. cron='yes'
  124. fi
  125. echo -n "DATE='$backup_date' TIME='$backup_time' RUNTIME='0'"
  126. echo -n " SIZE='$backup_size' TYPE='$backup_type' VESTA='$vst' PAM='$pam'"
  127. echo " WEB='$web' DNS='$dns' MAIL='$ml' DB='$db' SSL='$ssl' CRON='$cron'"
  128. }
  129. # Defining ftp command function
  130. ftpc() {
  131. ftp -n $HOST $PORT <<EOF
  132. quote USER $USERNAME
  133. quote PASS $PASSWORD
  134. binary
  135. cd $BPATH
  136. $1
  137. quit
  138. EOF
  139. }
  140. init_ftp_variables() {
  141. # Checking config
  142. source $VESTA/conf/ftp.backup.conf
  143. if [ -z "$HOST" ] || [ -z "$USERNAME" ] || [ -z "$PASSWORD" ] ||\
  144. [ -z "$BPATH" ]; then
  145. echo "Error: Parsing error"
  146. log_event 'debug' "$E_PARSING $EVENT"
  147. exit $E_PARSING
  148. fi
  149. }
  150. check_ftp_connection(){
  151. # Checking ftp permission
  152. ftmpdir=$(mktemp -u -p $BPATH)
  153. command="mkdir $ftmpdir
  154. ls $ftmpdir
  155. rm $ftmpdir"
  156. if [ ! -z "$(ftpc "$command")" ] ; then
  157. echo "Error: FTP error"
  158. log_event 'debug' "$E_FTP $EVENT"
  159. exit $E_FTP
  160. fi
  161. }
  162. #----------------------------------------------------------#
  163. # Verifications #
  164. #----------------------------------------------------------#
  165. # Checking arg number
  166. check_args '1' "$#" 'user'
  167. # Checking backup system is enabled
  168. is_system_enabled 'BACKUP_SYSTEM'
  169. # Checking argument format
  170. validate_format 'user'
  171. # Checking user
  172. is_object_valid 'user' 'USER' "$user"
  173. # Checking load averages
  174. la=$(cat /proc/loadavg |cut -f 1 -d ' '|cut -f 1 -d '.')
  175. if [ "$la" -ge "$BACKUP_LA_LIMIT" ]; then
  176. log_event 'debug' "$E_LA $EVENT"
  177. exit $E_LA
  178. fi
  179. #----------------------------------------------------------#
  180. # Action #
  181. #----------------------------------------------------------#
  182. # Checking tmp file
  183. tmp_file="$USER_DATA/backup.conf_tmp"
  184. if [ -e "$tmp_file" ]; then
  185. rm -f $tmp_file
  186. fi
  187. # Checking local
  188. if [ "$type" = 'local' ]; then
  189. backups=$(ls $BACKUP |grep "^$user."|sort)
  190. for backup in $backups; do
  191. get_backup_info $BACKUP/$backup $type >> $tmp_file
  192. done
  193. fi
  194. # Checking ftp
  195. if [ "$type" = 'ftp' ]; then
  196. tmpdir=$(mktemp -p $BACKUP -d)
  197. ftmpdir=$(basename $tmpdir)
  198. init_ftp_variables
  199. check_ftp_connection
  200. backups=$(ftpc ls|awk '{print $9}'|grep "^$user.")
  201. for backup in $backups; do
  202. cd $tmpdir
  203. if [ ! -z "$(ftpc "get $backup")" ]; then
  204. echo "Error: FTP transfer error"
  205. log_event 'debug' "$E_FTP $EVENT"
  206. exit $E_FTP
  207. fi
  208. get_backup_info $tmpdir/$backup $type >> $tmp_file
  209. rm -f $tmpdir/$backup
  210. done
  211. rm -rf $tmpdir
  212. fi
  213. # Checking both local and ftp
  214. if [ "$type" = 'ftp,local' ] || [ "$type" = 'local,ftp' ]; then
  215. tmpdir=$(mktemp -p $BACKUP -d)
  216. ftmpdir=$(basename $tmpdir)
  217. init_ftp_variables
  218. check_ftp_connection
  219. ftp_backups=$(ftpc ls|awk '{print $9}'|grep "^$user.")
  220. local_backups=$(ls $BACKUP/ |grep "^$user." |sort)
  221. backups=$(echo -e "$local_backups\n$ftp_backups" |\
  222. sort |uniq -c | awk '{print $1" "$2}')
  223. for backup in $(echo "$backups"|grep "^1 "|cut -f 2 -d ' '); do
  224. check_ftp=$(echo $ftp_backups|grep -w $backup)
  225. if [ ! -z "$check_ftp" ]; then
  226. cd $tmpdir
  227. if [ ! -z "$(ftpc "get $backup")" ]; then
  228. echo "Error: FTP transfer error"
  229. log_event 'debug' "$E_FTP $EVENT"
  230. exit $E_FTP
  231. fi
  232. get_backup_info $tmpdir/$backup ftp >> $tmp_file
  233. rm -f $tmpdir/$backup
  234. else
  235. get_backup_info $BACKUP/$backup local >> $tmp_file
  236. fi
  237. done
  238. for backup in $(echo "$backups"|grep "^2 "|cut -f 2 -d ' '); do
  239. get_backup_info $BACKUP/$backup $type >> $tmp_file
  240. done
  241. rm -rf $tmpdir
  242. fi
  243. # Checking if there was any output
  244. if [ -e "$tmp_file" ]; then
  245. cat $tmp_file | sort > $USER_DATA/backup.conf
  246. rm $tmp_file
  247. else
  248. rm $USER_DATA/backup.conf
  249. touch $USER_DATA/backup.conf
  250. fi
  251. #----------------------------------------------------------#
  252. # Vesta #
  253. #----------------------------------------------------------#
  254. # Logging
  255. log_event "$OK" "$EVENT"
  256. exit