v_update_user_backups 7.2 KB

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