syshealth.sh 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. #!/bin/bash
  2. #===========================================================================#
  3. # #
  4. # Hestia Control Panel - System Health Check and Repair Function Library #
  5. # #
  6. #===========================================================================#
  7. # Read known configuration keys from $HESTIA/conf/defaults/$system.conf
  8. function read_kv_config_file() {
  9. local system=$1
  10. if [ ! -f "$HESTIA/conf/defaults/$system.conf" ]; then
  11. write_kv_config_file $system
  12. fi
  13. while read -r str; do
  14. echo "$str"
  15. done < <(cat $HESTIA/conf/defaults/$system.conf)
  16. unset system
  17. }
  18. # Write known configuration keys to $HESTIA/conf/defaults/
  19. function write_kv_config_file() {
  20. # Ensure configuration directory exists
  21. if [ ! -d "$HESTIA/conf/defaults/" ]; then
  22. mkdir "$HESTIA/conf/defaults/"
  23. fi
  24. # Remove previous known good configuration
  25. if [ -f "$HESTIA/conf/defaults/$system.conf" ]; then
  26. rm -f $HESTIA/conf/defaults/$system.conf
  27. fi
  28. touch $HESTIA/conf/defaults/$system.conf
  29. for key in $known_keys; do
  30. echo $key >> $HESTIA/conf/defaults/$system.conf
  31. done
  32. }
  33. # Sanitize configuration input
  34. function sanitize_config_file() {
  35. local system=$1
  36. known_keys=$(read_kv_config_file "$system")
  37. for key in $known_keys; do
  38. unset $key
  39. done
  40. }
  41. # Update list of known keys for web.conf files
  42. function syshealth_update_web_config_format() {
  43. # WEB DOMAINS
  44. # Create array of known keys in configuration file
  45. system="web"
  46. known_keys="DOMAIN IP IP6 CUSTOM_DOCROOT CUSTOM_PHPROOT FASTCGI_CACHE FASTCGI_DURATION ALIAS TPL SSL SSL_FORCE SSL_HSTS SSL_HOME LETSENCRYPT FTP_USER FTP_MD5 FTP_PATH BACKEND PROXY PROXY_EXT STATS STATS_USER STATS_CRYPT REDIRECT REDIRECT_CODE AUTH_USER AUTH_HASH SUSPENDED TIME DATE"
  47. write_kv_config_file
  48. unset system
  49. unset known_keys
  50. }
  51. # Update list of known keys for dns.conf files
  52. function syshealth_update_dns_config_format() {
  53. # DNS DOMAINS
  54. # Create array of known keys in configuration file
  55. system="dns"
  56. known_keys="DOMAIN IP TPL TTL EXP SOA SERIAL SRC RECORDS DNSSEC KEY SLAVE MASTER SUSPENDED TIME DATE"
  57. write_kv_config_file
  58. unset system
  59. unset known_keys
  60. # DNS RECORDS
  61. system="dns_records"
  62. known_keys="ID RECORD TYPE PRIORITY VALUE SUSPENDED TIME DATE TTL"
  63. write_kv_config_file
  64. unset system
  65. unset known_keys
  66. }
  67. # Update list of known keys for mail.conf files
  68. function syshealth_update_mail_config_format() {
  69. # MAIL DOMAINS
  70. # Create array of known keys in configuration file
  71. system="mail"
  72. known_keys="DOMAIN ANTIVIRUS ANTISPAM DKIM WEBMAIL SSL LETSENCRYPT CATCHALL ACCOUNTS RATE_LIMIT REJECT U_DISK SUSPENDED TIME DATE"
  73. write_kv_config_file
  74. unset system
  75. unset known_keys
  76. }
  77. function syshealth_update_mail_account_config_format() {
  78. # MAIL ACCOUNTS
  79. system="mail_accounts"
  80. known_keys="ACCOUNT ALIAS AUTOREPLY FWD FWD_ONLY MD5 QUOTA RATE_LIMIT U_DISK SUSPENDED TIME DATE"
  81. write_kv_config_file
  82. unset system
  83. unset known_keys
  84. }
  85. # Update list of known keys for user.conf files
  86. function syshealth_update_user_config_format() {
  87. # USER CONFIGURATION
  88. # Create array of known keys in configuration file
  89. system="user"
  90. known_keys="NAME PACKAGE CONTACT CRON_REPORTS MD5 RKEY TWOFA QRCODE PHPCLI ROLE SUSPENDED SUSPENDED_USERS SUSPENDED_WEB SUSPENDED_DNS SUSPENDED_MAIL SUSPENDED_DB SUSPENDED_CRON IP_AVAIL IP_OWNED U_USERS U_DISK U_DISK_DIRS U_DISK_WEB U_DISK_MAIL U_DISK_DB U_BANDWIDTH U_WEB_DOMAINS U_WEB_SSL U_WEB_ALIASES U_DNS_DOMAINS U_DNS_RECORDS U_MAIL_DKIM U_MAIL_DKIM U_MAIL_ACCOUNTS U_MAIL_DOMAINS U_MAIL_SSL U_DATABASES U_CRON_JOBS U_BACKUPS LANGUAGE THEME NOTIFICATIONS PREF_UI_SORT TIME DATE"
  91. write_kv_config_file
  92. unset system
  93. unset known_keys
  94. # CRON JOB CONFIGURATION
  95. # Create array of known keys in configuration file
  96. system="cron"
  97. known_keys="JOB MIN HOUR DAY MONTH WDAY CMD SUSPENDED TIME DATE"
  98. write_kv_config_file
  99. unset system
  100. unset known_keys
  101. }
  102. # Update list of known keys for db.conf files
  103. function syshealth_update_db_config_format() {
  104. # DATABASE CONFIGURATION
  105. # Create array of known keys in configuration file
  106. system="db"
  107. known_keys="DB DBUSER MD5 HOST TYPE CHARSET U_DISK SUSPENDED TIME DATE"
  108. write_kv_config_file
  109. unset system
  110. unset known_keys
  111. }
  112. # Update list of known keys for ip.conf files
  113. function syshealth_update_ip_config_format() {
  114. # IP ADDRESS
  115. # Create array of known keys in configuration file
  116. system="ip"
  117. known_keys="OWNER STATUS NAME U_SYS_USERS U_WEB_DOMAINS INTERFACE NETMASK NAT TIME DATE"
  118. write_kv_config_file
  119. unset system
  120. unset known_keys
  121. }
  122. # Repair web domain configuration
  123. function syshealth_repair_web_config() {
  124. system="web"
  125. sanitize_config_file "$system"
  126. get_domain_values 'web'
  127. prev="DOMAIN"
  128. for key in $known_keys; do
  129. if [ -z "$key" ]; then
  130. add_object_key 'web' 'DOMAIN' "$domain" "$key" "$prev"
  131. fi
  132. prev=$key
  133. done
  134. }
  135. function syshealth_repair_mail_config() {
  136. system="mail"
  137. sanitize_config_file "$system"
  138. get_domain_values 'mail'
  139. prev="DOMAIN"
  140. for key in $known_keys; do
  141. if [ -z "${!key}" ]; then
  142. add_object_key 'mail' 'DOMAIN' "$domain" "$key" "$prev"
  143. fi
  144. prev=$key
  145. done
  146. }
  147. function syshealth_repair_dns_config() {
  148. system="dns"
  149. sanitize_config_file "$system"
  150. get_domain_values 'dns'
  151. prev="DOMAIN"
  152. for key in $known_keys; do
  153. if [ -z "${!key}" ]; then
  154. add_object_key 'dns' 'DOMAIN' "$domain" "$key" "$prev"
  155. fi
  156. prev=$key
  157. done
  158. }
  159. function syshealth_repair_mail_account_config() {
  160. system="mail_accounts"
  161. sanitize_config_file "$system"
  162. get_object_values "mail/$domain" 'ACCOUNT' "$account"
  163. for key in $known_keys; do
  164. if [ -z "${!key}" ]; then
  165. add_object_key "mail/$domain" 'ACCOUNT' "$account" "$key" "$prev"
  166. fi
  167. prev=$key
  168. done
  169. }
  170. function syshealth_update_system_config_format() {
  171. # SYSTEM CONFIGURATION
  172. # Create array of known keys in configuration file
  173. system="system"
  174. known_keys="ANTISPAM_SYSTEM ANTIVIRUS_SYSTEM API_ALLOWED_IP API BACKEND_PORT BACKUP_GZIP BACKUP_MODE BACKUP_SYSTEM CRON_SYSTEM DB_PMA_ALIAS DB_SYSTEM DISK_QUOTA DNS_SYSTEM ENFORCE_SUBDOMAIN_OWNERSHIP FILE_MANAGER FIREWALL_EXTENSION FIREWALL_SYSTEM FTP_SYSTEM IMAP_SYSTEM INACTIVE_SESSION_TIMEOUT LANGUAGE LOGIN_STYLE MAIL_SYSTEM PROXY_PORT PROXY_SSL_PORT PROXY_SYSTEM RELEASE_BRANCH STATS_SYSTEM THEME UPDATE_HOSTNAME_SSL UPGRADE_SEND_EMAIL UPGRADE_SEND_EMAIL_LOG WEB_BACKEND WEBMAIL_ALIAS WEBMAIL_SYSTEM WEB_PORT WEB_RGROUPS WEB_SSL WEB_SSL_PORT WEB_SYSTEM WEB_TERMINAL WEB_TERMINAL_PORT VERSION DISABLE_IP_CHECK"
  175. write_kv_config_file
  176. unset system
  177. unset known_keys
  178. }
  179. # Restore System Configuration
  180. # Replaces $HESTIA/conf/hestia.conf with "known good defaults" file ($HESTIA/conf/defaults/hestia.conf)
  181. function syshealth_restore_system_config() {
  182. if [ -f "$HESTIA/conf/defaults/hestia.conf" ]; then
  183. mv $HESTIA/conf/hestia.conf $HESTIA/conf/hestia.conf.old
  184. cp $HESTIA/conf/defaults/hestia.conf $HESTIA/conf/hestia.conf
  185. rm -f $HESTIA/conf/hestia.conf.old
  186. else
  187. echo "ERROR: System default configuration file not found, aborting."
  188. exit 1
  189. fi
  190. }
  191. function check_key_exists() {
  192. grep -e "^$1=" $HESTIA/conf/hestia.conf
  193. }
  194. # Repair System Configuration
  195. # Adds missing variables to $HESTIA/conf/hestia.conf with safe default values
  196. function syshealth_repair_system_config() {
  197. # Release branch
  198. if [[ -z $(check_key_exists 'RELEASE_BRANCH') ]]; then
  199. echo "[ ! ] Adding missing variable to hestia.conf: RELEASE_BRANCH ('release')"
  200. $BIN/v-change-sys-config-value 'RELEASE_BRANCH' 'release'
  201. fi
  202. # Webmail alias
  203. if [ -n "$IMAP_SYSTEM" ]; then
  204. if [[ -z $(check_key_exists 'WEBMAIL_ALIAS') ]]; then
  205. echo "[ ! ] Adding missing variable to hestia.conf: WEBMAIL_ALIAS ('webmail')"
  206. $BIN/v-change-sys-config-value 'WEBMAIL_ALIAS' 'webmail'
  207. fi
  208. fi
  209. # phpMyAdmin/phpPgAdmin alias
  210. if [ -n "$DB_SYSTEM" ]; then
  211. if [ "$DB_SYSTEM" = "mysql" ]; then
  212. if [[ -z $(check_key_exists 'DB_PMA_ALIAS') ]]; then
  213. echo "[ ! ] Adding missing variable to hestia.conf: DB_PMA_ALIAS ('phpmyadmin)"
  214. $BIN/v-change-sys-config-value 'DB_PMA_ALIAS' 'phpmyadmin'
  215. fi
  216. fi
  217. if [ "$DB_SYSTEM" = "pgsql" ]; then
  218. if [[ -z $(check_key_exists 'DB_PGA_ALIAS') ]]; then
  219. echo "[ ! ] Adding missing variable to hestia.conf: DB_PGA_ALIAS ('phppgadmin')"
  220. $BIN/v-change-sys-config-value 'DB_PGA_ALIAS' 'phppgadmin'
  221. fi
  222. fi
  223. fi
  224. # Backup compression level
  225. if [[ -z $(check_key_exists 'BACKUP_GZIP') ]]; then
  226. echo "[ ! ] Adding missing variable to hestia.conf: BACKUP_GZIP ('4')"
  227. $BIN/v-change-sys-config-value 'BACKUP_GZIP' '4'
  228. fi
  229. # Theme
  230. if [[ -z $(check_key_exists 'THEME') ]]; then
  231. echo "[ ! ] Adding missing variable to hestia.conf: THEME ('dark')"
  232. $BIN/v-change-sys-config-value 'THEME' 'dark'
  233. fi
  234. # Default language
  235. if [[ -z $(check_key_exists 'LANGUAGE') ]]; then
  236. echo "[ ! ] Adding missing variable to hestia.conf: LANGUAGE ('en')"
  237. $BIN/v-change-sys-language 'LANGUAGE' 'en'
  238. fi
  239. # Disk Quota
  240. if [[ -z $(check_key_exists 'DISK_QUOTA') ]]; then
  241. echo "[ ! ] Adding missing variable to hestia.conf: DISK_QUOTA ('no')"
  242. $BIN/v-change-sys-config-value 'DISK_QUOTA' 'no'
  243. fi
  244. # CRON daemon
  245. if [[ -z $(check_key_exists 'CRON_SYSTEM') ]]; then
  246. echo "[ ! ] Adding missing variable to hestia.conf: CRON_SYSTEM ('cron')"
  247. $BIN/v-change-sys-config-value 'CRON_SYSTEM' 'cron'
  248. fi
  249. # Backend port
  250. if [[ -z $(check_key_exists 'BACKEND_PORT') ]]; then
  251. ORIGINAL_PORT=$(sed -ne "/listen/{s/.*listen[^0-9]*\([0-9][0-9]*\)[ \t]*ssl\;/\1/p;q}" "$HESTIA/nginx/conf/nginx.conf")
  252. echo "[ ! ] Adding missing variable to hestia.conf: BACKEND_PORT ('$ORIGINAL_PORT')"
  253. $BIN/v-change-sys-config-value 'BACKEND_PORT' $ORIGINAL_PORT
  254. fi
  255. # Upgrade: Send email notification
  256. if [[ -z $(check_key_exists 'UPGRADE_SEND_EMAIL') ]]; then
  257. echo "[ ! ] Adding missing variable to hestia.conf: UPGRADE_SEND_EMAIL ('true')"
  258. $BIN/v-change-sys-config-value 'UPGRADE_SEND_EMAIL' 'true'
  259. fi
  260. # Upgrade: Send email notification
  261. if [[ -z $(check_key_exists 'UPGRADE_SEND_EMAIL_LOG') ]]; then
  262. echo "[ ! ] Adding missing variable to hestia.conf: UPGRADE_SEND_EMAIL_LOG ('false')"
  263. $BIN/v-change-sys-config-value 'UPGRADE_SEND_EMAIL_LOG' 'false'
  264. fi
  265. # File Manager
  266. if [[ -z $(check_key_exists 'FILE_MANAGER') ]]; then
  267. echo "[ ! ] Adding missing variable to hestia.conf: FILE_MANAGER ('true')"
  268. $BIN/v-add-sys-filemanager quiet
  269. fi
  270. # Support for ZSTD / GZIP Change
  271. if [[ -z $(check_key_exists 'BACKUP_MODE') ]]; then
  272. echo "[ ! ] Setting zstd backup compression type as default..."
  273. $BIN/v-change-sys-config-value "BACKUP_MODE" "zstd"
  274. fi
  275. # Login style switcher
  276. if [[ -z $(check_key_exists 'LOGIN_STYLE') ]]; then
  277. echo "[ ! ] Adding missing variable to hestia.conf: LOGIN_STYLE ('default')"
  278. $BIN/v-change-sys-config-value "LOGIN_STYLE" "default"
  279. fi
  280. # Webmail clients
  281. if [[ -z $(check_key_exists 'WEBMAIL_SYSTEM') ]]; then
  282. if [ -d "/var/lib/roundcube" ]; then
  283. echo "[ ! ] Adding missing variable to hestia.conf: WEBMAIL_SYSTEM ('roundcube')"
  284. $BIN/v-change-sys-config-value "WEBMAIL_SYSTEM" "roundcube"
  285. else
  286. echo "[ ! ] Adding missing variable to hestia.conf: WEBMAIL_SYSTEM ('')"
  287. $BIN/v-change-sys-config-value "WEBMAIL_SYSTEM" ""
  288. fi
  289. fi
  290. # Inactive session timeout
  291. if [[ -z $(check_key_exists 'INACTIVE_SESSION_TIMEOUT') ]]; then
  292. echo "[ ! ] Adding missing variable to hestia.conf: INACTIVE_SESSION_TIMEOUT ('60')"
  293. $BIN/v-change-sys-config-value "INACTIVE_SESSION_TIMEOUT" "60"
  294. fi
  295. # Enforce subdomain ownership
  296. if [[ -z $(check_key_exists 'ENFORCE_SUBDOMAIN_OWNERSHIP') ]]; then
  297. echo "[ ! ] Adding missing variable to hestia.conf: ENFORCE_SUBDOMAIN_OWNERSHIP ('yes')"
  298. $BIN/v-change-sys-config-value "ENFORCE_SUBDOMAIN_OWNERSHIP" "yes"
  299. fi
  300. if [[ -z $(check_key_exists 'API') ]]; then
  301. echo "[ ! ] Adding missing variable to hestia.conf: API ('no')"
  302. $BIN/v-change-sys-config-value "API" "no"
  303. fi
  304. # Enable API V2
  305. if [[ -z $(check_key_exists 'API_SYSTEM') ]]; then
  306. echo "[ ! ] Adding missing variable to hestia.conf: API_SYSTEM ('0')"
  307. $BIN/v-change-sys-config-value "API_SYSTEM" "0"
  308. fi
  309. # API access allowed IP's
  310. if [ "$API" = "yes" ]; then
  311. check_api_key=$(grep "API_ALLOWED_IP" $HESTIA/conf/hestia.conf)
  312. if [ -z "$check_api_key" ]; then
  313. if [[ -z $(check_key_exists 'API_ALLOWED_IP') ]]; then
  314. echo "[ ! ] Adding missing variable to hestia.conf: API_ALLOWED_IP ('allow-all')"
  315. $BIN/v-change-sys-config-value "API_ALLOWED_IP" "allow-all"
  316. fi
  317. fi
  318. fi
  319. # Debug mode
  320. if [[ -z $(check_key_exists 'DEBUG_MODE') ]]; then
  321. echo "[ ! ] Adding missing variable to hestia.conf: DEBUG_MODE ('false')"
  322. $BIN/v-change-sys-config-value "DEBUG_MODE" "false"
  323. fi
  324. # Quick install plugin
  325. if [[ -z $(check_key_exists 'PLUGIN_APP_INSTALLER') ]]; then
  326. echo "[ ! ] Adding missing variable to hestia.conf: PLUGIN_APP_INSTALLER ('true')"
  327. $BIN/v-change-sys-config-value "PLUGIN_APP_INSTALLER" "true"
  328. fi
  329. # Web Terminal
  330. if [[ -z $(check_key_exists 'WEB_TERMINAL') ]]; then
  331. echo "[ ! ] Adding missing variable to hestia.conf: WEB_TERMINAL ('false')"
  332. $BIN/v-change-sys-config-value "WEB_TERMINAL" "false"
  333. fi
  334. if [[ -z $(check_key_exists 'WEB_TERMINAL_PORT') ]]; then
  335. echo "[ ! ] Adding missing variable to hestia.conf: WEB_TERMINAL_PORT ('8085')"
  336. $BIN/v-change-sys-config-value "WEB_TERMINAL_PORT" "8085"
  337. fi
  338. # Enable preview mode
  339. if [[ -z $(check_key_exists 'POLICY_SYSTEM_ENABLE_BACON') ]]; then
  340. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_SYSTEM_ENABLE_BACON ('false')"
  341. $BIN/v-change-sys-config-value "POLICY_SYSTEM_ENABLE_BACON" "false"
  342. fi
  343. # Hide system services
  344. if [[ -z $(check_key_exists 'POLICY_SYSTEM_HIDE_SERVICES') ]]; then
  345. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_SYSTEM_HIDE_SERVICES ('no')"
  346. $BIN/v-change-sys-config-value "POLICY_SYSTEM_HIDE_SERVICES" "no"
  347. fi
  348. # Password reset
  349. if [[ -z $(check_key_exists 'POLICY_SYSTEM_PASSWORD_RESET') ]]; then
  350. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_SYSTEM_PASSWORD_RESET ('no')"
  351. $BIN/v-change-sys-config-value "POLICY_SYSTEM_PASSWORD_RESET" "no"
  352. fi
  353. # Theme editor
  354. if [[ -z $(check_key_exists 'POLICY_USER_CHANGE_THEME') ]]; then
  355. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_USER_CHANGE_THEME ('yes')"
  356. $BIN/v-change-sys-config-value "POLICY_USER_CHANGE_THEME" "yes"
  357. fi
  358. # Protect admin user
  359. if [[ -z $(check_key_exists 'POLICY_SYSTEM_PROTECTED_ADMIN') ]]; then
  360. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_SYSTEM_PROTECTED_ADMIN ('no')"
  361. $BIN/v-change-sys-config-value "POLICY_SYSTEM_PROTECTED_ADMIN" "no"
  362. fi
  363. # Allow user delete logs
  364. if [[ -z $(check_key_exists 'POLICY_USER_DELETE_LOGS') ]]; then
  365. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_USER_DELETE_LOGS ('yes')"
  366. $BIN/v-change-sys-config-value "POLICY_USER_DELETE_LOGS" "yes"
  367. fi
  368. # Allow users to delete details
  369. if [[ -z $(check_key_exists 'POLICY_USER_EDIT_DETAILS') ]]; then
  370. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_USER_EDIT_DETAILS ('yes')"
  371. $BIN/v-change-sys-config-value "POLICY_USER_EDIT_DETAILS" "yes"
  372. fi
  373. # Allow users to edit DNS templates
  374. if [[ -z $(check_key_exists 'POLICY_USER_EDIT_DNS_TEMPLATES') ]]; then
  375. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_USER_EDIT_DNS_TEMPLATES ('yes')"
  376. $BIN/v-change-sys-config-value "POLICY_USER_EDIT_DNS_TEMPLATES" "yes"
  377. fi
  378. # Allow users to edit web templates
  379. if [[ -z $(check_key_exists 'POLICY_USER_EDIT_WEB_TEMPLATES') ]]; then
  380. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_USER_EDIT_WEB_TEMPLATES ('yes')"
  381. $BIN/v-change-sys-config-value "POLICY_USER_EDIT_WEB_TEMPLATES" "yes"
  382. fi
  383. # View user logs
  384. if [[ -z $(check_key_exists 'POLICY_USER_VIEW_LOGS') ]]; then
  385. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_USER_VIEW_LOGS ('yes')"
  386. $BIN/v-change-sys-config-value "POLICY_USER_VIEW_LOGS" "yes"
  387. fi
  388. # Allow users to login (read only) when suspended
  389. if [[ -z $(check_key_exists 'POLICY_USER_VIEW_SUSPENDED') ]]; then
  390. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_USER_VIEW_SUSPENDED ('no')"
  391. $BIN/v-change-sys-config-value "POLICY_USER_VIEW_SUSPENDED" "no"
  392. fi
  393. # PHPMyadmin SSO key
  394. if [[ -z $(check_key_exists 'PHPMYADMIN_KEY') ]]; then
  395. echo "[ ! ] Adding missing variable to hestia.conf: PHPMYADMIN_KEY ('')"
  396. $BIN/v-change-sys-config-value "PHPMYADMIN_KEY" ""
  397. fi
  398. # Use SMTP server for hestia internal mail
  399. if [[ -z $(check_key_exists 'USE_SERVER_SMTP') ]]; then
  400. echo "[ ! ] Adding missing variable to hestia.conf: USE_SERVER_SMTP ('')"
  401. $BIN/v-change-sys-config-value "USE_SERVER_SMTP" "false"
  402. fi
  403. if [[ -z $(check_key_exists 'SERVER_SMTP_PORT') ]]; then
  404. echo "[ ! ] Adding missing variable to hestia.conf: SERVER_SMTP_PORT ('')"
  405. $BIN/v-change-sys-config-value "SERVER_SMTP_PORT" ""
  406. fi
  407. if [[ -z $(check_key_exists 'SERVER_SMTP_HOST') ]]; then
  408. echo "[ ! ] Adding missing variable to hestia.conf: SERVER_SMTP_HOST ('')"
  409. $BIN/v-change-sys-config-value "SERVER_SMTP_HOST" ""
  410. fi
  411. if [[ -z $(check_key_exists 'SERVER_SMTP_SECURITY') ]]; then
  412. echo "[ ! ] Adding missing variable to hestia.conf: SERVER_SMTP_SECURITY ('')"
  413. $BIN/v-change-sys-config-value "SERVER_SMTP_SECURITY" ""
  414. fi
  415. if [[ -z $(check_key_exists 'SERVER_SMTP_USER') ]]; then
  416. echo "[ ! ] Adding missing variable to hestia.conf: SERVER_SMTP_USER ('')"
  417. $BIN/v-change-sys-config-value "SERVER_SMTP_USER" ""
  418. fi
  419. if [[ -z $(check_key_exists 'SERVER_SMTP_PASSWD') ]]; then
  420. echo "[ ! ] Adding missing variable to hestia.conf: SERVER_SMTP_PASSWD ('')"
  421. $BIN/v-change-sys-config-value "SERVER_SMTP_PASSWD" ""
  422. fi
  423. if [[ -z $(check_key_exists 'SERVER_SMTP_ADDR') ]]; then
  424. echo "[ ! ] Adding missing variable to hestia.conf: SERVER_SMTP_ADDR ('')"
  425. $BIN/v-change-sys-config-value "SERVER_SMTP_ADDR" ""
  426. fi
  427. if [[ -z $(check_key_exists 'POLICY_CSRF_STRICTNESS') ]]; then
  428. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_CSRF_STRICTNESS ('')"
  429. $BIN/v-change-sys-config-value "POLICY_CSRF_STRICTNESS" "1"
  430. fi
  431. if [[ -z $(check_key_exists 'DNS_CLUSTER_SYSTEM') ]]; then
  432. echo "[ ! ] Adding missing variable to hestia.conf: DNS_CLUSTER_SYSTEM ('hestia')"
  433. $BIN/v-change-sys-config-value "DNS_CLUSTER_SYSTEM" "hestia"
  434. fi
  435. if [[ -z $(check_key_exists 'DISABLE_IP_CHECK') ]]; then
  436. echo "[ ! ] Adding missing variable to hestia.conf: DISABLE_IP_CHECK ('no')"
  437. $BIN/v-change-sys-config-value "DISABLE_IP_CHECK" "no"
  438. fi
  439. if [[ -z $(check_key_exists 'APP_NAME') ]]; then
  440. echo "[ ! ] Adding missing variable to hestia.conf: APP_NAME ('Hestia Control Panel')"
  441. $BIN/v-change-sys-config-value "APP_NAME" "Hestia Control Panel"
  442. fi
  443. if [[ -z $(check_key_exists 'FROM_NAME') ]]; then
  444. # Default is always APP_NAME
  445. echo "[ ! ] Adding missing variable to hestia.conf: FROM_NAME ('')"
  446. $BIN/v-change-sys-config-value "FROM_NAME" ""
  447. fi
  448. if [[ -z $(check_key_exists 'FROM_EMAIL') ]]; then
  449. # Default is always noreply@hostname.com
  450. echo "[ ! ] Adding missing variable to hestia.conf: FROM_EMAIL ('')"
  451. $BIN/v-change-sys-config-value "FROM_EMAIL" ""
  452. fi
  453. if [[ -z $(check_key_exists 'SUBJECT_EMAIL') ]]; then
  454. echo "[ ! ] Adding missing variable to hestia.conf: SUBJECT_EMAIL ('{{subject}}')"
  455. $BIN/v-change-sys-config-value "SUBJECT_EMAIL" "{{subject}}"
  456. fi
  457. if [[ -z $(check_key_exists 'BACKUP_INCREMENTAL') ]]; then
  458. echo "[ ! ] Adding missing variable to hestia.conf: BACKUP_INCREMENTAL ('no')"
  459. $BIN/v-change-sys-config-value "BACKUP_INCREMENTAL" "no"
  460. fi
  461. if [[ -z $(check_key_exists 'TITLE') ]]; then
  462. echo "[ ! ] Adding missing variable to hestia.conf: TITLE ('{{page}} - {{hostname}} - {{appname}}')"
  463. $BIN/v-change-sys-config-value "TITLE" "{{page}} - {{hostname}} - {{appname}}"
  464. fi
  465. if [[ -z $(check_key_exists 'HIDE_DOCS') ]]; then
  466. echo "[ ! ] Adding missing variable to hestia.conf: HIDE_DOCS ('no')"
  467. $BIN/v-change-sys-config-value "HIDE_DOCS" "no"
  468. fi
  469. if [[ -z $(check_key_exists 'POLICY_SYNC_ERROR_DOCUMENTS') ]]; then
  470. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_SYNC_ERROR_DOCUMENTS ('yes')"
  471. $BIN/v-change-sys-config-value "POLICY_SYNC_ERROR_DOCUMENTS" "yes"
  472. fi
  473. if [[ -z $(check_key_exists 'POLICY_SYNC_SKELETON') ]]; then
  474. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_SYNC_SKELETON ('yes')"
  475. $BIN/v-change-sys-config-value "POLICY_SYNC_SKELETON" "yes"
  476. fi
  477. if [[ -z $(check_key_exists 'POLICY_BACKUP_SUSPENDED_USERS') ]]; then
  478. echo "[ ! ] Adding missing variable to hestia.conf: POLICY_BACKUP_SUSPENDED_USERS ('no')"
  479. $BIN/v-change-sys-config-value "POLICY_BACKUP_SUSPENDED_USERS" "no"
  480. fi
  481. if [[ -z $(check_key_exists 'ROOT_USER') ]]; then
  482. echo "[ ! ] Adding missing variable to hestia.conf: ROOT_USER ('admin')"
  483. $BIN/v-change-sys-config-value "ROOT_USER" "admin"
  484. fi
  485. if [[ -z $(check_key_exists 'DOMAINDIR_WRITABLE') ]]; then
  486. echo "[ ! ] Adding missing variable to hestia.conf: DOMAINDIR_WRITABLE ('no')"
  487. $BIN/v-change-sys-config-value "DOMAINDIR_WRITABLE" "no"
  488. fi
  489. touch $HESTIA/conf/hestia.conf.new
  490. while IFS='= ' read -r lhs rhs; do
  491. if [[ ! $lhs =~ ^\ *# && -n $lhs ]]; then
  492. rhs="${rhs%%^\#*}" # Del in line right comments
  493. rhs="${rhs%%*( )}" # Del trailing spaces
  494. rhs="${rhs%\'*}" # Del opening string quotes
  495. rhs="${rhs#\'*}" # Del closing string quotes
  496. fi
  497. check_ckey=$(grep "^$lhs='" "$HESTIA/conf/hestia.conf.new")
  498. if [ -z "$check_ckey" ]; then
  499. echo "$lhs='$rhs'" >> "$HESTIA/conf/hestia.conf.new"
  500. else
  501. sed -i "s|^$lhs=.*|$lhs='$rhs'|g" "$HESTIA/conf/hestia.conf.new"
  502. fi
  503. done < $HESTIA/conf/hestia.conf
  504. cmp --silent $HESTIA/conf/hestia.conf $HESTIA/conf/hestia.conf.new
  505. if [ $? -ne 0 ]; then
  506. echo "[ ! ] Duplicated keys found repair config"
  507. rm $HESTIA/conf/hestia.conf
  508. cp $HESTIA/conf/hestia.conf.new $HESTIA/conf/hestia.conf
  509. rm $HESTIA/conf/hestia.conf.new
  510. fi
  511. source_conf "$HESTIA/conf/hestia.conf"
  512. }
  513. # Repair System Cron Jobs
  514. # Add default cron jobs to "hestiaweb" user account's cron tab
  515. function syshealth_repair_system_cronjobs() {
  516. min=$(gen_pass '012345' '2')
  517. hour=$(gen_pass '1234567' '1')
  518. echo "MAILTO=$email" > /var/spool/cron/crontabs/hestiaweb
  519. echo "CONTENT_TYPE=\"text/plain; charset=utf-8\"" >> /var/spool/cron/crontabs/hestiaweb
  520. echo "*/2 * * * * sudo /usr/local/hestia/bin/v-update-sys-queue restart" >> /var/spool/cron/crontabs/hestiaweb
  521. echo "10 00 * * * sudo /usr/local/hestia/bin/v-update-sys-queue daily" >> /var/spool/cron/crontabs/hestiaweb
  522. echo "15 02 * * * sudo /usr/local/hestia/bin/v-update-sys-queue disk" >> /var/spool/cron/crontabs/hestiaweb
  523. echo "10 00 * * * sudo /usr/local/hestia/bin/v-update-sys-queue traffic" >> /var/spool/cron/crontabs/hestiaweb
  524. echo "30 03 * * * sudo /usr/local/hestia/bin/v-update-sys-queue webstats" >> /var/spool/cron/crontabs/hestiaweb
  525. echo "*/5 * * * * sudo /usr/local/hestia/bin/v-update-sys-queue backup" >> /var/spool/cron/crontabs/hestiaweb
  526. echo "10 05 * * * sudo /usr/local/hestia/bin/v-backup-users" >> /var/spool/cron/crontabs/hestiaweb
  527. echo "20 00 * * * sudo /usr/local/hestia/bin/v-update-user-stats" >> /var/spool/cron/crontabs/hestiaweb
  528. echo "*/5 * * * * sudo /usr/local/hestia/bin/v-update-sys-rrd" >> /var/spool/cron/crontabs/hestiaweb
  529. echo "$min $hour * * * sudo /usr/local/hestia/bin/v-update-letsencrypt-ssl" >> /var/spool/cron/crontabs/hestiaweb
  530. echo "41 4 * * * sudo /usr/local/hestia/bin/v-update-sys-hestia-all" >> /var/spool/cron/crontabs/hestiaweb
  531. }
  532. # Adapt Port Listing in HESTIA NGINX Backend
  533. # Activates or deactivates port listing on IPV4 or/and IPV6 network interfaces
  534. function syshealth_adapt_hestia_nginx_listen_ports() {
  535. # Detect "physical" NICs only (virtual NICs created by Docker, WireGuard etc. are excluded)
  536. physical_nics="$(ip -d -j link show | jq -r '.[] | if .link_type == "loopback" // .linkinfo.info_kind then empty else .ifname end')"
  537. if [ -z "$physical_nics" ]; then
  538. physical_nics="$(ip -d -j link show | jq -r '.[] | if .link_type == "loopback" then empty else .ifname end')"
  539. fi
  540. for nic in $physical_nics; do
  541. if [ -z "$ipv4_scope_global" ]; then
  542. ipv4_scope_global="$(ip -4 -d -j addr show "$nic" | jq -r '.[] | select(length > 0) | .addr_info[] | if .scope == "global" then .local else empty end')"
  543. fi
  544. if [ -z "$ipv6_scope_global" ]; then
  545. ipv6_scope_global="$(ip -6 -d -j addr show "$nic" | jq -r '.[] | select(length > 0) | .addr_info[] | if .scope == "global" then .local else empty end')"
  546. fi
  547. done
  548. # Adapt port listing in nginx.conf depended on availability of IPV4 and IPV6 network interface
  549. NGINX_CONF="/usr/local/hestia/nginx/conf/nginx.conf"
  550. if [ -z "$ipv4_scope_global" ]; then
  551. sed -i 's/^\([ \t]*listen[ \t]*[0-9]\{1,5\}.*\)/#\1/' "$NGINX_CONF"
  552. else
  553. sed -i 's/#\([ \t]*listen[ \t]*[0-9]\{1,5\}.*\)/\1/' "$NGINX_CONF"
  554. fi
  555. if [ -z "$ipv6_scope_global" ]; then
  556. sed -i 's/^\([ \t]*listen[ \t]*\[\:\:\]\:[0-9]\{1,5\}.*\)/#\1/' "$NGINX_CONF"
  557. else
  558. sed -i 's/#\([ \t]*listen[ \t]*\[\:\:\]\:[0-9]\{1,5\}.*\)/\1/' "$NGINX_CONF"
  559. fi
  560. }
  561. syshealth_adapt_nginx_resolver() {
  562. NGINX_CONF="/usr/local/hestia/nginx/conf/nginx.conf"
  563. if grep -qw "1.0.0.1 8.8.4.4 1.1.1.1 8.8.8.8" "$NGINX_CONF"; then
  564. for nameserver in $(grep -is '^nameserver' /etc/resolv.conf | cut -d' ' -f2 | tr '\r\n' ' ' | xargs); do
  565. if echo "$nameserver" | grep -Pq "^(\d{1,3}\.){3}\d{1,3}$"; then
  566. if [ -z "$resolver" ]; then
  567. resolver="$nameserver"
  568. else
  569. resolver="$resolver $nameserver"
  570. fi
  571. fi
  572. done
  573. if [ -n "$resolver" ]; then
  574. sed -i "s/1.0.0.1 8.8.4.4 1.1.1.1 8.8.8.8/$resolver/g" "$NGINX_CONF"
  575. fi
  576. fi
  577. }