rebuild.sh 24 KB

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