rebuild.sh 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  1. #!/bin/bash
  2. #===========================================================================#
  3. # #
  4. # Hestia Control Panel - Rebuild Function Library #
  5. # #
  6. #===========================================================================#
  7. # User account rebuild
  8. rebuild_user_conf() {
  9. sanitize_config_file "user"
  10. # Get user variables
  11. source_conf "$USER_DATA/user.conf"
  12. # Creating user data files
  13. chmod 770 $USER_DATA
  14. chmod 660 $USER_DATA/user.conf
  15. touch $USER_DATA/backup.conf
  16. chmod 660 $USER_DATA/backup.conf
  17. touch $USER_DATA/history.log
  18. chmod 660 $USER_DATA/history.log
  19. touch $USER_DATA/stats.log
  20. chmod 660 $USER_DATA/stats.log
  21. # Update FNAME LNAME to NAME
  22. if [ -z "$NAME" ]; then
  23. NAME="$FNAME $LNAME"
  24. if [ -z $FNAME ]; then NAME=""; fi
  25. sed -i "s/FNAME='$FNAME'/NAME='$NAME'/g" $USER_DATA/user.conf
  26. sed -i "/LNAME='$LNAME'/d" $USER_DATA/user.conf
  27. fi
  28. if [ -z "${TWOFA+x}" ]; then
  29. sed -i "/RKEY/a TWOFA=''" $USER_DATA/user.conf
  30. fi
  31. if [ -z "${QRCODE+x}" ]; then
  32. sed -i "/TWOFA/a QRCODE=''" $USER_DATA/user.conf
  33. fi
  34. if [ -z "${PHPCLI+x}" ]; then
  35. sed -i "/QRCODE/a PHPCLI=''" $USER_DATA/user.conf
  36. fi
  37. if [ -z "${ROLE+x}" ]; then
  38. sed -i "/PHPCLI/a ROLE='user'" $USER_DATA/user.conf
  39. fi
  40. if [ -z "${THEME+x}" ]; then
  41. sed -i "/LANGUAGE/a THEME=''" $USER_DATA/user.conf
  42. fi
  43. if [ -z "${PREF_UI_SORT+x}" ]; then
  44. sed -i "/NOTIFICATIONS/a PREF_UI_SORT='name'" $USER_DATA/user.conf
  45. fi
  46. if [ -z "${LOGIN_DISABLED+x}" ]; then
  47. sed -i "/PREF_UI_SORT/a LOGIN_DISABLED=''" $USER_DATA/user.conf
  48. fi
  49. if [ -z "${LOGIN_USE_IPLIST+x}" ]; then
  50. sed -i "/LOGIN_DISABLED/a LOGIN_USE_IPLIST=''" $USER_DATA/user.conf
  51. fi
  52. if [ -z "${LOGIN_ALLOW_IPS+x}" ]; then
  53. sed -i "/LOGIN_USE_IPLIST/a LOGIN_ALLOW_IPS=''" $USER_DATA/user.conf
  54. fi
  55. if [ -z "${RATE_LIMIT+x}" ]; then
  56. sed -i "/MAIL_ACCOUNTS/a RATE_LIMIT='200'" $USER_DATA/user.conf
  57. fi
  58. if [ -z "${SHELL_JAIL_ENABLED+x}" ]; then
  59. sed -i "/SHELL/a SHELL_JAIL_ENABLED='no'" $USER_DATA/user.conf
  60. fi
  61. # Run template trigger
  62. if [ -x "$HESTIA/data/packages/$PACKAGE.sh" ]; then
  63. $HESTIA/data/packages/$PACKAGE.sh "$user" "$CONTACT" "$NAME"
  64. fi
  65. # Rebuild user
  66. shell=$(grep -w "$SHELL" /etc/shells | head -n1)
  67. /usr/sbin/useradd "$user" -s "$shell" -c "$CONTACT" \
  68. -m -d "$HOMEDIR/$user" > /dev/null 2>&1
  69. # Add a general group for normal users created by Hestia
  70. if [ -z "$(grep "^hestia-users:" /etc/group)" ]; then
  71. groupadd --system "hestia-users"
  72. fi
  73. # Add membership to hestia-users group to non-admin users
  74. if [ "$user" = "$ROOT_USER" ]; then
  75. setfacl -m "g:$ROOT_USER:r-x" "$HOMEDIR/$user"
  76. else
  77. usermod -a -G "hestia-users" "$user"
  78. setfacl -m "u:$user:r-x" "$HOMEDIR/$user"
  79. fi
  80. setfacl -m "g:hestia-users:---" "$HOMEDIR/$user"
  81. # Update user shell
  82. /usr/bin/chsh -s "$shell" "$user" &> /dev/null
  83. # Update password
  84. chmod u+w /etc/shadow
  85. sed -i "s|^$user:[^:]*:|$user:$MD5:|" /etc/shadow
  86. chmod u-w /etc/shadow
  87. # Building directory tree
  88. if [ -e "$HOMEDIR/$user/conf" ]; then
  89. chattr -i $HOMEDIR/$user/conf > /dev/null 2>&1
  90. fi
  91. # Create default writeable folders
  92. mkdir -p \
  93. $HOMEDIR/$user/conf \
  94. $HOMEDIR/$user/.config \
  95. $HOMEDIR/$user/.cache \
  96. $HOMEDIR/$user/.local \
  97. $HOMEDIR/$user/.composer \
  98. $HOMEDIR/$user/.vscode-server \
  99. $HOMEDIR/$user/.ssh \
  100. $HOMEDIR/$user/.npm \
  101. $HOMEDIR/$user/.wp-cli
  102. chmod a+x $HOMEDIR/$user
  103. chmod a+x $HOMEDIR/$user/conf
  104. chown --no-dereference $user:$user \
  105. $HOMEDIR/$user \
  106. $HOMEDIR/$user/.config \
  107. $HOMEDIR/$user/.cache \
  108. $HOMEDIR/$user/.local \
  109. $HOMEDIR/$user/.composer \
  110. $HOMEDIR/$user/.vscode-server \
  111. $HOMEDIR/$user/.ssh \
  112. $HOMEDIR/$user/.npm \
  113. $HOMEDIR/$user/.wp-cli
  114. chown root:root $HOMEDIR/$user/conf
  115. $BIN/v-add-user-sftp-jail "$user"
  116. # Check if SHELL_JAIL_ENABLED
  117. if [ "$SHELL_JAIL_ENABLED" == "yes" ]; then
  118. $BIN/v-add-user-ssh-jail "$user"
  119. fi
  120. # Update disk pipe
  121. sed -i "/ $user$/d" $HESTIA/data/queue/disk.pipe
  122. echo "$BIN/v-update-user-disk $user" >> $HESTIA/data/queue/disk.pipe
  123. # WEB
  124. if [ -n "$WEB_SYSTEM" ] && [ "$WEB_SYSTEM" != 'no' ]; then
  125. mkdir -p $USER_DATA/ssl
  126. chmod 770 $USER_DATA/ssl
  127. touch $USER_DATA/web.conf
  128. chmod 660 $USER_DATA/web.conf
  129. if [ "$(grep -w $user $HESTIA/data/queue/traffic.pipe)" ]; then
  130. echo "$BIN/v-update-web-domains-traff $user" \
  131. >> $HESTIA/data/queue/traffic.pipe
  132. fi
  133. echo "$BIN/v-update-web-domains-disk $user" \
  134. >> $HESTIA/data/queue/disk.pipe
  135. if [[ -L "$HOMEDIR/$user/web" ]]; then
  136. rm $HOMEDIR/$user/web
  137. fi
  138. mkdir -p $HOMEDIR/$user/conf/web/$domain
  139. mkdir -p $HOMEDIR/$user/web
  140. mkdir -p $HOMEDIR/$user/tmp
  141. chmod 751 $HOMEDIR/$user/conf/web
  142. chmod 751 $HOMEDIR/$user/web
  143. chmod 771 $HOMEDIR/$user/tmp
  144. chown --no-dereference $root:$user $HOMEDIR/$user/web
  145. if [ "$create_user" = "yes" ]; then
  146. $BIN/v-rebuild-web-domains $user $restart
  147. fi
  148. fi
  149. # DNS
  150. if [ -n "$DNS_SYSTEM" ] && [ "$DNS_SYSTEM" != 'no' ]; then
  151. mkdir -p $USER_DATA/dns
  152. chmod 770 $USER_DATA/dns
  153. touch $USER_DATA/dns.conf
  154. chmod 660 $USER_DATA/dns.conf
  155. mkdir -p $HOMEDIR/$user/conf/dns
  156. chmod 771 $HOMEDIR/$user/conf/dns
  157. if [ "$DNS_SYSTEM" = 'named' ]; then
  158. dns_group='named'
  159. else
  160. dns_group='bind'
  161. fi
  162. chown $dns_group:$dns_group $HOMEDIR/$user/conf/dns
  163. if [ "$create_user" = "yes" ]; then
  164. $BIN/v-rebuild-dns-domains $user $restart
  165. fi
  166. fi
  167. if [ -n "$MAIL_SYSTEM" ] && [ "$MAIL_SYSTEM" != 'no' ]; then
  168. mkdir -p $USER_DATA/mail
  169. chmod 770 $USER_DATA/mail
  170. touch $USER_DATA/mail.conf
  171. chmod 660 $USER_DATA/mail.conf
  172. echo "$BIN/v-update-mail-domains-disk $user" \
  173. >> $HESTIA/data/queue/disk.pipe
  174. if [[ -L "$HOMEDIR/$user/mail" ]]; then
  175. rm $HOMEDIR/$user/mail
  176. fi
  177. mkdir -p $HOMEDIR/$user/conf/mail/$domain
  178. mkdir -p $HOMEDIR/$user/mail
  179. chmod 751 $HOMEDIR/$user/mail
  180. chmod 751 $HOMEDIR/$user/conf/mail
  181. if [ "$create_user" = "yes" ]; then
  182. $BIN/v-rebuild-mail-domains $user
  183. fi
  184. fi
  185. if [ -n "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'no' ]; then
  186. touch $USER_DATA/db.conf
  187. chmod 660 $USER_DATA/db.conf
  188. echo "$BIN/v-update-databases-disk $user" >> $HESTIA/data/queue/disk.pipe
  189. if [ "$create_user" = "yes" ]; then
  190. $BIN/v-rebuild-databases $user
  191. fi
  192. fi
  193. if [ -n "$CRON_SYSTEM" ] && [ "$CRON_SYSTEM" != 'no' ]; then
  194. touch $USER_DATA/cron.conf
  195. chmod 660 $USER_DATA/cron.conf
  196. if [ "$create_user" = "yes" ]; then
  197. $BIN/v-rebuild-cron-jobs $user $restart
  198. fi
  199. fi
  200. # Set immutable flag
  201. chattr +i $HOMEDIR/$user/conf > /dev/null 2>&1
  202. }
  203. # WEB domain rebuild
  204. rebuild_web_domain_conf() {
  205. # Ensure that global domain folders are available
  206. if [ ! -d /etc/$WEB_SYSTEM/conf.d/domains ]; then
  207. mkdir -p /etc/$WEB_SYSTEM/conf.d/domains
  208. fi
  209. if [ ! -d /etc/$PROXY_SYSTEM/conf.d/domains ]; then
  210. mkdir -p /etc/$PROXY_SYSTEM/conf.d/domains
  211. fi
  212. syshealth_repair_web_config
  213. get_domain_values 'web'
  214. is_ip_valid $IP
  215. prepare_web_domain_values
  216. # Remove old web configuration files
  217. if [ -f /etc/$WEB_SYSTEM/conf.d/$domain.conf ]; then
  218. rm -f /etc/$WEB_SYSTEM/conf.d/$domain*.conf
  219. fi
  220. if [ -f /etc/$PROXY_SYSTEM/conf.d/$domain.conf ]; then
  221. rm -f /etc/$PROXY_SYSTEM/conf.d/$domain*.conf
  222. fi
  223. # Temporary allow write permissions to owner
  224. [ -d "$HOMEDIR/$user/web/$domain" ] && chmod 751 "$HOMEDIR/$user/web/$domain"
  225. # Rebuilding domain directories
  226. if [ -d "$HOMEDIR/$user/web/$domain/document_errors" ]; then
  227. if [ "$POLICY_SYNC_ERROR_DOCUMENTS" != "no" ]; then
  228. $BIN/v-delete-fs-directory "$user" "$HOMEDIR/$user/web/$domain/document_errors"
  229. fi
  230. fi
  231. if [ ! -d $HOMEDIR/$user/web/$domain ]; then
  232. mkdir $HOMEDIR/$user/web/$domain
  233. fi
  234. chown --no-dereference $user:$user $HOMEDIR/$user/web/$domain
  235. $BIN/v-add-fs-directory "$user" "$HOMEDIR/$user/web/$domain/public_html"
  236. if [ ! -d "$HOMEDIR/$user/web/$domain/document_errors" ]; then
  237. $BIN/v-add-fs-directory "$user" "$HOMEDIR/$user/web/$domain/document_errors"
  238. # Propagating html skeleton
  239. user_exec cp -r "$WEBTPL/skel/document_errors/" "$HOMEDIR/$user/web/$domain/"
  240. fi
  241. $BIN/v-add-fs-directory "$user" "$HOMEDIR/$user/web/$domain/cgi-bin"
  242. $BIN/v-add-fs-directory "$user" "$HOMEDIR/$user/web/$domain/private"
  243. $BIN/v-add-fs-directory "$user" "$HOMEDIR/$user/web/$domain/stats"
  244. $BIN/v-add-fs-directory "$user" "$HOMEDIR/$user/web/$domain/logs"
  245. # Creating domain logs
  246. if [ ! -e "/var/log/$WEB_SYSTEM/domains" ]; then
  247. mkdir -p /var/log/$WEB_SYSTEM/domains
  248. chmod 771 /var/log/$WEB_SYSTEM/domains
  249. fi
  250. touch /var/log/$WEB_SYSTEM/domains/$domain.bytes \
  251. /var/log/$WEB_SYSTEM/domains/$domain.log \
  252. /var/log/$WEB_SYSTEM/domains/$domain.error.log
  253. # Creating symlinks
  254. cd $HOMEDIR/$user/web/$domain/logs/
  255. ln -f -s /var/log/$WEB_SYSTEM/domains/$domain.log .
  256. ln -f -s /var/log/$WEB_SYSTEM/domains/$domain.error.log .
  257. cd /
  258. # Set ownership
  259. chown --no-dereference $user:$user \
  260. $HOMEDIR/$user/web/$domain \
  261. $HOMEDIR/$user/web/$domain/private \
  262. $HOMEDIR/$user/web/$domain/cgi-bin \
  263. $HOMEDIR/$user/web/$domain/public_*html
  264. chown -R $user:$user $HOMEDIR/$user/web/$domain/document_errors
  265. chown root:$user /var/log/$WEB_SYSTEM/domains/$domain.*
  266. # Adding vhost configuration
  267. conf="$HOMEDIR/$user/conf/web/$domain/$WEB_SYSTEM.conf"
  268. add_web_config "$WEB_SYSTEM" "$TPL.tpl"
  269. # Adding SSL vhost configuration
  270. if [ "$SSL" = 'yes' ]; then
  271. ssl_file_dir="$HOMEDIR/$user/conf/web/$domain/ssl"
  272. conf="$HOMEDIR/$user/conf/web/$domain/$WEB_SYSTEM.ssl.conf"
  273. if [ ! -d "$ssl_file_dir" ]; then
  274. mkdir -p $ssl_file_dir
  275. fi
  276. add_web_config "$WEB_SYSTEM" "$TPL.stpl"
  277. cp -f $USER_DATA/ssl/$domain.crt \
  278. $HOMEDIR/$user/conf/web/$domain/ssl/$domain.crt
  279. cp -f $USER_DATA/ssl/$domain.key \
  280. $HOMEDIR/$user/conf/web/$domain/ssl/$domain.key
  281. cp -f $USER_DATA/ssl/$domain.pem \
  282. $HOMEDIR/$user/conf/web/$domain/ssl/$domain.pem
  283. if [ -e "$USER_DATA/ssl/$domain.ca" ]; then
  284. cp -f $USER_DATA/ssl/$domain.ca \
  285. $HOMEDIR/$user/conf/web/$domain/ssl/$domain.ca
  286. fi
  287. fi
  288. # Refresh HTTPS redirection if previously enabled
  289. if [ "$SSL_FORCE" = 'yes' ]; then
  290. $BIN/v-delete-web-domain-ssl-force $user $domain no yes
  291. $BIN/v-add-web-domain-ssl-force $user $domain no yes
  292. fi
  293. if [ "$SSL_HSTS" = 'yes' ]; then
  294. $BIN/v-delete-web-domain-ssl-hsts $user $domain no yes
  295. $BIN/v-add-web-domain-ssl-hsts $user $domain no yes
  296. fi
  297. if [ "$FASTCGI_CACHE" = 'yes' ]; then
  298. $BIN/v-delete-fastcgi-cache $user $domain
  299. $BIN/v-add-fastcgi-cache $user $domain "$FASTCGI_DURATION"
  300. fi
  301. # Adding proxy configuration
  302. if [ -n "$PROXY_SYSTEM" ] && [ -n "$PROXY" ]; then
  303. conf="$HOMEDIR/$user/conf/web/$domain/$PROXY_SYSTEM.conf"
  304. add_web_config "$PROXY_SYSTEM" "$PROXY.tpl"
  305. if [ "$SSL" = 'yes' ]; then
  306. conf="$HOMEDIR/$user/conf/web/$domain/$PROXY_SYSTEM.ssl.conf"
  307. add_web_config "$PROXY_SYSTEM" "$PROXY.stpl"
  308. fi
  309. fi
  310. # Adding web stats parser
  311. if [ -n "$STATS" ]; then
  312. domain_idn=$domain
  313. format_domain_idn
  314. cat $WEBTPL/$STATS/$STATS.tpl \
  315. | sed -e "s|%ip%|$local_ip|g" \
  316. -e "s|%web_system%|$WEB_SYSTEM|g" \
  317. -e "s|%domain_idn%|$domain_idn|g" \
  318. -e "s|%domain%|$domain|g" \
  319. -e "s|%user%|$user|g" \
  320. -e "s|%home%|$HOMEDIR|g" \
  321. -e "s|%alias%|${aliases//,/ }|g" \
  322. -e "s|%alias_idn%|${aliases_idn//,/ }|g" \
  323. > $HOMEDIR/$user/conf/web/$domain/$STATS.conf
  324. if [ "$STATS" == 'awstats' ]; then
  325. if [ -e "/etc/awstats/$STATS.$domain_idn.conf" ]; then
  326. rm -f "/etc/awstats/$STATS.$domain_idn.conf"
  327. fi
  328. ln -f -s $HOMEDIR/$user/conf/web/$domain/$STATS.conf \
  329. /etc/awstats/$STATS.$domain_idn.conf
  330. fi
  331. webstats="$BIN/v-update-web-domain-stat $user $domain"
  332. check_webstats=$(grep "$webstats" $HESTIA/data/queue/webstats.pipe)
  333. if [ -z "$check_webstats" ]; then
  334. echo "$webstats" >> $HESTIA/data/queue/webstats.pipe
  335. fi
  336. if [ -n "$STATS_USER" ]; then
  337. stats_dir="$HOMEDIR/$user/web/$domain/stats"
  338. if [ "$WEB_SYSTEM" = 'nginx' ]; then
  339. echo "auth_basic \"Web Statistics\";" | user_exec tee $stats_dir/auth.conf > /dev/null
  340. echo "auth_basic_user_file $stats_dir/.htpasswd;" | user_exec tee -a $stats_dir/auth.conf > /dev/null
  341. else
  342. echo "AuthUserFile $stats_dir/.htpasswd" | user_exec tee $stats_dir/.htaccess > /dev/null
  343. echo "AuthName \"Web Statistics\"" | user_exec tee -a $stats_dir/.htaccess > /dev/null
  344. echo "AuthType Basic" | user_exec tee -a $stats_dir/.htaccess > /dev/null
  345. echo "Require valid-user" | user_exec tee -a $stats_dir/.htaccess > /dev/null
  346. fi
  347. echo "$STATS_USER:$STATS_CRYPT" | user_exec tee $stats_dir/.htpasswd > /dev/null
  348. fi
  349. fi
  350. # Adding ftp users
  351. if [ -z "$FTP_SHELL" ]; then
  352. shell=$(which nologin)
  353. if [ -e "/usr/bin/rssh" ]; then
  354. shell='/usr/bin/rssh'
  355. fi
  356. else
  357. shell=$FTP_SHELL
  358. fi
  359. for ftp_user in ${FTP_USER//:/ }; do
  360. if [ -z "$(grep ^$ftp_user: /etc/passwd)" ]; then
  361. position=$(echo $FTP_USER | tr ':' '\n' | grep -n '' \
  362. | grep ":$ftp_user$" | cut -f 1 -d:)
  363. ftp_path=$(echo $FTP_PATH | tr ':' '\n' | grep -n '' \
  364. | grep "^$position:" | cut -f 2 -d :)
  365. ftp_md5=$(echo $FTP_MD5 | tr ':' '\n' | grep -n '' \
  366. | grep "^$position:" | cut -f 2 -d :)
  367. # rebuild S/FTP users
  368. $BIN/v-delete-web-domain-ftp "$user" "$domain" "$ftp_user"
  369. # Generate temporary password to add user but update afterwards
  370. temp_password=$(generate_password)
  371. $BIN/v-add-web-domain-ftp "$user" "$domain" "${ftp_user##*_}" "$temp_password" "$ftp_path"
  372. # Updating ftp user password
  373. chmod u+w /etc/shadow
  374. sed -i "s|^$ftp_user:[^:]*:|$ftp_user:$ftp_md5:|" /etc/shadow
  375. chmod u-w /etc/shadow
  376. #Update web.conf for next rebuild or move
  377. update_object_value 'web' 'DOMAIN' "$domain" '$FTP_MD5' "$ftp_md5"
  378. fi
  379. done
  380. # Adding http auth protection
  381. htaccess="$HOMEDIR/$user/conf/web/$domain/htaccess"
  382. htpasswd="$HOMEDIR/$user/conf/web/$domain/htpasswd"
  383. docroot="$HOMEDIR/$user/web/$domain/public_html"
  384. for auth_user in ${AUTH_USER//:/ }; do
  385. # Parsing auth user variables
  386. position=$(echo $AUTH_USER | tr ':' '\n' | grep -n '' \
  387. | grep ":$auth_user$" | cut -f 1 -d:)
  388. auth_hash=$(echo $AUTH_HASH | tr ':' '\n' | grep -n '' \
  389. | grep "^$position:" | cut -f 2 -d :)
  390. # Adding http auth user
  391. touch $htpasswd
  392. sed -i "/^$auth_user:/d" $htpasswd
  393. echo "$auth_user:$auth_hash" >> $htpasswd
  394. # Adding htaccess password protection
  395. if [ "$WEB_SYSTEM" = "nginx" ] || [ "$PROXY_SYSTEM" = "nginx" ]; then
  396. htaccess="$HOMEDIR/$user/conf/web/$domain/nginx.conf_htaccess"
  397. shtaccess="$HOMEDIR/$user/conf/web/$domain/nginx.ssl.conf_htaccess"
  398. if [ ! -f "$htaccess" ]; then
  399. echo "auth_basic \"$domain password access\";" > $htaccess
  400. echo "auth_basic_user_file $htpasswd;" >> $htaccess
  401. ln -s $htaccess $shtaccess
  402. restart_required='yes'
  403. fi
  404. else
  405. htaccess="$HOMEDIR/$user/conf/web/$domain/apache2.conf_htaccess"
  406. shtaccess="$HOMEDIR/$user/conf/web/$domain/apache2.ssl.conf_htaccess"
  407. if [ ! -f "$htaccess" ]; then
  408. echo "<Directory $docroot>" > $htaccess
  409. echo " AuthUserFile $htpasswd" >> $htaccess
  410. echo " AuthName \"$domain access\"" >> $htaccess
  411. echo " AuthType Basic" >> $htaccess
  412. echo " Require valid-user" >> $htaccess
  413. echo "</Directory>" >> $htaccess
  414. ln -s $htaccess $shtaccess
  415. restart_required='yes'
  416. fi
  417. fi
  418. chmod 644 $htpasswd $htaccess
  419. chgrp $user $htpasswd $htaccess
  420. done
  421. # domain folder permissions: DOMAINDIR_WRITABLE: default-val:no source:hestia.conf
  422. DOMAINDIR_MODE=551
  423. if [ "$DOMAINDIR_WRITABLE" = 'yes' ]; then DOMAINDIR_MODE=751; fi
  424. # Set folder permissions
  425. no_symlink_chmod 751 $HOMEDIR/$user/web/$domain \
  426. $HOMEDIR/$user/web/$domain/stats \
  427. $HOMEDIR/$user/web/$domain/logs
  428. no_symlink_chmod 751 $HOMEDIR/$user/web/$domain/private \
  429. $HOMEDIR/$user/web/$domain/cgi-bin \
  430. $HOMEDIR/$user/web/$domain/public_*html \
  431. $HOMEDIR/$user/web/$domain/document_errors
  432. chmod 640 /var/log/$WEB_SYSTEM/domains/$domain.*
  433. chown --no-dereference $user:www-data $HOMEDIR/$user/web/$domain/public_*html
  434. }
  435. # DNS domain rebuild
  436. rebuild_dns_domain_conf() {
  437. # Get domain values
  438. get_domain_values 'dns'
  439. domain_idn=$(idn2 --quiet "$domain")
  440. if [ "$SLAVE" != "yes" ]; then
  441. # Checking zone file
  442. if [ ! -e "$USER_DATA/dns/$domain.conf" ]; then
  443. cat $DNSTPL/$TPL.tpl \
  444. | sed -e "s/%ip%/$IP/g" \
  445. -e "s/%domain_idn%/$domain_idn/g" \
  446. -e "s/%domain%/$domain/g" \
  447. -e "s/%ns1%/$ns1/g" \
  448. -e "s/%ns2%/$ns2/g" \
  449. -e "s/%ns3%/$ns3/g" \
  450. -e "s/%ns4%/$ns4/g" \
  451. -e "s/%time%/$TIME/g" \
  452. -e "s/%date%/$DATE/g" > $USER_DATA/dns/$domain.conf
  453. fi
  454. # Sorting records
  455. sort_dns_records
  456. #Remove old sign files
  457. rm -fr $HOMEDIR/$user/conf/dns/$domain.db.*
  458. # Updating zone
  459. update_domain_zone
  460. # Set permissions
  461. if [ "$DNS_SYSTEM" = 'named' ]; then
  462. dns_group='named'
  463. else
  464. dns_group='bind'
  465. fi
  466. # Set file permissions
  467. chmod 640 $HOMEDIR/$user/conf/dns/$domain.db
  468. chown $root:$dns_group $HOMEDIR/$user/conf/dns/$domain.db
  469. else
  470. rm -fr $HOMEDIR/$user/conf/dns/$domain.db.*
  471. chown $dns_group:$dns_group $HOMEDIR/$user/conf/dns/$domain.db
  472. fi
  473. # Get dns config path
  474. if [ -e '/etc/named.conf' ]; then
  475. dns_conf='/etc/named.conf'
  476. fi
  477. if [ -e '/etc/bind/named.conf' ]; then
  478. dns_conf='/etc/bind/named.conf'
  479. fi
  480. # Bind config check
  481. if [ "$SUSPENDED" = 'yes' ]; then
  482. rm_string=$(grep -n /etc/namedb/$domain.db $dns_conf | cut -d : -f 1)
  483. if [ -n "$rm_string" ]; then
  484. sed -i "$rm_string d" $dns_conf
  485. fi
  486. suspended_dns=$((suspended_dns + 1))
  487. else
  488. sed -i "/dns\/$domain.db/d" $dns_conf
  489. if [ "$SLAVE" = "yes" ]; then
  490. named="zone \"$domain_idn\" in {type slave; masters { $MASTER; }; file"
  491. named="$named \"$HOMEDIR/$user/conf/dns/$domain.db\";};"
  492. echo "$named" >> $dns_conf
  493. else
  494. if [ "$DNSSEC" = "yes" ]; then
  495. named="zone \"$domain_idn\" in {type master; dnssec-policy default; inline-signing yes; file"
  496. named="$named \"$HOMEDIR/$user/conf/dns/$domain.db\";};"
  497. echo "$named" >> $dns_conf
  498. else
  499. named="zone \"$domain_idn\" {type master; file"
  500. named="$named \"$HOMEDIR/$user/conf/dns/$domain.db\";};"
  501. echo "$named" >> $dns_conf
  502. fi
  503. fi
  504. fi
  505. user_domains=$((user_domains + 1))
  506. records=$(wc -l $USER_DATA/dns/$domain.conf | cut -f 1 -d ' ')
  507. user_records=$((user_records + records))
  508. update_object_value 'dns' 'DOMAIN' "$domain" '$RECORDS' "$records"
  509. # Load new config
  510. /usr/sbin/rndc reconfig > /dev/null 2>&1
  511. # Reload config
  512. /usr/sbin/rndc reload $domain > /dev/null 2>&1
  513. if [ "$DNSSEC" = "yes" ]; then
  514. # Key consists always out of 5 digits when less is used they are "lost"
  515. key=$(/usr/sbin/rndc dnssec -status $domain_idn | grep ^key: | cut -f2 -d' ' | numfmt --format='%05.0f' --invalid=ignore)
  516. if [ ! -d "$USER_DATA/keys/" ]; then
  517. mkdir -p $USER_DATA/keys/
  518. fi
  519. cp /var/cache/bind/K$domain_idn.+013+$key.* $USER_DATA/keys/
  520. update_object_value 'dns' 'DOMAIN' "$domain" '$KEY' "$key"
  521. fi
  522. rndc notify $domain_idn > /dev/null 2>&1
  523. }
  524. # MAIL domain rebuild
  525. rebuild_mail_domain_conf() {
  526. syshealth_repair_mail_config
  527. get_domain_values 'mail'
  528. if [[ "$domain" = *[![:ascii:]]* ]]; then
  529. domain_idn=$(idn2 --quiet $domain)
  530. else
  531. domain_idn=$domain
  532. fi
  533. # Inherit web domain local ip address
  534. unset -v nat ip local_ip domain_ip
  535. local domain_ip=$(get_object_value 'web' 'DOMAIN' "$domain" '$IP')
  536. if [ -n "$domain_ip" ]; then
  537. local local_ip=$(get_real_ip "$domain_ip")
  538. is_ip_valid "$local_ip" "$user"
  539. else
  540. get_user_ip
  541. fi
  542. if [ "$SUSPENDED" = 'yes' ]; then
  543. SUSPENDED_MAIL=$((SUSPENDED_MAIL + 1))
  544. fi
  545. if [ ! -d "$USER_DATA/mail" ]; then
  546. rm -f $USER_DATA/mail
  547. mkdir $USER_DATA/mail
  548. fi
  549. # Rebuilding exim config structure
  550. if [[ "$MAIL_SYSTEM" =~ exim ]]; then
  551. rm -f /etc/$MAIL_SYSTEM/domains/$domain_idn
  552. mkdir -p $HOMEDIR/$user/conf/mail/$domain
  553. ln -s $HOMEDIR/$user/conf/mail/$domain \
  554. /etc/$MAIL_SYSTEM/domains/$domain_idn
  555. rm -f $HOMEDIR/$user/conf/mail/$domain/accounts
  556. rm -f $HOMEDIR/$user/conf/mail/$domain/aliases
  557. rm -f $HOMEDIR/$user/conf/mail/$domain/antispam
  558. rm -f $HOMEDIR/$user/conf/mail/$domain/reject_spam
  559. rm -f $HOMEDIR/$user/conf/mail/$domain/antivirus
  560. rm -f $HOMEDIR/$user/conf/mail/$domain/protection
  561. rm -f $HOMEDIR/$user/conf/mail/$domain/passwd
  562. rm -f $HOMEDIR/$user/conf/mail/$domain/fwd_only
  563. rm -f $HOMEDIR/$user/conf/mail/$domain/ip
  564. rm -fr $HOMEDIR/$user/conf/mail/$domain/limits
  565. touch $HOMEDIR/$user/conf/mail/$domain/accounts
  566. touch $HOMEDIR/$user/conf/mail/$domain/aliases
  567. touch $HOMEDIR/$user/conf/mail/$domain/passwd
  568. touch $HOMEDIR/$user/conf/mail/$domain/fwd_only
  569. touch $HOMEDIR/$user/conf/mail/$domain/limits
  570. # Setting outgoing ip address
  571. if [ -n "$local_ip" ] && [ "$U_SMTP_RELAY" != 'true' ]; then
  572. echo "$local_ip" > $HOMEDIR/$user/conf/mail/$domain/ip
  573. fi
  574. # Adding antispam protection
  575. if [ "$ANTISPAM" = 'yes' ]; then
  576. touch $HOMEDIR/$user/conf/mail/$domain/antispam
  577. fi
  578. # Adding antivirus protection
  579. if [ "$ANTIVIRUS" = 'yes' ]; then
  580. touch $HOMEDIR/$user/conf/mail/$domain/antivirus
  581. fi
  582. # Adding reject spam protection
  583. if [ "$REJECT" = 'yes' ]; then
  584. touch $HOMEDIR/$user/conf/mail/$domain/reject_spam
  585. fi
  586. # Adding dkim
  587. if [ "$DKIM" = 'yes' ]; then
  588. cp $USER_DATA/mail/$domain.pem \
  589. $HOMEDIR/$user/conf/mail/$domain/dkim.pem
  590. fi
  591. # Rebuild SMTP Relay configuration
  592. if [ "$U_SMTP_RELAY" = 'true' ]; then
  593. $BIN/v-add-mail-domain-smtp-relay $user $domain "$U_SMTP_RELAY_HOST" "$U_SMTP_RELAY_USERNAME" "$U_SMTP_RELAY_PASSWORD" "$U_SMTP_RELAY_PORT"
  594. fi
  595. # Removing configuration files if domain is suspended
  596. if [ "$SUSPENDED" = 'yes' ]; then
  597. rm -f /etc/$MAIL_SYSTEM/domains/$domain_idn
  598. rm -f /etc/dovecot/conf.d/domains/$domain_idn.conf
  599. fi
  600. # Adding mail directory
  601. if [ ! -e $HOMEDIR/$user/mail/$domain_idn ]; then
  602. mkdir "$HOMEDIR/$user/mail/$domain_idn"
  603. fi
  604. # Webamil client
  605. if [ "$WEBMAIL" = '' ]; then
  606. $BIN/v-add-mail-domain-webmail $user $domain 'roundcube' 'no'
  607. fi
  608. # Adding catchall email
  609. dom_aliases=$HOMEDIR/$user/conf/mail/$domain/aliases
  610. if [ -n "$CATCHALL" ]; then
  611. echo "*@$domain_idn:$CATCHALL" >> $dom_aliases
  612. fi
  613. fi
  614. # Rebuild domain accounts
  615. accs=0
  616. dom_disk=0
  617. if [ -e "$USER_DATA/mail/$domain.conf" ]; then
  618. accounts=$(search_objects "mail/$domain" 'SUSPENDED' "no" 'ACCOUNT')
  619. else
  620. accounts=''
  621. fi
  622. for account in $accounts; do
  623. ((++accs))
  624. object=$(grep "ACCOUNT='$account'" $USER_DATA/mail/$domain.conf)
  625. FWD_ONLY='no'
  626. parse_object_kv_list "$object"
  627. if [ "$SUSPENDED" = 'yes' ]; then
  628. MD5='SUSPENDED'
  629. fi
  630. if [[ "$MAIL_SYSTEM" =~ exim ]]; then
  631. if [ "$QUOTA" = 'unlimited' ]; then
  632. QUOTA=0
  633. fi
  634. str="$account:$MD5:$user:mail::$HOMEDIR/$user:${QUOTA}:userdb_quota_rule=*:storage=${QUOTA}M"
  635. echo $str >> $HOMEDIR/$user/conf/mail/$domain/passwd
  636. userstr="$account:$account:$user:mail:$HOMEDIR/$user"
  637. echo $userstr >> $HOMEDIR/$user/conf/mail/$domain/accounts
  638. for malias in ${ALIAS//,/ }; do
  639. echo "$malias@$domain_idn:$account@$domain_idn" >> $dom_aliases
  640. done
  641. if [ -n "$FWD" ]; then
  642. echo "$account@$domain_idn:$FWD" >> $dom_aliases
  643. fi
  644. if [ "$FWD_ONLY" = 'yes' ]; then
  645. echo "$account" >> $HOMEDIR/$user/conf/mail/$domain/fwd_only
  646. fi
  647. user_rate_limit=$(get_object_value 'mail' 'DOMAIN' "$domain" '$RATE_LIMIT')
  648. if [ -n "$RATE_LIMIT" ]; then
  649. #user value
  650. sed -i "/^$account@$domain_idn:/ d" $HOMEDIR/$user/conf/mail/$domain/limits
  651. echo "$account@$domain_idn:$RATE_LIMIT" >> $HOMEDIR/$user/conf/mail/$domain/limits
  652. elif [ -n "$user_rate_limit" ]; then
  653. #revert to account value
  654. sed -i "/^$account@$domain_idn:/ d" $HOMEDIR/$user/conf/mail/$domain/limits
  655. echo "$account@$domain_idn:$user_rate_limit" >> $HOMEDIR/$user/conf/mail/$domain/limits
  656. else
  657. #revert to system value
  658. system=$(cat /etc/exim4/limit.conf)
  659. sed -i "/^$account@$domain_idn:/ d" $HOMEDIR/$user/conf/mail/$domain/limits
  660. echo "$account@$domain_idn:$system" >> $HOMEDIR/$user/conf/mail/$domain/limits
  661. fi
  662. fi
  663. done
  664. # Set permissions and ownership
  665. if [[ "$MAIL_SYSTEM" =~ exim ]]; then
  666. chmod 660 $USER_DATA/mail/$domain.*
  667. chmod 771 $HOMEDIR/$user/conf/mail/$domain
  668. chmod 660 $HOMEDIR/$user/conf/mail/$domain/*
  669. chmod 771 /etc/$MAIL_SYSTEM/domains/$domain_idn
  670. chmod 770 $HOMEDIR/$user/mail/$domain_idn
  671. chown -R $MAIL_USER:mail $HOMEDIR/$user/conf/mail/$domain
  672. if [ "$IMAP_SYSTEM" = "dovecot" ]; then
  673. chown -R dovecot:mail $HOMEDIR/$user/conf/mail/$domain/passwd
  674. fi
  675. chown $MAIL_USER:mail $HOMEDIR/$user/conf/mail/$domain/accounts
  676. chown $user:mail $HOMEDIR/$user/mail/$domain_idn
  677. fi
  678. # Add missing SSL configuration flags to existing domains
  679. # for per-domain SSL migration
  680. sslcheck=$(grep "DOMAIN='$domain'" $USER_DATA/mail.conf | grep SSL)
  681. if [ -z "$sslcheck" ]; then
  682. sed -i "s|$domain'|$domain' SSL='no' LETSENCRYPT='no'|g" $USER_DATA/mail.conf
  683. fi
  684. # Remove and recreate SSL configuration
  685. if [ -f "$HOMEDIR/$user/conf/mail/$domain/ssl/$domain.crt" ]; then
  686. del_mail_ssl_config
  687. add_mail_ssl_config
  688. update_object_value 'mail' 'DOMAIN' "$domain" '$SSL' "yes"
  689. else
  690. update_object_value 'mail' 'DOMAIN' "$domain" '$SSL' "no"
  691. fi
  692. dom_disk=0
  693. for account in $(search_objects "mail/$domain" 'SUSPENDED' "no" 'ACCOUNT'); do
  694. home_dir=$HOMEDIR/$user/mail/$domain/$account
  695. if [ -e "$home_dir" ]; then
  696. udisk=$(nice -n 19 du -shm $home_dir | cut -f 1)
  697. else
  698. udisk=0
  699. fi
  700. update_object_value "mail/$domain" 'ACCOUNT' "$account" '$U_DISK' "$udisk"
  701. dom_disk=$((dom_disk + udisk))
  702. done
  703. update_object_value 'mail' 'DOMAIN' "$domain" '$ACCOUNTS' "$accs"
  704. update_object_value 'mail' 'DOMAIN' "$domain" '$U_DISK' "$dom_disk"
  705. # Update usage counters
  706. U_MAIL_ACCOUNTS=$((U_MAIL_ACCOUNTS + accs))
  707. U_MAIL_DOMAINS=$((U_MAIL_DOMAINS + 1))
  708. recalc_user_disk_usage
  709. }
  710. # Rebuild MySQL
  711. rebuild_mysql_database() {
  712. mysql_connect $HOST
  713. mysql_query "CREATE DATABASE \`$DB\` CHARACTER SET $CHARSET" > /dev/null
  714. if [ "$mysql_fork" = "mysql" ]; then
  715. # mysql
  716. mysql_ver_sub=$(echo $mysql_ver | cut -d '.' -f1)
  717. mysql_ver_sub_sub=$(echo $mysql_ver | cut -d '.' -f2)
  718. if [ "$mysql_ver_sub" -ge 8 ] || { [ "$mysql_ver_sub" -eq 5 ] && [ "$mysql_ver_sub_sub" -ge 7 ]; }; then
  719. # mysql >= 5.7
  720. mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`" > /dev/null
  721. mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`@localhost" > /dev/null
  722. # mysql >= 8, with enabled Print identified with as hex feature
  723. if [[ "$mysql_ver_sub" -ge 8 && "$MD5" =~ ^0x.* ]]; then
  724. query="UPDATE mysql.user SET authentication_string=UNHEX('${MD5:2}')"
  725. else
  726. query="UPDATE mysql.user SET authentication_string='$MD5'"
  727. fi
  728. query="$query WHERE User='$DBUSER'"
  729. else
  730. # mysql < 5.7
  731. query="UPDATE mysql.user SET Password='$MD5' WHERE User='$DBUSER'"
  732. fi
  733. else
  734. # mariadb
  735. mysql_ver_sub=$(echo $mysql_ver | cut -d '.' -f1)
  736. mysql_ver_sub_sub=$(echo $mysql_ver | cut -d '.' -f2)
  737. if [ "$mysql_ver_sub" -eq 5 ]; then
  738. # mariadb = 5
  739. mysql_query "CREATE USER \`$DBUSER\`" > /dev/null
  740. mysql_query "CREATE USER \`$DBUSER\`@localhost" > /dev/null
  741. query="UPDATE mysql.user SET Password='$MD5' WHERE User='$DBUSER'"
  742. else
  743. # mariadb = 10
  744. mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\` IDENTIFIED BY PASSWORD '$MD5'" > /dev/null
  745. mysql_query "CREATE USER IF NOT EXISTS \`$DBUSER\`@localhost IDENTIFIED BY PASSWORD '$MD5'" > /dev/null
  746. if [ "$mysql_ver_sub_sub" -ge 4 ]; then
  747. #mariadb >= 10.4
  748. query="SET PASSWORD FOR '$DBUSER'@'%' = '$MD5';"
  749. query2="SET PASSWORD FOR '$DBUSER'@'localhost' = '$MD5';"
  750. else
  751. #mariadb < 10.4
  752. query="UPDATE mysql.user SET Password='$MD5' WHERE User='$DBUSER'"
  753. fi
  754. fi
  755. fi
  756. mysql_query "GRANT ALL ON \`$DB\`.* TO \`$DBUSER\`@\`%\`" > /dev/null
  757. mysql_query "GRANT ALL ON \`$DB\`.* TO \`$DBUSER\`@localhost" > /dev/null
  758. mysql_query "$query" > /dev/null
  759. if [ ! -z "$query2" ]; then
  760. mysql_query "$query2" > /dev/null
  761. fi
  762. mysql_query "FLUSH PRIVILEGES" > /dev/null
  763. }
  764. # Rebuild PostgreSQL
  765. rebuild_pgsql_database() {
  766. host_str=$(grep "HOST='$HOST'" $HESTIA/conf/pgsql.conf)
  767. parse_object_kv_list "$host_str"
  768. export PGPASSWORD="$PASSWORD"
  769. if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
  770. echo "Error: postgresql config parsing failed"
  771. if [ -n "$SENDMAIL" ]; then
  772. echo "Can't parse PostgreSQL config" | $SENDMAIL -s "$subj" $email
  773. fi
  774. log_event "$E_PARSING" "$ARGUMENTS"
  775. exit "$E_PARSING"
  776. fi
  777. query='SELECT VERSION()'
  778. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  779. if [ '0' -ne "$?" ]; then
  780. echo "Error: Connection failed"
  781. if [ -n "$SENDMAIL" ]; then
  782. echo "Database connection to PostgreSQL host $HOST failed" \
  783. | $SENDMAIL -s "$subj" $email
  784. fi
  785. log_event "$E_CONNECT" "$ARGUMENTS"
  786. exit "$E_CONNECT"
  787. fi
  788. query="CREATE ROLE $DBUSER"
  789. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  790. query="UPDATE pg_authid SET rolpassword='$MD5' WHERE rolname='$DBUSER'"
  791. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  792. query="CREATE DATABASE $DB OWNER $DBUSER"
  793. if [ "$TPL" = 'template0' ]; then
  794. query="$query ENCODING '$CHARSET' TEMPLATE $TPL"
  795. else
  796. query="$query TEMPLATE $TPL"
  797. fi
  798. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  799. query="GRANT ALL PRIVILEGES ON DATABASE $DB TO $DBUSER"
  800. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  801. query="GRANT CONNECT ON DATABASE template1 to $DBUSER"
  802. psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
  803. }
  804. # Import MySQL dump
  805. import_mysql_database() {
  806. host_str=$(grep "HOST='$HOST'" $HESTIA/conf/mysql.conf)
  807. parse_object_kv_list "$host_str"
  808. if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
  809. echo "Error: mysql config parsing failed"
  810. log_event "$E_PARSING" "$ARGUMENTS"
  811. exit "$E_PARSING"
  812. fi
  813. if [ -f '/usr/bin/mariadb' ]; then
  814. mariadb -h $HOST -u $USER -p$PASSWORD $DB < $1 > /dev/null 2>&1
  815. else
  816. mysql -h $HOST -u $USER -p$PASSWORD $DB < $1 > /dev/null 2>&1
  817. fi
  818. }
  819. # Import PostgreSQL dump
  820. import_pgsql_database() {
  821. host_str=$(grep "HOST='$HOST'" $HESTIA/conf/pgsql.conf)
  822. parse_object_kv_list "$host_str"
  823. export PGPASSWORD="$PASSWORD"
  824. if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
  825. echo "Error: postgresql config parsing failed"
  826. log_event "$E_PARSING" "$ARGUMENTS"
  827. exit "$E_PARSING"
  828. fi
  829. psql -h $HOST -U $USER $DB < $1 > /dev/null 2>&1
  830. }