rebuild.sh 25 KB

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