v-restore-user 26 KB

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