rebuild.sh 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. # User account rebuild
  2. rebuild_user_conf() {
  3. # Get user variables
  4. source $USER_DATA/user.conf
  5. # Creating user data files
  6. chmod 770 $USER_DATA
  7. chmod 660 $USER_DATA/user.conf
  8. touch $USER_DATA/backup.conf
  9. chmod 660 $USER_DATA/backup.conf
  10. touch $USER_DATA/history.log
  11. chmod 660 $USER_DATA/history.log
  12. touch $USER_DATA/stats.log
  13. chmod 660 $USER_DATA/stats.log
  14. # Run template trigger
  15. if [ -x "$VESTA/data/packages/$PACKAGE.sh" ]; then
  16. $VESTA/data/packages/$PACKAGE.sh "$user" "$CONTACT" "$FNAME" "$LNAME"
  17. fi
  18. # Rebuild user
  19. shell=$(grep -w "$SHELL" /etc/shells |head -n1)
  20. /usr/sbin/useradd "$user" -s "$shell" -c "$CONTACT" \
  21. -m -d "$HOMEDIR/$user" > /dev/null 2>&1
  22. # Update user shell
  23. /usr/bin/chsh -s "$shell" "$user" &>/dev/null
  24. # Update password
  25. shadow=$(grep ^$user: /etc/shadow)
  26. shdw3=$(echo "$shadow" | cut -f3 -d :)
  27. shdw4=$(echo "$shadow" | cut -f4 -d :)
  28. shdw5=$(echo "$shadow" | cut -f5 -d :)
  29. shdw6=$(echo "$shadow" | cut -f6 -d :)
  30. shdw7=$(echo "$shadow" | cut -f7 -d :)
  31. shdw8=$(echo "$shadow" | cut -f8 -d :)
  32. shdw9=$(echo "$shadow" | cut -f9 -d :)
  33. shadow_str="$user:$MD5:$shdw3:$shdw4:$shdw5:$shdw6"
  34. shadow_str="$shadow_str:$shdw7:$shdw8:$shdw9"
  35. chmod u+w /etc/shadow
  36. sed -i "/^$user:*/d" /etc/shadow
  37. echo "$shadow_str" >> /etc/shadow
  38. chmod u-w /etc/shadow
  39. # Building directory tree
  40. if [ -e "$HOMEDIR/$user/conf" ]; then
  41. chattr -i $HOMEDIR/$user/conf
  42. fi
  43. mkdir -p $HOMEDIR/$user/conf
  44. chmod a+x $HOMEDIR/$user
  45. chmod a+x $HOMEDIR/$user/conf
  46. chown $user:$user $HOMEDIR/$user
  47. chown root:root $HOMEDIR/$user/conf
  48. # Update disk pipe
  49. sed -i "/ $user$/d" $VESTA/data/queue/disk.pipe
  50. echo "$BIN/v-update-user-disk $user" >> $VESTA/data/queue/disk.pipe
  51. # WEB
  52. if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB_SYSTEM" != 'no' ]; then
  53. mkdir -p $USER_DATA/ssl
  54. chmod 770 $USER_DATA/ssl
  55. touch $USER_DATA/web.conf
  56. chmod 660 $USER_DATA/web.conf
  57. if [ "$(grep -w $user $VESTA/data/queue/traffic.pipe)" ]; then
  58. echo "$BIN/v-update-web-domains-traff $user" \
  59. >> $VESTA/data/queue/traffic.pipe
  60. fi
  61. echo "$BIN/v-update-web-domains-disk $user" \
  62. >> $VESTA/data/queue/disk.pipe
  63. mkdir -p $HOMEDIR/$user/conf/web
  64. mkdir -p $HOMEDIR/$user/web
  65. mkdir -p $HOMEDIR/$user/tmp
  66. chmod 751 $HOMEDIR/$user/conf/web
  67. chmod 751 $HOMEDIR/$user/web
  68. chmod 771 $HOMEDIR/$user/tmp
  69. chown $user:$user $HOMEDIR/$user/web
  70. if [ -z "$create_user" ]; then
  71. $BIN/v-rebuild-web-domains $user $restart
  72. fi
  73. fi
  74. # DNS
  75. if [ ! -z "$DNS_SYSTEM" ] && [ "$DNS_SYSTEM" != 'no' ]; then
  76. mkdir -p $USER_DATA/dns
  77. chmod 770 $USER_DATA/dns
  78. touch $USER_DATA/dns.conf
  79. chmod 660 $USER_DATA/dns.conf
  80. mkdir -p $HOMEDIR/$user/conf/dns
  81. chmod 751 $HOMEDIR/$user/conf/dns
  82. if [ -z "$create_user" ]; then
  83. $BIN/v-rebuild-dns-domains $user $restart
  84. fi
  85. fi
  86. if [ ! -z "$MAIL_SYSTEM" ] && [ "$MAIL_SYSTEM" != 'no' ]; then
  87. mkdir -p $USER_DATA/mail
  88. chmod 770 $USER_DATA/mail
  89. touch $USER_DATA/mail.conf
  90. chmod 660 $USER_DATA/mail.conf
  91. echo "$BIN/v-update-mail-domains-disk $user" \
  92. >> $VESTA/data/queue/disk.pipe
  93. mkdir -p $HOMEDIR/$user/conf/mail
  94. mkdir -p $HOMEDIR/$user/mail
  95. chmod 751 $HOMEDIR/$user/mail
  96. chmod 751 $HOMEDIR/$user/conf/mail
  97. if [ -z "$create_user" ]; then
  98. $BIN/v-rebuild-mail-domains $user
  99. fi
  100. fi
  101. if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'no' ]; then
  102. touch $USER_DATA/db.conf
  103. chmod 660 $USER_DATA/db.conf
  104. echo "$BIN/v-update-databases-disk $user" >> $VESTA/data/queue/disk.pipe
  105. if [ -z "$create_user" ]; then
  106. $BIN/v-rebuild-databases $user
  107. fi
  108. fi
  109. if [ ! -z "$CRON_SYSTEM" ] && [ "$CRON_SYSTEM" != 'no' ]; then
  110. touch $USER_DATA/cron.conf
  111. chmod 660 $USER_DATA/cron.conf
  112. if [ -z "$create_user" ]; then
  113. $BIN/v-rebuild-cron-jobs $user $restart
  114. fi
  115. fi
  116. # Set immutable flag
  117. chattr +i $HOMEDIR/$user/conf
  118. }
  119. # WEB domain rebuild
  120. rebuild_web_domain_conf() {
  121. get_domain_values 'web'
  122. is_ip_valid $IP
  123. prepare_web_domain_values
  124. # Rebuilding domain directories
  125. mkdir -p $HOMEDIR/$user/web/$domain \
  126. $HOMEDIR/$user/web/$domain/public_html \
  127. $HOMEDIR/$user/web/$domain/public_shtml \
  128. $HOMEDIR/$user/web/$domain/document_errors \
  129. $HOMEDIR/$user/web/$domain/cgi-bin \
  130. $HOMEDIR/$user/web/$domain/private \
  131. $HOMEDIR/$user/web/$domain/stats \
  132. $HOMEDIR/$user/web/$domain/logs
  133. # Creating domain logs
  134. if [ ! -e "/var/log/$WEB_SYSTEM/domains" ]; then
  135. mkdir -p /var/log/$WEB_SYSTEM/domains
  136. chmod 771 /var/log/$WEB_SYSTEM/domains
  137. fi
  138. touch /var/log/$WEB_SYSTEM/domains/$domain.bytes \
  139. /var/log/$WEB_SYSTEM/domains/$domain.log \
  140. /var/log/$WEB_SYSTEM/domains/$domain.error.log
  141. # Creating symlinks
  142. cd $HOMEDIR/$user/web/$domain/logs/
  143. ln -f -s /var/log/$WEB_SYSTEM/domains/$domain.log .
  144. ln -f -s /var/log/$WEB_SYSTEM/domains/$domain.error.log .
  145. cd /
  146. # Propagating html skeleton
  147. if [ ! -e "$WEBTPL/skel/document_errors/" ]; then
  148. cp -r $WEBTPL/skel/document_errors/ $HOMEDIR/$user/web/$domain/
  149. fi
  150. # Set folder permissions
  151. chmod 551 $HOMEDIR/$user/web/$domain \
  152. $HOMEDIR/$user/web/$domain/stats \
  153. $HOMEDIR/$user/web/$domain/logs
  154. chmod 751 $HOMEDIR/$user/web/$domain/private \
  155. $HOMEDIR/$user/web/$domain/cgi-bin \
  156. $HOMEDIR/$user/web/$domain/public_html \
  157. $HOMEDIR/$user/web/$domain/public_shtml \
  158. $HOMEDIR/$user/web/$domain/document_errors
  159. chmod 640 /var/log/$WEB_SYSTEM/domains/$domain.*
  160. # Set ownership
  161. chown $user:$user $HOMEDIR/$user/web/$domain \
  162. $HOMEDIR/$user/web/$domain/private \
  163. $HOMEDIR/$user/web/$domain/cgi-bin \
  164. $HOMEDIR/$user/web/$domain/public_html \
  165. $HOMEDIR/$user/web/$domain/public_shtml
  166. chown -R $user:$user $HOMEDIR/$user/web/$domain/document_errors
  167. chown root:$user /var/log/$WEB_SYSTEM/domains/$domain.*
  168. # Adding vhost configuration
  169. conf="$HOMEDIR/$user/conf/web/$WEB_SYSTEM.conf"
  170. add_web_config "$WEB_SYSTEM" "$TPL.tpl"
  171. # Adding SSL vhost configuration
  172. if [ "$SSL" = 'yes' ]; then
  173. conf="$HOMEDIR/$user/conf/web/s$WEB_SYSTEM.conf"
  174. add_web_config "$WEB_SYSTEM" "$TPL.stpl"
  175. cp -f $USER_DATA/ssl/$domain.crt \
  176. $HOMEDIR/$user/conf/web/ssl.$domain.crt
  177. cp -f $USER_DATA/ssl/$domain.key \
  178. $HOMEDIR/$user/conf/web/ssl.$domain.key
  179. cp -f $USER_DATA/ssl/$domain.pem \
  180. $HOMEDIR/$user/conf/web/ssl.$domain.pem
  181. if [ -e "$USER_DATA/ssl/$domain.ca" ]; then
  182. cp -f $USER_DATA/ssl/$domain.ca \
  183. $HOMEDIR/$user/conf/web/ssl.$domain.ca
  184. fi
  185. fi
  186. # Adding proxy configuration
  187. if [ ! -z "$PROXY_SYSTEM" ] && [ ! -z "$PROXY" ]; then
  188. conf="$HOMEDIR/$user/conf/web/$PROXY_SYSTEM.conf"
  189. add_web_config "$PROXY_SYSTEM" "$PROXY.tpl"
  190. if [ "$SSL" = 'yes' ]; then
  191. conf="$HOMEDIR/$user/conf/web/s$PROXY_SYSTEM.conf"
  192. add_web_config "$PROXY_SYSTEM" "$PROXY.stpl"
  193. fi
  194. fi
  195. # Adding web stats parser
  196. if [ ! -z "$STATS" ]; then
  197. domain_idn=$domain
  198. format_domain_idn
  199. cat $WEBTPL/$STATS/$STATS.tpl |\
  200. sed -e "s|%ip%|$local_ip|g" \
  201. -e "s|%web_system%|$WEB_SYSTEM|g" \
  202. -e "s|%domain_idn%|$domain_idn|g" \
  203. -e "s|%domain%|$domain|g" \
  204. -e "s|%user%|$user|g" \
  205. -e "s|%home%|$HOMEDIR|g" \
  206. -e "s|%alias%|${aliases//,/ }|g" \
  207. -e "s|%alias_idn%|${aliases_idn//,/ }|g" \
  208. > $HOMEDIR/$user/conf/web/$STATS.$domain.conf
  209. if [ "$STATS" == 'awstats' ]; then
  210. if [ ! -e "/etc/awstats/$STATS.$domain_idn.conf" ]; then
  211. ln -f -s $HOMEDIR/$user/conf/web/$STATS.$domain.conf \
  212. /etc/awstats/$STATS.$domain_idn.conf
  213. fi
  214. fi
  215. webstats="$BIN/v-update-web-domain-stat $user $domain"
  216. check_webstats=$(grep "$webstats" $VESTA/data/queue/webstats.pipe)
  217. if [ -z "$check_webstats" ]; then
  218. echo "$webstats" >> $VESTA/data/queue/webstats.pipe
  219. fi
  220. if [ ! -z "$STATS_USER" ]; then
  221. stats_dir="$HOMEDIR/$user/web/$domain/stats"
  222. if [ "$WEB_SYSTEM" = 'nginx' ]; then
  223. echo "auth_basic \"Web Statistics\";" > $stats_dir/auth.conf
  224. echo "auth_basic_user_file $stats_dir/.htpasswd;" >> \
  225. $stats_dir/auth.conf
  226. else
  227. echo "AuthUserFile $stats_dir/.htpasswd" > $stats_dir/.htaccess
  228. echo "AuthName \"Web Statistics\"" >> $stats_dir/.htaccess
  229. echo "AuthType Basic" >> $stats_dir/.htaccess
  230. echo "Require valid-user" >> $stats_dir/.htaccess
  231. fi
  232. echo "$STATS_USER:$STATS_CRYPT" > $stats_dir/.htpasswd
  233. fi
  234. fi
  235. # Adding ftp users
  236. if [ -z "$FTP_SHELL" ]; then
  237. shell=$(which nologin)
  238. if [ -e "/usr/bin/rssh" ]; then
  239. shell='/usr/bin/rssh'
  240. fi
  241. else
  242. shell=$FTP_SHELL
  243. fi
  244. for ftp_user in ${FTP_USER//:/ }; do
  245. if [ -z "$(grep ^$ftp_user: /etc/passwd)" ]; then
  246. position=$(echo $FTP_USER |tr ':' '\n' |grep -n '' |\
  247. grep ":$ftp_user$" |cut -f 1 -d:)
  248. ftp_path=$(echo $FTP_PATH |tr ':' '\n' |grep -n '' |\
  249. grep "^$position:" |cut -f 2 -d :)
  250. ftp_md5=$(echo $FTP_MD5 | tr ':' '\n' |grep -n '' |\
  251. grep "^$position:" |cut -f 2 -d :)
  252. /usr/sbin/useradd $ftp_user \
  253. -s $shell \
  254. -o -u $(id -u $user) \
  255. -g $(id -u $user) \
  256. -M -d "$HOMEDIR/$user/web/$domain${ftp_path}" >/dev/null 2>&1
  257. # Updating ftp user password
  258. shadow=$(grep "^$ftp_user:" /etc/shadow)
  259. shdw3=$(echo "$shadow" |cut -f3 -d :)
  260. shdw4=$(echo "$shadow" |cut -f4 -d :)
  261. shdw5=$(echo "$shadow" |cut -f5 -d :)
  262. shdw6=$(echo "$shadow" |cut -f6 -d :)
  263. shdw7=$(echo "$shadow" |cut -f7 -d :)
  264. shdw8=$(echo "$shadow" |cut -f8 -d :)
  265. shdw9=$(echo "$shadow" |cut -f9 -d :)
  266. shadow_str="$ftp_user:$ftp_md5:$shdw3:$shdw4:$shdw5:$shdw6"
  267. shadow_str="$shadow_str:$shdw7:$shdw8:$shdw9"
  268. chmod u+w /etc/shadow
  269. sed -i "/^$ftp_user:*/d" /etc/shadow
  270. echo "$shadow_str" >> /etc/shadow
  271. chmod u-w /etc/shadow
  272. fi
  273. done
  274. # Adding http auth protection
  275. htaccess="$HOMEDIR/$user/conf/web/$WEB_SYSTEM.$domain.conf_htaccess"
  276. htpasswd="$HOMEDIR/$user/conf/web/$WEB_SYSTEM.$domain.htpasswd"
  277. docroot="$HOMEDIR/$user/web/$domain/public_html"
  278. for auth_user in ${AUTH_USER//:/ }; do
  279. # Parsing auth user variables
  280. position=$(echo $AUTH_USER |tr ':' '\n' |grep -n '' |\
  281. grep ":$auth_user$" |cut -f 1 -d:)
  282. auth_hash=$(echo $AUTH_HASH |tr ':' '\n' |grep -n '' |\
  283. grep "^$position:" |cut -f 2 -d :)
  284. # Adding http auth user
  285. touch $htpasswd
  286. sed -i "/^$auth_user:/d" $htpasswd
  287. echo "$auth_user:$auth_hash" >> $htpasswd
  288. # Checking web server include
  289. if [ ! -e "$htaccess" ]; then
  290. if [ "$WEB_SYSTEM" != 'nginx' ]; then
  291. echo "<Directory $docroot>" > $htaccess
  292. echo " AuthUserFile $htpasswd" >> $htaccess
  293. echo " AuthName \"$domain access\"" >> $htaccess
  294. echo " AuthType Basic" >> $htaccess
  295. echo " Require valid-user" >> $htaccess
  296. echo "</Directory>" >> $htaccess
  297. else
  298. echo "auth_basic \"$domain password access\";" > $htaccess
  299. echo "auth_basic_user_file $htpasswd;" >> $htaccess
  300. fi
  301. chmod 640 $htpasswd $htaccess >/dev/null 2>&1
  302. fi
  303. done
  304. }
  305. # DNS domain rebuild
  306. rebuild_dns_domain_conf() {
  307. # Get domain values
  308. get_domain_values 'dns'
  309. domain_idn=$(idn -t --quiet -a "$domain")
  310. # Checking zone file
  311. if [ ! -e "$USER_DATA/dns/$domain.conf" ]; then
  312. cat $DNSTPL/$TPL.tpl |\
  313. sed -e "s/%ip%/$IP/g" \
  314. -e "s/%domain_idn%/$domain_idn/g" \
  315. -e "s/%domain%/$domain/g" \
  316. -e "s/%ns1%/$ns1/g" \
  317. -e "s/%ns2%/$ns2/g" \
  318. -e "s/%ns3%/$ns3/g" \
  319. -e "s/%ns4%/$ns4/g" \
  320. -e "s/%time%/$TIME/g" \
  321. -e "s/%date%/$DATE/g" > $USER_DATA/dns/$domain.conf
  322. fi
  323. # Sorting records
  324. sort_dns_records
  325. # Updating zone
  326. update_domain_zone
  327. # Set permissions
  328. if [ "$DNS_SYSTEM" = 'named' ]; then
  329. dns_group='named'
  330. else
  331. dns_group='bind'
  332. fi
  333. # Set file permissions
  334. chmod 640 $HOMEDIR/$user/conf/dns/$domain.db
  335. chown root:$dns_group $HOMEDIR/$user/conf/dns/$domain.db
  336. # Get dns config path
  337. if [ -e '/etc/named.conf' ]; then
  338. dns_conf='/etc/named.conf'
  339. fi
  340. if [ -e '/etc/bind/named.conf' ]; then
  341. dns_conf='/etc/bind/named.conf'
  342. fi
  343. # Bind config check
  344. if [ "$SUSPENDED" = 'yes' ]; then
  345. rm_string=$(grep -n /etc/namedb/$domain.db $dns_conf | cut -d : -f 1)
  346. if [ ! -z "$rm_string" ]; then
  347. sed -i "$rm_string d" $dns_conf
  348. fi
  349. suspended_dns=$((suspended_dns + 1))
  350. else
  351. if [ -z "$(grep /$domain.db $dns_conf)" ]; then
  352. named="zone \"$domain_idn\" {type master; file"
  353. named="$named \"$HOMEDIR/$user/conf/dns/$domain.db\";};"
  354. echo "$named" >> $dns_conf
  355. fi
  356. fi
  357. user_domains=$((user_domains + 1))
  358. records=$(wc -l $USER_DATA/dns/$domain.conf | cut -f 1 -d ' ')
  359. user_records=$((user_records + records))
  360. update_object_value 'dns' 'DOMAIN' "$domain" '$RECORDS' "$records"
  361. }
  362. # MAIL domain rebuild
  363. rebuild_mail_domain_conf() {
  364. get_domain_values 'mail'
  365. if [[ "$domain" = *[![:ascii:]]* ]]; then
  366. domain_idn=$(idn -t --quiet -a $domain)
  367. else
  368. domain_idn=$domain
  369. fi
  370. if [ "$SUSPENDED" = 'yes' ]; then
  371. SUSPENDED_MAIL=$((SUSPENDED_MAIL +1))
  372. fi
  373. # Rebuilding exim config structure
  374. if [[ "$MAIL_SYSTEM" =~ exim ]]; then
  375. rm -f /etc/$MAIL_SYSTEM/domains/$domain_idn
  376. mkdir -p $HOMEDIR/$user/conf/mail/$domain
  377. ln -s $HOMEDIR/$user/conf/mail/$domain \
  378. /etc/$MAIL_SYSTEM/domains/$domain_idn
  379. rm -f $HOMEDIR/$user/conf/mail/$domain/aliases
  380. rm -f $HOMEDIR/$user/conf/mail/$domain/antispam
  381. rm -f $HOMEDIR/$user/conf/mail/$domain/antivirus
  382. rm -f $HOMEDIR/$user/conf/mail/$domain/protection
  383. rm -f $HOMEDIR/$user/conf/mail/$domain/passwd
  384. rm -f $HOMEDIR/$user/conf/mail/$domain/fwd_only
  385. touch $HOMEDIR/$user/conf/mail/$domain/aliases
  386. touch $HOMEDIR/$user/conf/mail/$domain/passwd
  387. touch $HOMEDIR/$user/conf/mail/$domain/fwd_only
  388. # Adding antispam protection
  389. if [ "$ANTISPAM" = 'yes' ]; then
  390. touch $HOMEDIR/$user/conf/mail/$domain/antispam
  391. fi
  392. # Adding antivirus protection
  393. if [ "$ANTIVIRUS" = 'yes' ]; then
  394. touch $HOMEDIR/$user/conf/mail/$domain/antivirus
  395. fi
  396. # Adding dkim
  397. if [ "$DKIM" = 'yes' ]; then
  398. cp $USER_DATA/mail/$domain.pem \
  399. $HOMEDIR/$user/conf/mail/$domain/dkim.pem
  400. fi
  401. # Removing symbolic link if domain is suspended
  402. if [ "$SUSPENDED" = 'yes' ]; then
  403. rm -f /etc/exim/domains/$domain_idn
  404. fi
  405. # Adding mail directiry
  406. if [ ! -e $HOMEDIR/$user/mail/$domain_idn ]; then
  407. mkdir $HOMEDIR/$user/mail/$domain_idn
  408. fi
  409. # Adding catchall email
  410. dom_aliases=$HOMEDIR/$user/conf/mail/$domain/aliases
  411. if [ ! -z "$CATCHALL" ]; then
  412. echo "*@$domain_idn:$CATCHALL" >> $dom_aliases
  413. fi
  414. fi
  415. # Rebuild domain accounts
  416. accs=0
  417. dom_diks=0
  418. if [ -e "$USER_DATA/mail/$domain.conf" ]; then
  419. accounts=$(search_objects "mail/$domain" 'SUSPENDED' "no" 'ACCOUNT')
  420. else
  421. accounts=''
  422. fi
  423. for account in $accounts; do
  424. (( ++accs))
  425. dom_diks=$((dom_diks + U_DISK))
  426. object=$(grep "ACCOUNT='$account'" $USER_DATA/mail/$domain.conf)
  427. FWD_ONLY='no'
  428. eval "$object"
  429. if [ "$SUSPENDED" = 'yes' ]; then
  430. MD5='SUSPENDED'
  431. fi
  432. if [[ "$MAIL_SYSTEM" =~ exim ]]; then
  433. if [ "$QUOTA" = 'unlimited' ]; then
  434. QUOTA=0
  435. fi
  436. str="$account:$MD5:$user:mail::$HOMEDIR/$user:$QUOTA"
  437. echo $str >> $HOMEDIR/$user/conf/mail/$domain/passwd
  438. for malias in ${ALIAS//,/ }; do
  439. echo "$malias@$domain_idn:$account@$domain_idn" >> $dom_aliases
  440. done
  441. if [ ! -z "$FWD" ]; then
  442. echo "$account@$domain_idn:$FWD" >> $dom_aliases
  443. fi
  444. if [ "$FWD_ONLY" = 'yes' ]; then
  445. echo "$account" >> $HOMEDIR/$user/conf/mail/$domain/fwd_only
  446. fi
  447. fi
  448. done
  449. # Set permissions and ownership
  450. if [[ "$MAIL_SYSTEM" =~ exim ]]; then
  451. chmod 660 $USER_DATA/mail/$domain.*
  452. chmod 771 $HOMEDIR/$user/conf/mail/$domain
  453. chmod 660 $HOMEDIR/$user/conf/mail/$domain/*
  454. chmod 771 /etc/$MAIL_SYSTEM/domains/$domain_idn
  455. chmod 770 $HOMEDIR/$user/mail/$domain_idn
  456. chown -R $MAIL_USER:mail $HOMEDIR/$user/conf/mail/$domain
  457. chown -R dovecot:mail $HOMEDIR/$user/conf/mail/$domain/passwd
  458. chown $user:mail $HOMEDIR/$user/mail/$domain_idn
  459. fi
  460. # Update counters
  461. update_object_value 'mail' 'DOMAIN' "$domain" '$ACCOUNTS' "$accs"
  462. update_object_value 'mail' 'DOMAIN' "$domain" '$U_DISK' "$dom_diks"
  463. U_MAIL_ACCOUNTS=$((U_MAIL_ACCOUNTS + accs))
  464. U_DISK_MAIL=$((U_DISK_MAIL + dom_diks))
  465. U_MAIL_DOMAINS=$((U_MAIL_DOMAINS + 1))
  466. }
  467. # Rebuild MySQL
  468. rebuild_mysql_database() {
  469. mysql_connect $HOST
  470. mysql_query "CREATE DATABASE \`$DB\` CHARACTER SET $CHARSET" >/dev/null
  471. if [ "$(echo $mysql_ver |cut -d '.' -f2)" -ge 7 ]; then
  472. mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`" >/dev/null
  473. mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`@localhost" >/dev/null
  474. query="UPDATE mysql.user SET authentication_string='$MD5'"
  475. query="$query WHERE User='$DBUSER'"
  476. else
  477. query="UPDATE mysql.user SET Password='$MD5' WHERE User='$DBUSER'"
  478. fi
  479. mysql_query "GRANT ALL ON \`$DB\`.* TO \`$DBUSER\`@\`%\`" >/dev/null
  480. mysql_query "GRANT ALL ON \`$DB\`.* TO \`$DBUSER\`@localhost" >/dev/null
  481. mysql_query "$query" >/dev/null
  482. mysql_query "FLUSH PRIVILEGES" >/dev/null
  483. }
  484. # Rebuild PostgreSQL
  485. rebuild_pgsql_database() {
  486. host_str=$(grep "HOST='$HOST'" $VESTA/conf/pgsql.conf)
  487. eval $host_str
  488. export PGPASSWORD="$PASSWORD"
  489. if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
  490. echo "Error: postgresql config parsing failed"
  491. if [ ! -z "$SENDMAIL" ]; then
  492. echo "Can't parse PostgreSQL config" | $SENDMAIL -s "$subj" $email
  493. fi
  494. log_event "$E_PARSING" "$ARGUMENTS"
  495. exit $E_PARSING
  496. fi
  497. query='SELECT VERSION()'
  498. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  499. if [ '0' -ne "$?" ]; then
  500. echo "Error: Connection failed"
  501. if [ ! -z "$SENDMAIL" ]; then
  502. echo "Database connection to PostgreSQL host $HOST failed" |\
  503. $SENDMAIL -s "$subj" $email
  504. fi
  505. log_event "$E_CONNECT" "$ARGUMENTS"
  506. exit $E_CONNECT
  507. fi
  508. query="CREATE ROLE $DBUSER"
  509. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  510. query="UPDATE pg_authid SET rolpassword='$MD5' WHERE rolname='$DBUSER'"
  511. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  512. query="CREATE DATABASE $DB OWNER $DBUSER"
  513. if [ "$TPL" = 'template0' ]; then
  514. query="$query ENCODING '$CHARSET' TEMPLATE $TPL"
  515. else
  516. query="$query TEMPLATE $TPL"
  517. fi
  518. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  519. query="GRANT ALL PRIVILEGES ON DATABASE $DB TO $DBUSER"
  520. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  521. query="GRANT CONNECT ON DATABASE template1 to $dbuser"
  522. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  523. }
  524. # Import MySQL dump
  525. import_mysql_database() {
  526. host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf)
  527. eval $host_str
  528. if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
  529. echo "Error: mysql config parsing failed"
  530. log_event "$E_PARSING" "$ARGUMENTS"
  531. exit $E_PARSING
  532. fi
  533. mysql -h $HOST -u $USER -p$PASSWORD $DB < $1 > /dev/null 2>&1
  534. }
  535. # Import PostgreSQL dump
  536. import_pgsql_database() {
  537. host_str=$(grep "HOST='$HOST'" $VESTA/conf/pgsql.conf)
  538. eval $host_str
  539. export PGPASSWORD="$PASSWORD"
  540. if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
  541. echo "Error: postgresql config parsing failed"
  542. log_event "$E_PARSING" "$ARGUMENTS"
  543. exit $E_PARSING
  544. fi
  545. psql -h $HOST -U $USER $DB < $1 > /dev/null 2>&1
  546. }