v-restore-user 27 KB

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