[Watchdog] Add external check for open relay, requires SAL
This commit is contained in:
		
							parent
							
								
									fc37442d21
								
							
						
					
					
						commit
						f1aa306ff2
					
				| @ -161,6 +161,39 @@ if grep -qi "$(echo ${IPV6_NETWORK} | cut -d: -f1-3)" <<< "$(ip a s)"; then | |||||||
|   fi |   fi | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
|  | external_checks() { | ||||||
|  |   err_count=0 | ||||||
|  |   diff_c=0 | ||||||
|  |   THRESHOLD=1 | ||||||
|  |   # Reduce error count by 2 after restarting an unhealthy container | ||||||
|  |   GUID=$(mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT version FROM versions WHERE application = 'GUID'" -BN) | ||||||
|  |   trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1 | ||||||
|  |   while [ ${err_count} -lt ${THRESHOLD} ]; do | ||||||
|  |     err_c_cur=${err_count} | ||||||
|  |     CHECK_REPONSE="$(curl --connect-timeout 3 -m 10 -4 -s https://checks.mailcow.email -X POST -dguid=${GUID} 2> /dev/null)" | ||||||
|  |     if [[ ! -z "${CHECK_REPONSE}" ]] && [[ "$(echo ${CHECK_REPONSE} | jq -r .response)" == "critical" ]]; then | ||||||
|  |       echo ${CHECK_REPONSE} | jq -r .out > /tmp/external_checks | ||||||
|  |       err_count=$(( ${err_count} + 1 )) | ||||||
|  |     fi | ||||||
|  |     CHECK_REPONSE6="$(curl --connect-timeout 3 -m 10 -6 -s https://checks.mailcow.email -X POST -dguid=${GUID} 2> /dev/null)" | ||||||
|  |     if [[ ! -z "${CHECK_REPONSE6}" ]] && [[ "$(echo ${CHECK_REPONSE6} | jq -r .response)" == "critical" ]]; then | ||||||
|  |       echo ${CHECK_REPONSE} | jq -r .out > /tmp/external_checks | ||||||
|  |       err_count=$(( ${err_count} + 1 )) | ||||||
|  |     fi | ||||||
|  |     [ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1 | ||||||
|  |     [ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} )) | ||||||
|  |     progress "External checks" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c} | ||||||
|  |     if [[ $? == 10 ]]; then | ||||||
|  |       diff_c=0 | ||||||
|  |       sleep 60 | ||||||
|  |     else | ||||||
|  |       diff_c=0 | ||||||
|  |       sleep $(( ( RANDOM % 20 ) + 120 )) | ||||||
|  |     fi | ||||||
|  |   done | ||||||
|  |   return 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| nginx_checks() { | nginx_checks() { | ||||||
|   err_count=0 |   err_count=0 | ||||||
|   diff_c=0 |   diff_c=0 | ||||||
| @ -611,6 +644,20 @@ PID=$! | |||||||
| echo "Spawned nginx_checks with PID ${PID}" | echo "Spawned nginx_checks with PID ${PID}" | ||||||
| BACKGROUND_TASKS+=(${PID}) | BACKGROUND_TASKS+=(${PID}) | ||||||
| 
 | 
 | ||||||
|  | if [[ ${WATCHDOG_EXTERNAL_CHECKS} =~ ^([yY][eE][sS]|[yY])+$ ]]; then | ||||||
|  | ( | ||||||
|  | while true; do | ||||||
|  |   if ! external_checks; then | ||||||
|  |     log_msg "External checks hit error limit" | ||||||
|  |     echo external_checks > /tmp/com_pipe | ||||||
|  |   fi | ||||||
|  | done | ||||||
|  | ) & | ||||||
|  | PID=$! | ||||||
|  | echo "Spawned external_checks with PID ${PID}" | ||||||
|  | BACKGROUND_TASKS+=(${PID}) | ||||||
|  | fi | ||||||
|  | 
 | ||||||
| ( | ( | ||||||
| while true; do | while true; do | ||||||
|   if ! mysql_checks; then |   if ! mysql_checks; then | ||||||
| @ -823,6 +870,9 @@ while true; do | |||||||
|   if [[ ${com_pipe_answer} == "ratelimit" ]]; then |   if [[ ${com_pipe_answer} == "ratelimit" ]]; then | ||||||
|     log_msg "At least one ratelimit was applied" |     log_msg "At least one ratelimit was applied" | ||||||
|     [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${com_pipe_answer}" "Please see mailcow UI logs for further information." |     [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${com_pipe_answer}" "Please see mailcow UI logs for further information." | ||||||
|  |   elif [[ ${com_pipe_answer} == "external_checks" ]]; then | ||||||
|  |     log_msg "Your mailcow is an open relay!" | ||||||
|  |     [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${com_pipe_answer}" "Please stop mailcow now and check your network configuration!" | ||||||
|   elif [[ ${com_pipe_answer} == "acme-mailcow" ]]; then |   elif [[ ${com_pipe_answer} == "acme-mailcow" ]]; then | ||||||
|     log_msg "acme-mailcow did not complete successfully" |     log_msg "acme-mailcow did not complete successfully" | ||||||
|     [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${com_pipe_answer}" "Please check acme-mailcow for further information." |     [[ ! -z ${WATCHDOG_NOTIFY_EMAIL} ]] && mail_error "${com_pipe_answer}" "Please check acme-mailcow for further information." | ||||||
|  | |||||||
| @ -368,7 +368,7 @@ services: | |||||||
|         - /lib/modules:/lib/modules:ro |         - /lib/modules:/lib/modules:ro | ||||||
| 
 | 
 | ||||||
|     watchdog-mailcow: |     watchdog-mailcow: | ||||||
|       image: mailcow/watchdog:1.67 |       image: mailcow/watchdog:1.68 | ||||||
|       # Debug |       # Debug | ||||||
|       #command: /watchdog.sh |       #command: /watchdog.sh | ||||||
|       dns: |       dns: | ||||||
|  | |||||||
| @ -242,6 +242,13 @@ ALLOW_ADMIN_EMAIL_LOGIN=n | |||||||
| # Notify about banned IP (includes whois lookup) | # Notify about banned IP (includes whois lookup) | ||||||
| WATCHDOG_NOTIFY_BAN=y | WATCHDOG_NOTIFY_BAN=y | ||||||
| 
 | 
 | ||||||
|  | # Checks if mailcow is an open relay. Requires a SAL. More checks will follow. | ||||||
|  | # https://www.servercow.de/mailcow?lang=en | ||||||
|  | # https://www.servercow.de/mailcow?lang=de | ||||||
|  | # No data is collected. Opt-in and anonymous. | ||||||
|  | # Will only work with unmodified mailcow setups. | ||||||
|  | WATCHDOG_EXTERNAL_CHECKS=n | ||||||
|  | 
 | ||||||
| # Max log lines per service to keep in Redis logs | # Max log lines per service to keep in Redis logs | ||||||
| 
 | 
 | ||||||
| LOG_LINES=9999 | LOG_LINES=9999 | ||||||
|  | |||||||
| @ -308,6 +308,14 @@ for option in ${CONFIG_ARRAY[@]}; do | |||||||
|       echo '# Notify about banned IP. Includes whois lookup.' >> mailcow.conf |       echo '# Notify about banned IP. Includes whois lookup.' >> mailcow.conf | ||||||
|       echo "WATCHDOG_NOTIFY_BAN=y" >> mailcow.conf |       echo "WATCHDOG_NOTIFY_BAN=y" >> mailcow.conf | ||||||
|   fi |   fi | ||||||
|  |   elif [[ ${option} == "WATCHDOG_EXTERNAL_CHECKS" ]]; then | ||||||
|  |     if ! grep -q ${option} mailcow.conf; then | ||||||
|  |       echo "Adding new option \"${option}\" to mailcow.conf" | ||||||
|  |       echo '# Checks if mailcow is an open relay. Requires a SAL. More checks will follow.' >> mailcow.conf | ||||||
|  |       echo '# No data is collected. Opt-in and anonymous.' >> mailcow.conf | ||||||
|  |       echo '# Will only work with unmodified mailcow setups.' >> mailcow.conf | ||||||
|  |       echo "WATCHDOG_EXTERNAL_CHECKS=n" >> mailcow.conf | ||||||
|  |   fi | ||||||
|   elif [[ ${option} == "SOGO_EXPIRE_SESSION" ]]; then |   elif [[ ${option} == "SOGO_EXPIRE_SESSION" ]]; then | ||||||
|     if ! grep -q ${option} mailcow.conf; then |     if ! grep -q ${option} mailcow.conf; then | ||||||
|       echo "Adding new option \"${option}\" to mailcow.conf" |       echo "Adding new option \"${option}\" to mailcow.conf" | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 andryyy
						andryyy