v-restore-user 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759
  1. #!/bin/bash
  2. # info: restore user
  3. # options: USER BACKUP [WEB] [DNS] [MAIL] [DB] [CRON] [UDIR] [NOTIFY]
  4. #
  5. # The function for resotring user from backup.
  6. #----------------------------------------------------------#
  7. # Variable&Function #
  8. #----------------------------------------------------------#
  9. # Import VESTA variable for cron launch
  10. source /etc/profile
  11. # Argument definition
  12. user=$1
  13. backup=$2
  14. web=$3
  15. dns=$4
  16. mail=$5
  17. db=$6
  18. cron=$7
  19. udir=$8
  20. notify=${9-no}
  21. # Define backup dir
  22. if [ -z "$BACKUP" ]; then
  23. BACKUP=/backup
  24. fi
  25. # Includes
  26. source $VESTA/func/main.sh
  27. source $VESTA/func/domain.sh
  28. source $VESTA/func/ip.sh
  29. source $VESTA/func/db.sh
  30. source $VESTA/func/rebuild.sh
  31. source $VESTA/conf/vesta.conf
  32. # Check backup ownership function
  33. is_backup_available() {
  34. if ! [[ $2 =~ ^$1.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].tar$ ]]; then
  35. check_result $E_FORBIDEN "permission denied"
  36. fi
  37. }
  38. # Defining ftp command function
  39. ftpc() {
  40. /usr/bin/ftp -n $HOST $PORT <<EOF
  41. quote USER $USERNAME
  42. quote PASS $PASSWORD
  43. binary
  44. $1
  45. $2
  46. $3
  47. quit
  48. EOF
  49. }
  50. # FTP backup download function
  51. ftp_download() {
  52. source $VESTA/conf/ftp.backup.conf
  53. if [ -z "$PORT" ]; then
  54. PORT='21'
  55. fi
  56. ftpc "cd $BPATH" "get $1"
  57. }
  58. # sftp command function
  59. sftpc() {
  60. expect -f "-" <<EOF "$@"
  61. set timeout 60
  62. set count 0
  63. spawn /usr/bin/sftp -o StrictHostKeyChecking=no \
  64. -o Port=$PORT $USERNAME@$HOST
  65. expect {
  66. "password:" {
  67. send "$PASSWORD\r"
  68. exp_continue
  69. }
  70. -re "Couldn't|(.*)disconnect|(.*)stalled|(.*)not found" {
  71. set count \$argc
  72. set output "Disconnected."
  73. set rc $E_FTP
  74. exp_continue
  75. }
  76. -re ".*denied.*(publickey|password)." {
  77. set output "Permission denied, wrong publickey or password."
  78. set rc $E_CONNECT
  79. }
  80. -re "\[0-9]*%" {
  81. exp_continue
  82. }
  83. "sftp>" {
  84. if {\$count < \$argc} {
  85. set arg [lindex \$argv \$count]
  86. send "\$arg\r"
  87. incr count
  88. } else {
  89. incr count
  90. } else {
  91. send "exit\r"
  92. set output "Disconnected."
  93. if {[info exists rc] != 1} {
  94. set rc $OK
  95. }
  96. }
  97. exp_continue
  98. }
  99. timeout {
  100. set output "Connection timeout."
  101. set rc $E_CONNECT
  102. }
  103. }
  104. if {[info exists output] == 1} {
  105. puts "\$output"
  106. }
  107. exit \$rc
  108. EOF
  109. }
  110. # SFTP backup download function
  111. sftp_download() {
  112. source $VESTA/conf/sftp.backup.conf
  113. if [ -z "$PORT" ]; then
  114. PORT='22'
  115. fi
  116. cd $BACKUP
  117. sftpc "cd $BPATH" "get $1" > /dev/null 2>&1
  118. }
  119. # Google backup download function
  120. google_download() {
  121. source $VESTA/conf/google.backup.conf
  122. gsutil="$VESTA/3rdparty/gsutil/gsutil"
  123. export BOTO_CONFIG="$VESTA/conf/.google.backup.boto"
  124. ${gsutil} cp gs://$BUCKET/$BPATH/$1 $BACKUP/ > /dev/null 2>&1
  125. if [ "$?" -ne 0 ]; then
  126. check_result "$E_CONNECT" "gsutil failed to download $1"
  127. fi
  128. }
  129. #----------------------------------------------------------#
  130. # Verifications #
  131. #----------------------------------------------------------#
  132. args_usage='USER BACKUP [WEB] [DNS] [MAIL] [DB] [CRON] [UDIR] [NOTIFY]'
  133. check_args '2' "$#" "$args_usage"
  134. is_format_valid 'user' 'backup'
  135. is_backup_available "$user" "$backup"
  136. #----------------------------------------------------------#
  137. # Action #
  138. #----------------------------------------------------------#
  139. # Checking local backup
  140. if [ ! -e "$BACKUP/$backup" ]; then
  141. if [[ "$BACKUP_SYSTEM" =~ "google" ]]; then
  142. google_download $backup
  143. downloaded='yes'
  144. fi
  145. if [[ "$BACKUP_SYSTEM" =~ "sftp" ]] && [ -z "$downloaded" ]; then
  146. sftp_download $backup
  147. downloaded='yes'
  148. fi
  149. if [[ "$BACKUP_SYSTEM" =~ "ftp" ]] && [ -z "$downloaded" ]; then
  150. ftp_download $backup
  151. downloaded='yes'
  152. fi
  153. if [ -z "$downloaded" ]; then
  154. check_result $E_NOTEXIST "backup $backup doesn't exist"
  155. fi
  156. fi
  157. # Checking user existance on the server
  158. check_user=$(is_object_valid 'user' 'USER' "$user")
  159. if [ -z "$check_user" ]; then
  160. is_object_unsuspended 'user' 'USER' "$user"
  161. subj="$user → restore failed"
  162. email=$(get_user_value '$CONTACT')
  163. else
  164. create_user="yes"
  165. email=$(grep CONTACT $VESTA/data/users/admin/user.conf | cut -f2 -d \')
  166. fi
  167. # Checking avaiable disk space
  168. disk_usage=$(df $BACKUP |tail -n1 |tr ' ' '\n' |grep % |cut -f 1 -d %)
  169. if [ "$disk_usage" -ge "$BACKUP_DISK_LIMIT" ]; then
  170. echo "Error: Not enough disk space" |$SENDMAIL -s "$subj" $email $notify
  171. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  172. check_result $E_DISK "Not enough disk space"
  173. fi
  174. # Checking load average
  175. la=$(cat /proc/loadavg |cut -f 1 -d ' ' |cut -f 1 -d '.')
  176. i=0
  177. while [ "$la" -ge "$BACKUP_LA_LIMIT" ]; do
  178. echo -e "$(date "+%F %T") Load Average $la"
  179. sleep 60
  180. if [ "$i" -ge "15" ]; then
  181. la_error="LoadAverage $la is above threshold"
  182. echo "Error: $la_error" |$SENDMAIL -s "$subj" $email $notify
  183. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  184. check_result $E_LA "$la_error"
  185. fi
  186. la=$(cat /proc/loadavg |cut -f 1 -d ' ' |cut -f 1 -d '.')
  187. (( ++i))
  188. done
  189. # Creating temporary directory
  190. tmpdir=$(mktemp -p $BACKUP -d)
  191. if [ "$?" -ne 0 ]; then
  192. echo "Can't create tmp dir $tmpdir" |$SENDMAIL -s "$subj" $email $notify
  193. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  194. check_result "$E_NOTEXIST" "can't create tmp dir"
  195. fi
  196. # Restoring user account
  197. if [ "$create_user" = 'yes' ]; then
  198. echo "-- USER --" |tee $tmpdir/restore.log
  199. echo -e "$(date "+%F %T") $user" |tee -a $tmpdir/restore.log
  200. # Unpacking user container
  201. tar xf $BACKUP/$backup -C $tmpdir ./vesta
  202. if [ "$?" -ne 0 ]; then
  203. rm -rf $tmpdir
  204. echo "Can't unpack user contaner" |$SENDMAIL -s "$subj" $email $notify
  205. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  206. check_result "$E_PARSING" "can't unpack user contaner"
  207. fi
  208. # Restoring user.conf
  209. mkdir $USER_DATA
  210. cp $tmpdir/vesta/user.conf $USER_DATA/
  211. cp -r $tmpdir/vesta/ssl $USER_DATA/ >/dev/null 2>&1
  212. cp $tmpdir/vesta/backup-excludes.conf $USER_DATA/ >/dev/null 2>&1
  213. # Rebuilding user
  214. rebuild_user_conf
  215. fi
  216. # Unpacking pam container
  217. tar xf $BACKUP/$backup -C $tmpdir ./pam
  218. if [ "$?" -ne 0 ]; then
  219. rm -rf $tmpdir
  220. echo "Can't unpack PAM contaner" |$SENDMAIL -s "$subj" $email $notify
  221. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  222. check_result "$E_PARSING" "can't unpack PAM contaner"
  223. fi
  224. old_user=$(cut -f 1 -d : $tmpdir/pam/passwd)
  225. old_uid=$(cut -f 3 -d : $tmpdir/pam/passwd)
  226. new_uid=$(grep "^$user:" /etc/passwd |cut -f 3 -d :)
  227. # Restoring web domains
  228. if [ "$web" != 'no' ] && [ ! -z "$WEB_SYSTEM" ]; then
  229. echo -e "\n-- WEB --" |tee -a $tmpdir/restore.log
  230. # Creating web domain restore list
  231. backup_domains=$(tar -tf $BACKUP/$backup |grep "^./web")
  232. backup_domains=$(echo "$backup_domains" |grep domain_data.tar.gz)
  233. backup_domains=$(echo "$backup_domains" |cut -f 3 -d /)
  234. if [ -z "$web" ] || [ "$web" = '*' ]; then
  235. domains="$backup_domains"
  236. else
  237. echo "$web" |tr ',' '\n' > $tmpdir/selected.txt
  238. domains=$(echo "$backup_domains" |egrep -f $tmpdir/selected.txt)
  239. fi
  240. # Restoring web domain
  241. for domain in $domains; do
  242. echo -e "$(date "+%F %T") $domain" |tee -a $tmpdir/restore.log
  243. # Checking domain existance
  244. check_config=$(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
  245. if [ -z "$check_config" ]; then
  246. check_new=$(is_domain_new 'web' $domain)
  247. if [ ! -z "$check_new" ]; then
  248. rm -rf $tmpdir
  249. error="$domain belongs to another user"
  250. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  251. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  252. check_result "$E_PARSING" "$error"
  253. fi
  254. fi
  255. # Unpacking domain container
  256. tar xf $BACKUP/$backup -C $tmpdir ./web/$domain
  257. if [ "$?" -ne 0 ]; then
  258. rm -rf $tmpdir
  259. error="Can't unpack $domain web container"
  260. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  261. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  262. check_result "$E_PARSING" "$error"
  263. fi
  264. # Restoring web.conf
  265. if [ -z "$check_config" ]; then
  266. eval $(cat $tmpdir/web/$domain/vesta/web.conf)
  267. # Deleting conflicting aliases
  268. for dom_alias in ${ALIAS//,/ }; do
  269. check_new=$(is_domain_new 'web' $dom_alias)
  270. if [ ! -z "$check_new" ]; then
  271. ALIAS=$(echo "$ALIAS" |\
  272. sed "s/,/\n/g"|\
  273. sed "s/^$dom_alias$//g"|\
  274. sed "/^$/d"|\
  275. sed ':a;N;$!ba;s/\n/,/g')
  276. fi
  277. done
  278. # Checking ip address
  279. check_ip=$(is_ip_valid $IP $user)
  280. if [ ! -z "$check_ip" ]; then
  281. local_ip=''
  282. get_user_ip $user
  283. old_ip=$IP
  284. IP=$ip
  285. fi
  286. # Checking web template
  287. check_tpl=$(is_web_template_valid $TPL)
  288. if [ ! -z "$check_tpl" ]; then
  289. TPL='default'
  290. fi
  291. # Checking proxy template
  292. check_proxy_tpl=$(is_proxy_template_valid $PROXY)
  293. if [ ! -z "$check_proxy_tpl" ]; then
  294. PROXY='default'
  295. fi
  296. # Checking backend template
  297. check_backend_tpl=$(is_backend_template_valid $BACKEND)
  298. if [ ! -z "$check_proxy_tpl" ]; then
  299. BACKEND='default'
  300. fi
  301. # Converting ftp users
  302. if [ ! -z "$FTP_USER" ]; then
  303. FTP_USER=$(echo "$FTP_USER" |sed -e "s/${old_user}_//")
  304. FTP_USER="${user}_${FTP_USER}"
  305. fi
  306. # Converting stats users
  307. if [ ! -z "$STATS_USER" ]; then
  308. STATS_USER=$(echo "$STATS_USER" |sed -e "s/${old_user}_//")
  309. STATS_USER="${user}_${STATS_USER}"
  310. fi
  311. # Copying ssl certificates
  312. if [ "$SSL" = 'yes' ]; then
  313. for crt in $(ls $tmpdir/web/$domain/conf |grep ssl); do
  314. crt=$(echo "$crt" |sed "s/ssl.//")
  315. cp -f $tmpdir/web/$domain/conf/ssl.$crt $USER_DATA/ssl/$crt
  316. done
  317. fi
  318. # Concatenating web.conf keys
  319. str="DOMAIN='$domain' IP='$IP' IP6='$IP6' ALIAS='$ALIAS'"
  320. str="$str TPL='$TPL' SSL='$SSL' SSL_HOME='$SSL_HOME'"
  321. str="$str FTP_USER='$FTP_USER' FTP_MD5='$FTP_MD5'"
  322. str="$str BACKEND='$BACKEND' PROXY='$PROXY'"
  323. str="$str PROXY_EXT='$PROXY_EXT' STATS='$STATS'"
  324. str="$str STATS_USER='$STATS_USER' STATS_CRYPT='$STATS_CRYPT'"
  325. str="$str U_DISK='$U_DISK' U_BANDWIDTH='0' SUSPENDED='no'"
  326. str="$str TIME='$(date +%T)' DATE='$(date +%F)'"
  327. echo $str >> $USER_DATA/web.conf
  328. # Rebuilding backend
  329. if [ ! -z "$WEB_BACKEND" ]; then
  330. $BIN/v-add-web-domain-backend $user $domain $BACKEND
  331. fi
  332. # Rebuilding vhost
  333. rebuild_web_domain_conf
  334. fi
  335. # Restoring web domain data
  336. tar -xzpf $tmpdir/web/$domain/domain_data.tar.gz \
  337. -C $HOMEDIR/$user/web/$domain/
  338. if [ "$?" -ne 0 ]; then
  339. rm -rf $tmpdir
  340. error="can't unpack $domain data tarball"
  341. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  342. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  343. check_result "$E_PARSING" "$error"
  344. fi
  345. # Applying Fix for tar < 1.24
  346. find $HOMEDIR/$user/web/$domain -type d \
  347. -exec chown -h $user:$user {} \;
  348. # Re-chowning files if uid differs
  349. if [ "$old_uid" -ne "$new_uid" ]; then
  350. find $HOMEDIR/$user/web/$domain/ -user $old_uid \
  351. -exec chown -h $user:$user {} \;
  352. fi
  353. done
  354. # Adding user to traff queue
  355. sed -i "/ $user /d" $VESTA/data/queue/traffic.pipe
  356. echo "$BIN/v-update-web-domains-traff $user" >>\
  357. $VESTA/data/queue/traffic.pipe
  358. # Restarting web server
  359. $BIN/v-restart-web
  360. check_result $? "Web restart failed"
  361. if [ ! -z "$PROXY_SYSTEM" ]; then
  362. $BIN/v-restart-proxy
  363. check_result $? "Proxy restart failed"
  364. fi
  365. fi
  366. # Restoring dns domains
  367. if [ "$dns" != 'no' ] && [ ! -z "$DNS_SYSTEM" ]; then
  368. echo -e "\n-- DNS --" |tee -a $tmpdir/restore.log
  369. # Creating dns domain restore list
  370. backup_domains=$(tar -tf $BACKUP/$backup |grep "^./dns")
  371. backup_domains=$(echo "$backup_domains" |grep "dns.conf$")
  372. backup_domains=$(echo "$backup_domains" |cut -f 3 -d /)
  373. if [ -z "$dns" ] || [ "$dns" = '*' ]; then
  374. domains="$backup_domains"
  375. else
  376. echo "$dns" |tr ',' '\n' > $tmpdir/selected.txt
  377. domains=$(echo "$backup_domains" |egrep -f $tmpdir/selected.txt)
  378. fi
  379. # Restoring dns domain
  380. for domain in $domains; do
  381. echo -e "$(date "+%F %T") $domain" |tee -a $tmpdir/restore.log
  382. # Checking domain existance
  383. check_config=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)
  384. if [ -z "$check_config" ]; then
  385. check_new=$(is_domain_new 'dns' $domain)
  386. if [ ! -z "$check_new" ]; then
  387. rm -rf $tmpdir
  388. error="$domain belongs to another user"
  389. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  390. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  391. check_result "$E_PARSING" "$error"
  392. fi
  393. fi
  394. # Unpacking domain container
  395. tar xf $BACKUP/$backup -C $tmpdir ./dns/$domain
  396. if [ "$?" -ne 0 ]; then
  397. rm -rf $tmpdir
  398. error="Can't unpack $domain dns container"
  399. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  400. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  401. check_result "$E_PARSING" "$error"
  402. fi
  403. # Restoring dns.conf
  404. if [ -z "$check_config" ]; then
  405. eval $(cat $tmpdir/dns/$domain/vesta/dns.conf)
  406. # Checking ip address
  407. check_ip=$(is_ip_valid $IP $user)
  408. if [ ! -z "$check_ip" ]; then
  409. local_ip=''
  410. get_user_ip $user
  411. old_ip=$IP
  412. IP=$ip
  413. fi
  414. # Checking dns template
  415. check_tpl=$(is_dns_template_valid $TPL)
  416. if [ ! -z "$check_tpl" ]; then
  417. TPL='default'
  418. fi
  419. # Concatenating dns.conf keys
  420. str="DOMAIN='$domain' IP='$IP' TPL='$TPL' TTL='$TTL' EXP='$EXP'"
  421. str="$str SOA='$SOA' RECORDS='$RECORDS' SUSPENDED='no'"
  422. str="$str TIME='$(date +%T)' DATE='$(date +%F)'"
  423. echo $str >> $USER_DATA/dns.conf
  424. fi
  425. # Restoring dns records
  426. cp -f $tmpdir/dns/$domain/vesta/$domain.conf $USER_DATA/dns/
  427. # Rebuilding dns domain
  428. rebuild_dns_domain_conf
  429. done
  430. # Restarting DNS
  431. $BIN/v-restart-dns
  432. check_result $? "DNS restart failed"
  433. fi
  434. # Restoring mail domains
  435. if [ "$mail" != 'no' ] && [ ! -z "$MAIL_SYSTEM" ]; then
  436. echo -e "\n-- MAIL --" |tee -a $tmpdir/restore.log
  437. # Creating mail domain restore list
  438. backup_domains=$(tar -tf $BACKUP/$backup |grep "^./mail")
  439. backup_domains=$(echo "$backup_domains" |grep "mail.conf$")
  440. backup_domains=$(echo "$backup_domains" |cut -f 3 -d /)
  441. if [ -z "$mail" ] || [ "$mail" = '*' ]; then
  442. domains="$backup_domains"
  443. else
  444. echo "$mail" |tr ',' '\n' > $tmpdir/selected.txt
  445. domains=$(echo "$backup_domains" |egrep -f $tmpdir/selected.txt)
  446. fi
  447. # Checking exim username for later chowning
  448. exim_user="exim";
  449. check_exim_username=$(grep -c '^Debian-exim:' /etc/passwd)
  450. if [ "$check_exim_username" -eq 1 ]; then
  451. exim_user="Debian-exim"
  452. fi
  453. # Restoring dns domain
  454. for domain in $domains; do
  455. echo -e "$(date "+%F %T") $domain" |tee -a $tmpdir/restore.log
  456. # Checking domain existance
  457. check_config=$(grep "DOMAIN='$domain'" $USER_DATA/mail.conf)
  458. if [ -z "$check_config" ]; then
  459. check_new=$(is_domain_new 'mail' $domain)
  460. if [ ! -z "$check_new" ]; then
  461. rm -rf $tmpdir
  462. error="$domain belongs to another user"
  463. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  464. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  465. check_result "$E_PARSING" "$error"
  466. fi
  467. fi
  468. # Unpacking domain container
  469. tar xf $BACKUP/$backup -C $tmpdir ./mail/$domain
  470. if [ "$?" -ne 0 ]; then
  471. rm -rf $tmpdir
  472. error="Can't unpack $domain mail container"
  473. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  474. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  475. check_result "$E_PARSING" "$error"
  476. fi
  477. # Restoring mail.conf
  478. if [ -z "$check_config" ]; then
  479. cat $tmpdir/mail/$domain/vesta/mail.conf >> $USER_DATA/mail.conf
  480. fi
  481. # Restoring DKIM
  482. if [ -e "$tmpdir/mail/$domain/vesta/$domain.pem" ]; then
  483. cp -f $tmpdir/mail/$domain/vesta/$domain.pem $USER_DATA/mail/
  484. cp -f $tmpdir/mail/$domain/vesta/$domain.pub $USER_DATA/mail/
  485. fi
  486. # Restoring email accounts
  487. cp -f $tmpdir/mail/$domain/vesta/$domain.conf $USER_DATA/mail/
  488. # Rebuilding mail config
  489. rebuild_mail_domain_conf
  490. # Restoring emails
  491. if [ -e "$tmpdir/mail/$domain/accounts.tar.gz" ]; then
  492. tar -xzpf $tmpdir/mail/$domain/accounts.tar.gz \
  493. -C $HOMEDIR/$user/mail/$domain_idn/
  494. if [ "$?" -ne 0 ]; then
  495. rm -rf $tmpdir
  496. error="Can't unpack $domain mail account container"
  497. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  498. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  499. check_result "$E_PARSING" "$error"
  500. fi
  501. # Re-chowning files if uid differs
  502. if [ "$old_uid" -ne "$new_uid" ]; then
  503. find $HOMEDIR/$user/mail/$domain_idn -user $old_uid \
  504. -exec chown -h $user:mail {} \;
  505. fi
  506. fi
  507. # Chowning mail conf files to exim user
  508. find $HOMEDIR/$user/conf/mail/$domain_idn -user root \
  509. -exec chown $exim_user {} \;
  510. done
  511. fi
  512. # Restoring databases
  513. if [ "$db" != 'no' ] && [ ! -z "$DB_SYSTEM" ]; then
  514. echo -e "\n-- DB --" |tee -a $tmpdir/restore.log
  515. # Creating database restore list
  516. backup_databases=$(tar -tf $BACKUP/$backup |grep "^./db")
  517. backup_databases=$(echo "$backup_databases" |grep db.conf)
  518. backup_databases=$(echo "$backup_databases" |cut -f 3 -d / |sort -u)
  519. if [ -z "$db" ] || [ "$db" = '*' ]; then
  520. databases="$backup_databases"
  521. else
  522. echo "$db" |tr ',' '\n' > $tmpdir/selected.txt
  523. databases=$(echo "$backup_databases" |egrep -f $tmpdir/selected.txt)
  524. fi
  525. # Restoring database
  526. for database in $databases; do
  527. echo -e "$(date "+%F %T") $database" |tee -a $tmpdir/restore.log
  528. # Checking database existance
  529. check_config=$(grep "DB='$database'" $USER_DATA/db.conf)
  530. # Unpacking database container
  531. tar xf $BACKUP/$backup -C $tmpdir ./db/$database
  532. if [ "$?" -ne 0 ]; then
  533. rm -rf $tmpdir
  534. error="Can't unpack $database database container"
  535. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  536. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  537. check_result "$E_PARSING" "$error"
  538. fi
  539. # Restore database config
  540. if [ -z "$check_config" ]; then
  541. eval $(cat $tmpdir/db/$database/vesta/db.conf)
  542. DB=$(echo "$DB" |sed -e "s/${old_user}_//")
  543. DB="${user}_${DB}"
  544. DBUSER=$(echo "$DBUSER" |sed -e "s/${old_user}_//")
  545. DBUSER="${user}_${DBUSER}"
  546. str="DB='$DB' DBUSER='$DBUSER' MD5='$MD5' HOST='$HOST'"
  547. str="$str TYPE='$TYPE' CHARSET='$CHARSET' U_DISK='$U_DISK'"
  548. str="$str SUSPENDED='no' TIME='$(date +%T)' DATE='$(date +%F)'"
  549. echo $str >> $USER_DATA/db.conf
  550. else
  551. eval $(grep "DB='$database'" $USER_DATA/db.conf)
  552. fi
  553. # Unziping database dump
  554. gzip -d $tmpdir/db/$database/$database.*.sql.gz
  555. # Importing database dump
  556. database_dump="$tmpdir/db/$database/$database.$TYPE.sql"
  557. case $TYPE in
  558. mysql) rebuild_mysql_database;
  559. import_mysql_database $database_dump ;;
  560. pgsql) rebuild_pgsql_database;
  561. import_pgsql_database $database_dump ;;
  562. esac
  563. done
  564. fi
  565. # Restoring cron jobs
  566. if [ "$cron" != 'no' ] && [ ! -z "CRON_SYSTEM" ]; then
  567. echo -e "\n-- CRON --" |tee -a $tmpdir/restore.log
  568. # Unpacking cron container
  569. tar xf $BACKUP/$backup -C $tmpdir ./cron
  570. if [ "$?" -ne 0 ]; then
  571. rm -rf $tmpdir
  572. error="Can't unpack cron container"
  573. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  574. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  575. check_result "$E_PARSING" "$error"
  576. fi
  577. jobs=$(wc -l $tmpdir/cron/cron.conf |cut -f 1 -d' ')
  578. if [ "$jobs" -eq 1 ]; then
  579. echo -e "$(date "+%F %T") $jobs cron job" |tee -a $tmpdir/restore.log
  580. else
  581. echo -e "$(date "+%F %T") $jobs cron jobs"|tee -a $tmpdir/restore.log
  582. fi
  583. # Restoring cron jobs
  584. cp $tmpdir/cron/cron.conf $USER_DATA/cron.conf
  585. # Rebuilding cron jobs
  586. sync_cron_jobs
  587. # Restarting cron
  588. $BIN/v-restart-cron
  589. check_result $? "CRON restart failed"
  590. fi
  591. # Restoring user files and directories
  592. if [ "$udir" != 'no' ]; then
  593. echo -e "\n-- USER FILES --" |tee -a $tmpdir/restore.log
  594. # Unpacking user dir container
  595. if [ ! -z "$(tar -tf $BACKUP/$backup |grep './user_dir')" ]; then
  596. # Creating user dir restore list
  597. backup_dirs=$(tar -tf $BACKUP/$backup |grep "^./user_dir")
  598. backup_dirs=$(echo "$backup_dirs" |grep tar.gz)
  599. backup_dirs=$(echo "$backup_dirs" |cut -f 3 -d /)
  600. backup_dirs=$(echo "$backup_dirs" |sed "s/.tar.gz//")
  601. if [ -z "$udir" ] || [ "$udir" = '*' ]; then
  602. user_dirs="$backup_dirs"
  603. else
  604. echo "$udir" |tr ',' '\n' > $tmpdir/selected.txt
  605. user_dirs=$(echo "$backup_dirs" |egrep -f $tmpdir/selected.txt)
  606. fi
  607. for user_dir in $user_dirs; do
  608. echo -e "$(date "+%F %T") $user_dir" |tee -a $tmpdir/restore.log
  609. tar xf $BACKUP/$backup -C $tmpdir ./user_dir/$user_dir.tar.gz
  610. if [ "$?" -ne 0 ]; then
  611. error="can't unpack $user_dir user dir contaner"
  612. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  613. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  614. check_result "$E_PARSING" "$error"
  615. fi
  616. tar xzf $tmpdir/user_dir/$user_dir.tar.gz -C $HOMEDIR/$user
  617. if [ "$?" -ne 0 ]; then
  618. error="can't unpack $user_dir user dir contaner"
  619. echo "$error" |$SENDMAIL -s "$subj" $email $notify
  620. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  621. check_result "$E_PARSING" "$error"
  622. fi
  623. # Re-chowning files if uid differs
  624. if [ "$old_uid" -ne "$new_uid" ]; then
  625. find $HOMEDIR/$user/$user_dir -user $old_uid \
  626. -exec chown -h $user:$user {} \;
  627. fi
  628. done
  629. fi
  630. fi
  631. # Sending mail notification
  632. subj="$user → restore has been completed"
  633. cat $tmpdir/restore.log |$SENDMAIL -s "$subj" $email $notify
  634. # Deleting temporary data
  635. rm -rf $tmpdir
  636. # Cleaning restore queue
  637. sed -i "/v-restore-user $user /d" $VESTA/data/queue/backup.pipe
  638. #----------------------------------------------------------#
  639. # Vesta #
  640. #----------------------------------------------------------#
  641. # Update user counters
  642. $BIN/v-update-user-counters $user
  643. $BIN/v-update-user-counters admin
  644. $BIN/v-update-sys-ip-counters
  645. # Logging
  646. log_event "$OK" "$ARGUMENTS"
  647. exit