v_update_user_backups 7.7 KB

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