v-restore-user 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  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. # Argument defenition
  10. user=$1
  11. backup=$2
  12. web=$3
  13. dns=$4
  14. mail=$5
  15. db=$6
  16. cron=$7
  17. udir=$8
  18. notify=${9-no}
  19. # Define backup dir
  20. if [ -z "$BACKUP" ]; then
  21. BACKUP=/home/backup/
  22. fi
  23. # Includes
  24. source $VESTA/conf/vesta.conf
  25. source $VESTA/func/main.sh
  26. source $VESTA/func/domain.sh
  27. source $VESTA/func/ip.sh
  28. source $VESTA/func/db.sh
  29. source $VESTA/func/rebuild.sh
  30. # Check backup function
  31. is_backup_valid() {
  32. if [ ! -e "$BACKUP/$backup" ]; then
  33. echo "Error: backup not exist"
  34. log_event "$E_NOTEXIST" "$EVENT"
  35. exit $E_NOTEXIST
  36. fi
  37. }
  38. #----------------------------------------------------------#
  39. # Verifications #
  40. #----------------------------------------------------------#
  41. args='USER BACKUP [WEB] [DNS] [MAIL] [DB] [CRON] [UDIR] [NOTIFY]'
  42. check_args '2' "$#" $args
  43. validate_format 'user' 'backup'
  44. is_object_valid 'user' 'USER' "$user"
  45. is_object_unsuspended 'user' 'USER' "$user"
  46. is_backup_valid
  47. #----------------------------------------------------------#
  48. # Action #
  49. #----------------------------------------------------------#
  50. # Set notification email and subject
  51. if [ "$notify" != 'no' ]; then
  52. subj="$user → restore failed"
  53. email=$(get_user_value '$CONTACT')
  54. else
  55. subj="$user → restore failed"
  56. email=$(grep CONTACT $VESTA/data/users/admin/user.conf | cut -f 2 -d \')
  57. fi
  58. if [ -e "$VESTA/web/inc/mail-wrapper.php" ]; then
  59. send_mail="$VESTA/web/inc/mail-wrapper.php"
  60. else
  61. send_mail=$(which mail)
  62. fi
  63. # Check disk usage
  64. disk_usage=$(df $BACKUP |tail -n1 |tr ' ' '\n' |grep % |cut -f 1 -d %)
  65. if [ "$disk_usage" -ge "$BACKUP_DISK_LIMIT" ]; then
  66. rm -rf $tmpdir
  67. echo "Not enough disk space to run backup" | $send_mail -s "$subj" $email
  68. echo "Error: Not enough disk space"
  69. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  70. log_event "$E_DISK" "$EVENT"
  71. exit $E_DISK
  72. fi
  73. # Check load average
  74. la=$(cat /proc/loadavg | cut -f 1 -d ' ' | cut -f 1 -d '.')
  75. i=0
  76. while [ "$la" -ge "$BACKUP_LA_LIMIT" ]; do
  77. echo "$(date "+%F %T") Load Average $la"
  78. echo
  79. sleep 60
  80. if [ "$i" -ge "15" ]; then
  81. echo "LoadAverage $i is above threshold" | $send_mail -s "$subj" $email
  82. echo "Error: LA is too high"
  83. sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
  84. log_event "$E_LA" "$EVENT"
  85. exit $E_LA
  86. fi
  87. (( ++i))
  88. done
  89. # Creating temporary directory
  90. tmpdir=$(mktemp -p $BACKUP -d)
  91. if [ "$?" -ne 0 ]; then
  92. echo "Can't create tmp dir $tmpdir" | $send_mail -s "$subj" $email
  93. echo "Error: can't create tmp dir"
  94. log_event "$E_NOTEXIST" "$EVENT"
  95. exit $E_NOTEXIST
  96. fi
  97. # WEB
  98. if [ "$web" != 'no' ]; then
  99. echo "-- WEB --"
  100. msg="$msg\n-- WEB --"
  101. # Create domain list
  102. domain_list=$(tar -tf $BACKUP/$backup | grep "^./web" |\
  103. grep domain_data.tar.gz | cut -f 3 -d '/')
  104. if [ ! -z "$web" ]; then
  105. dom_include_list=$(mktemp)
  106. for domain_include in ${web//,/ }; do
  107. echo "^$domain_include$" >> $dom_include_list
  108. done
  109. domain_list=$(echo "$domain_list" | egrep -f $dom_include_list )
  110. rm -f $dom_include_list
  111. fi
  112. for domain in $domain_list; do
  113. echo -e "$(date "+%F %T") $domain"
  114. msg="$msg\n$(date "+%F %T") $domain"
  115. # unpack domain container
  116. tar xf $BACKUP/$backup -C $tmpdir ./web/$domain
  117. if [ "$?" -ne 0 ]; then
  118. echo "Error: can't unpack $domain web contaner"
  119. echo "Can't unpack $domain web contaner" |\
  120. $send_mail -s "$subj" $email
  121. rm -rf $tmpdir
  122. exit $E_PARSING
  123. fi
  124. # Restore domain config
  125. check_config=$(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
  126. if [ -z "$check_config" ]; then
  127. # Parse domain config
  128. eval $(cat $tmpdir/web/$domain/vesta/web.conf)
  129. # Check if domain new
  130. check_new=$(is_domain_new 'web' $domain)
  131. if [ ! -z "$check_new" ]; then
  132. echo "Error: web domain $domain belongs to another user"
  133. echo "Web domain $domain belongs to another user" |\
  134. $sedn_mail -s "$subj" $email
  135. rm -rf $tmpdir
  136. log_event "$E_EXISTS" "$EVENT"
  137. exit $E_EXISTS
  138. fi
  139. # Check if domain alias is new
  140. for dom_alias in ${ALIAS//,/ }; do
  141. check_new=$(is_domain_new 'web' $dom_alias)
  142. if [ ! -z "$check_new" ]; then
  143. # Delete conflicting alias
  144. ALIAS=$(echo "$ALIAS" |\
  145. sed -e "s/,/\n/g"|\
  146. sed -e "s/^$dom_alias$//g"|\
  147. sed -e "/^$/d"|\
  148. sed -e ':a;N;$!ba;s/\n/,/g')
  149. fi
  150. done
  151. # Check ip address
  152. check_ip=$(is_ip_valid $IP)
  153. if [ -z "$check_ip" ]; then
  154. check_ip=$(is_ip_avalable $IP)
  155. fi
  156. if [ ! -z "$check_ip" ]; then
  157. IP=$(get_user_ip $user)
  158. if [ -z "$IP" ]; then
  159. echo "Error: no avaiable IP address"
  160. echo "No available IP address" |\
  161. $send_mail -s "$subj" $email
  162. log_event "$E_NOTEXIST" "$EVENT"
  163. exit $E_NOTEXIST
  164. fi
  165. echo "$IP" > $tmpdir/ip_mapping.$domain
  166. fi
  167. # Check apache template
  168. check_tpl=$(is_apache_template_valid)
  169. if [ ! -z "$check_tpl" ]; then
  170. templates=$(ls -t $VESTA/data/templates/web/ |\
  171. grep 'apache' |\
  172. grep '\.tpl' |\
  173. cut -f 2 -d '_' |\
  174. cut -f 1 -d '.')
  175. if [ ! -z "$(echo $templates |grep default)" ]; then
  176. TPL=$(echo "$templates" |grep default |head -n1)
  177. else
  178. TPL=$("$templates" |head -n1)
  179. fi
  180. if [ -z "$TPL" ]; then
  181. echo "Error: no avaiable web template"
  182. echo "No available web template" |\
  183. $send_mail -s "$subj" $email
  184. log_event "$E_NOTEXIST" "$EVENT"
  185. exit $E_NOTEXIST
  186. fi
  187. fi
  188. # Check nginx template
  189. if [ ! -z "$NGINX" ]; then
  190. check_tpl=$(is_nginx_template_valid)
  191. if [ ! -z "$check_tpl" ]; then
  192. templates=$(ls -t $VESTA/data/templates/web/ |\
  193. grep 'nginx' |\
  194. grep '\.tpl' |\
  195. cut -f 2 -d '_' |\
  196. cut -f 1 -d '.')
  197. if [ ! -z "$(echo $templates |grep default)" ]; then
  198. NGINX=$(echo "$templates" |grep default |head -n1)
  199. else
  200. NGINX=$("$templates" |head -n1)
  201. fi
  202. if [ -z "$NGINX" ]; then
  203. echo "Error: no avaiable nginx template"
  204. echo "No available nginx tpl" |\
  205. $send_mail -s "$subj" $email
  206. log_event "$E_NOTEXIST" "$EVENT"
  207. exit $E_NOTEXIST
  208. fi
  209. fi
  210. fi
  211. str="DOMAIN='$domain' IP='$IP' IP6='$IP6' ALIAS='$ALIAS'"
  212. str="$str TPL='$TPL' SSL='$SSL' SSL_HOME='$SSL_HOME'"
  213. str="$str FTP_USER='$FTP_USER' FTP_MD5='$FTP_MD5' NGINX='$NGINX'"
  214. str="$str NGINX_EXT='$NGINX_EXT' STATS='$STATS'"
  215. str="$str STATS_USER='$STATS_USER' STATS_CRYPT='$STATS_CRYPT'"
  216. str="$str U_DISK='$U_DISK' U_BANDWIDTH='0' SUSPENDED='no'"
  217. str="$str TIME='$(date +%T)' DATE='$(date +%F)'"
  218. echo $str >> $USER_DATA/web.conf
  219. # Rebuild web config
  220. rebuild_web_domain_conf
  221. # Adding apache virtualhost
  222. httpd_conf='/etc/httpd/conf.d/vesta.conf'
  223. tmp_conf="$HOMEDIR/$user/conf/web/tmp_httpd.conf"
  224. conf="$HOMEDIR/$user/conf/web/httpd.conf"
  225. cat $tmp_conf >> $conf
  226. rm -f $tmp_conf
  227. httpd_include=$(grep "$conf" $httpd_conf )
  228. if [ -z "$httpd_include" ]; then
  229. echo "Include $conf" >> $httpd_conf
  230. fi
  231. # Adding ssl apache virtuualhost
  232. if [ "$ssl_change" = 'yes' ]; then
  233. tmp_conf="$HOMEDIR/$user/conf/web/tmp_shttpd.conf"
  234. conf="$HOMEDIR/$user/conf/web/shttpd.conf"
  235. cat $tmp_conf >> $conf
  236. rm -f $tmp_conf
  237. fi
  238. httpd_include=$(grep "$conf" $httpd_conf )
  239. if [ -z "$httpd_include" ]; then
  240. echo "Include $conf" >> $httpd_conf
  241. fi
  242. # Adding nginx virtualhost
  243. nginx_conf='/etc/nginx/conf.d/vesta_users.conf'
  244. if [ "$ngix_change" = 'yes' ]; then
  245. tmp_conf="$HOMEDIR/$user/conf/web/tmp_nginx.conf"
  246. conf="$HOMEDIR/$user/conf/web/nginx.conf"
  247. cat $tmp_conf >> $conf
  248. rm -f $tmp_conf
  249. fi
  250. nginx_include=$(grep "$conf" $nginx_conf )
  251. if [ -z "$nginx_include" ]; then
  252. echo "include $conf;" >> $nginx_conf
  253. fi
  254. # Adding ssl nginx virtualhost
  255. if [ "$ngix_change" = 'yes' ] && [ "$ssl_change" = 'yes' ]; then
  256. tmp_conf="$HOMEDIR/$user/conf/web/tmp_snginx.conf"
  257. conf="$HOMEDIR/$user/conf/web/snginx.conf"
  258. cat $tmp_conf >> $conf
  259. rm -f $tmp_conf
  260. nginx_include=$(grep "$conf" $nginx_conf )
  261. if [ -z "$nginx_include" ]; then
  262. echo "include $conf;" >> $nginx_conf
  263. fi
  264. fi
  265. fi
  266. # Restore data
  267. tar -xzpf $tmpdir/web/$domain/domain_data.tar.gz \
  268. -C $HOMEDIR/$user/web/$domain/
  269. if [ "$?" -ne 0 ]; then
  270. echo "Error: can't unpack $domain data tarball"
  271. echo "Can't can't unpack $domain data tarball" |\
  272. $send_mail -s "$subj" $email
  273. rm -rf $tmpdir
  274. exit $E_PARSING
  275. fi
  276. done
  277. echo
  278. msg="$msg\n"
  279. fi
  280. # DNS
  281. if [ "$dns" != 'no' ]; then
  282. echo "-- DNS --"
  283. msg="$msg\n-- DNS --"
  284. # Create domain list
  285. domain_list=$(tar -tf $BACKUP/$backup | grep "^./dns" |\
  286. grep dns.conf | cut -f 3 -d '/')
  287. if [ ! -z "$dns" ]; then
  288. dom_include_list=$(mktemp)
  289. for domain_include in ${dns//,/ }; do
  290. echo "^$domain_include$" >> $dom_include_list
  291. done
  292. domain_list=$(echo "$domain_list" | egrep -f $dom_include_list )
  293. rm -f $dom_include_list
  294. fi
  295. for domain in $domain_list; do
  296. echo -e "$(date "+%F %T") $domain"
  297. msg="$msg\n$(date "+%F %T") $domain"
  298. # unpack domain container
  299. tar xf $BACKUP/$backup -C $tmpdir ./dns/$domain
  300. if [ "$?" -ne 0 ]; then
  301. echo "Error: can't unpack $domain dns contaner"
  302. echo "Can't unpack $domain dns contaner" |\
  303. $send_mail -s "$subj" $email
  304. rm -rf $tmpdir
  305. exit $E_PARSING
  306. fi
  307. # Restore domain config
  308. check_config=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)
  309. if [ -z "$check_config" ]; then
  310. # Parse domain config
  311. eval $(cat $tmpdir/dns/$domain/vesta/dns.conf)
  312. # Check if domain new
  313. check_new=$(is_domain_new 'dns' $domain)
  314. if [ ! -z "$check_new" ]; then
  315. echo "Error: dns domain $domain belongs to another user"
  316. echo "DNS domain $domain belongs to another user" |\
  317. $send_mail -s "$subj" $email
  318. rm -rf $tmpdir
  319. log_event "$E_EXISTS" "$EVENT"
  320. exit $E_EXISTS
  321. fi
  322. # Check ip address
  323. if [ -e "$tmpdir/ip_mapping.$domain" ]; then
  324. OLD=$IP
  325. IP=$(cat $tmpdir/ip_mapping.$domain)
  326. sed -i "s/$OLD/$IP/g" $tmpdir/dns/$domain/vesta/$domain.conf
  327. else
  328. check_ip=$(is_ip_valid $IP)
  329. if [ ! -z "$check_ip" ]; then
  330. if [ -z "$IP" ]; then
  331. IP=$(get_user_ip $user)
  332. fi
  333. fi
  334. fi
  335. if [ -z "$IP" ]; then
  336. echo "Error: no avaiable IP address"
  337. echo "No available IP address" | $send_mail -s "$subj" $email
  338. log_event "$E_NOTEXIST" "$EVENT"
  339. exit $E_NOTEXIST
  340. fi
  341. # Check dns template
  342. check_tpl=$(is_dns_template_valid)
  343. if [ ! -z "$check_tpl" ]; then
  344. templates=$(ls -t $VESTA/data/templates/dns/ |\
  345. grep '\.tpl' |\
  346. cut -f 1 -d '.')
  347. if [ ! -z "$(echo $templates |grep default)" ]; then
  348. TPL=$(echo "$templates" |grep default |head -n1)
  349. else
  350. TPL=$("$templates" |head -n1)
  351. fi
  352. if [ -z "$TPL" ]; then
  353. echo "Error: no avaiable dns template"
  354. echo "No available dns template" |\
  355. $send_mail -s "$subj" $email
  356. log_event "$E_NOTEXIST" "$EVENT"
  357. exit $E_NOTEXIST
  358. fi
  359. fi
  360. str="DOMAIN='$domain' IP='$IP' TPL='$TPL' TTL='$TTL' EXP='$EXP'"
  361. str="$str SOA='$SOA' RECORDS='$RECORDS' SUSPENDED='no'"
  362. str="$str TIME='$(date +%T)' DATE='$(date +%F)'"
  363. echo $str >> $USER_DATA/dns.conf
  364. fi
  365. # Restore dns records
  366. cp -f $tmpdir/dns/$domain/vesta/$domain.conf $USER_DATA/dns/
  367. # Rebuild dns config
  368. rebuild_dns_domain_conf
  369. done
  370. echo
  371. msg="$msg\n"
  372. fi
  373. # MAIL
  374. if [ "$mail" != 'no' ]; then
  375. echo "-- MAIL --"
  376. msg="$msg\n-- MAIL --"
  377. # Create domain list
  378. domain_list=$(tar -tf $BACKUP/$backup | grep "^./mail" |\
  379. grep mail.conf | cut -f 3 -d '/')
  380. if [ ! -z "$mail" ]; then
  381. dom_include_list=$(mktemp)
  382. for domain_include in ${mail//,/ }; do
  383. echo "^$domain_include$" >> $dom_include_list
  384. done
  385. domain_list=$(echo "$domain_list" | egrep -f $dom_include_list )
  386. rm -f $dom_include_list
  387. fi
  388. for domain in $domain_list; do
  389. echo -e "$(date "+%F %T") $domain"
  390. msg="$msg\n$(date "+%F %T") $domain"
  391. # unpack domain container
  392. tar xf $BACKUP/$backup -C $tmpdir ./mail/$domain
  393. if [ "$?" -ne 0 ]; then
  394. echo "Error: can't unpack $domain mail contaner"
  395. echo "Can't can't unpack $domain mail contaner" |\
  396. $send_mail -s "$subj" $email
  397. rm -rf $tmpdir
  398. exit $E_PARSING
  399. fi
  400. # Restore domain config
  401. check_config=$(grep "DOMAIN='$domain'" $USER_DATA/mail.conf)
  402. if [ -z "$check_config" ]; then
  403. # Parse domain config
  404. eval $(cat $tmpdir/mail/$domain/vesta/mail.conf)
  405. # Check if domain new
  406. check_new=$(is_domain_new 'mail' $domain)
  407. if [ ! -z "$check_new" ]; then
  408. echo "Error: mail domain $domain belongs to another user"
  409. echo "Mail domain $domain belongs to another user" |\
  410. $send_mail -s "$subj" $email
  411. rm -rf $tmpdir
  412. log_event "$E_EXISTS" "$EVENT"
  413. exit $E_EXISTS
  414. fi
  415. str="DOMAIN='$domain' ANTIVIRUS='$ANTIVIRUS' ANTISPAM='$ANTISPAM'"
  416. str="$str DKIM='$DKIM' ACCOUNTS='$ACCOUNTS' U_DISK='$U_DISK'"
  417. str="$str CATCHALL='$CATCHALL' SUSPENDED='no'"
  418. str="$str TIME='$(date +%T)' DATE='$(date +%F)'"
  419. echo $str >> $USER_DATA/mail.conf
  420. fi
  421. # Restore DKIM
  422. if [ -e "$tmpdir/mail/$domain/vesta/$domain.pem" ]; then
  423. cp -f $tmpdir/mail/$domain/vesta/$domain.pem $USER_DATA/mail/
  424. cp -f $tmpdir/mail/$domain/vesta/$domain.pub $USER_DATA/mail/
  425. fi
  426. # Restore email accounts
  427. cp -f $tmpdir/mail/$domain/vesta/$domain.conf $USER_DATA/mail/
  428. # Rebuild mail config
  429. rebuild_mail_domain_conf
  430. # Restore emails
  431. if [ -e "$tmpdir/mail/$domain/accounts.tar.gz" ]; then
  432. tar -xzpf $tmpdir/mail/$domain/accounts.tar.gz \
  433. -C $HOMEDIR/$user/mail/$domain/
  434. if [ "$?" -ne 0 ]; then
  435. echo "Error: can't unpack $domain mail account tarball"
  436. echo "Can't unpack $domain mail account tarball" |\
  437. $send_mail -s "$subj" $email
  438. rm -rf $tmpdir
  439. exit $E_PARSING
  440. fi
  441. fi
  442. done
  443. echo
  444. msg="$msg\n"
  445. fi
  446. # DB
  447. if [ "$db" != 'no' ]; then
  448. echo "-- DB --"
  449. msg="$msg\n-- DB --"
  450. # Create domain list
  451. db_list=$(tar -tf $BACKUP/$backup | grep "^./db" |\
  452. grep db.conf | cut -f 3 -d '/')
  453. if [ ! -z "$db" ]; then
  454. db_include_list=$(mktemp)
  455. for db_include in ${db//,/ }; do
  456. echo "^$db_include$" >> $db_include_list
  457. done
  458. db_list=$(echo "$db_list" | egrep -f $db_include_list )
  459. rm -f $db_include_list
  460. fi
  461. for db in $db_list; do
  462. echo -e "$(date "+%F %T") $db"
  463. msg="$msg\n$(date "+%F %T") $db"
  464. # unpack db container
  465. tar xf $BACKUP/$backup -C $tmpdir ./db/$db
  466. if [ "$?" -ne 0 ]; then
  467. echo "Error: can't unpack $db database contaner"
  468. echo "Can't unpack $db database contaner" |\
  469. $send_mail -s "$subj" $email
  470. rm -rf $tmpdir
  471. exit $E_PARSING
  472. fi
  473. # Restore domain config
  474. check_config=$(grep "DB='$db'" $USER_DATA/db.conf)
  475. if [ -z "$check_config" ]; then
  476. # Parse domain config
  477. eval $(cat $tmpdir/db/$db/vesta/db.conf)
  478. str="DB='$db' DBUSER='$DBUSER' MD5='$MD5' HOST='$HOST'"
  479. str="$str TYPE='$TYPE' CHARSET='$CHARSET' U_DISK='$U_DISK'"
  480. str="$str SUSPENDED='no' TIME='$(date +%T)' DATE='$(date +%F)'"
  481. echo $str >> $USER_DATA/db.conf
  482. fi
  483. # Unzip database dump
  484. gzip -d $tmpdir/db/$db/$db.*.sql.gz
  485. # Get database values
  486. get_database_values
  487. # Rebuild db
  488. case $TYPE in
  489. mysql) rebuild_mysql_database;
  490. import_mysql_database $tmpdir/db/$db/$db.$TYPE.sql ;;
  491. pgsql) rebuild_pgsql_database;
  492. import_pgsql_database $tmpdir/db/$db/$db.$TYPE.sql ;;
  493. esac
  494. done
  495. echo
  496. msg="$msg\n"
  497. fi
  498. # Cron
  499. if [ "$cron" != 'no' ]; then
  500. echo "-- CRON --"
  501. msg="$msg\n-- CRON --"
  502. echo -e "$(date "+%F %T") $db"
  503. msg="$msg\n$(date "+%F %T") $db"
  504. # unpack cron container
  505. tar xf $BACKUP/$backup -C $tmpdir ./cron
  506. if [ "$?" -ne 0 ]; then
  507. echo "Error: can't unpack cron contaner"
  508. echo "Can't unpack cron contaner" | $send_mail -s "$subj" $email
  509. rm -rf $tmpdir
  510. exit $E_PARSING
  511. fi
  512. # Restore cron records
  513. cp $tmpdir/cron/cron.conf $USER_DATA/cron.conf
  514. # Rebuild cron
  515. sync_cron_jobs
  516. echo
  517. msg="$msg\n"
  518. fi
  519. # Restore user directories
  520. if [ "$udir" != 'no' ]; then
  521. echo "-- USER DIR --"
  522. msg="$msg\n-- USER DIR --"
  523. # unpack user dir container
  524. if [ ! -z "$(tar -tf $BACKUP/$backup |grep './user_dir')" ]; then
  525. # Create user dir list
  526. udir_list=$(tar -tf $BACKUP/$backup | grep "^./user_dir" |\
  527. grep tar.gz | cut -f 3 -d '/' | sed -e "s/.tar.gz//")
  528. if [ ! -z "$udir" ]; then
  529. udir_include_list=$(mktemp)
  530. for udir_include in ${udir//,/ }; do
  531. echo "^$udir_include$" >> $udir_include_list
  532. done
  533. udir_list=$(echo "$udir_list" | egrep -f $udir_include_list )
  534. rm -f $udir_include_list
  535. fi
  536. for user_dir in $udir_list; do
  537. echo -e "$(date "+%F %T") $user_dir"
  538. msg="$msg\n$(date "+%F %T") $user_dir"
  539. # unpack user_dir container
  540. tar xf $BACKUP/$backup -C $tmpdir ./user_dir/$user_dir.tar.gz
  541. if [ "$?" -ne 0 ]; then
  542. echo "Error: can't unpack $user_dir user dir contaner"
  543. echo "Can't unpack $user_dir user dir contaner" |\
  544. $send_mail -s "$subj" $email
  545. rm -rf $tmpdir
  546. exit $E_PARSING
  547. fi
  548. tar xzf $tmpdir/user_dir/$user_dir.tar.gz -C $HOMEDIR/$user
  549. if [ "$?" -ne 0 ]; then
  550. echo "Error: can't unpack $user_dir user dir contaner"
  551. echo "Can't unpack $user_dir user dir contaner" |\
  552. $send_mail -s "$subj" $email
  553. rm -rf $tmpdir
  554. exit $E_PARSING
  555. fi
  556. done
  557. fi
  558. echo
  559. msg="$msg\n"
  560. fi
  561. # Remove temporary data
  562. rm -rf $tmpdir
  563. # Clean restore queue
  564. sed -i "/v-restore-user $user /d" $VESTA/data/queue/backup.pipe
  565. # Send notification
  566. if [ "$notify" != 'no' ]; then
  567. subj="$user → restore has been completed"
  568. email=$(get_user_value '$CONTACT')
  569. echo -e "$msg" | $send_mail -s "$subj" $email
  570. fi
  571. #----------------------------------------------------------#
  572. # Vesta #
  573. #----------------------------------------------------------#
  574. # Update user counters
  575. $BIN/v-update-user-counters $user
  576. # Logging
  577. log_event "$OK" "$EVENT"
  578. exit