diff --git a/ennstatus/api/functions.py b/ennstatus/api/functions.py --- a/ennstatus/api/functions.py +++ b/ennstatus/api/functions.py @@ -6,6 +6,9 @@ from datetime import datetime import pygeoip +from ennstatus.status.functions import _send_mail + + FINGERPRINT_REGEX = re.compile(r'^[A-Z0-9]{40}$', re.I) IP_REGEX = (r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}' @@ -22,6 +25,9 @@ DATE_FORMAT = '%d-%m-%Y %H:%M:%S' gi4 = pygeoip.GeoIP('/usr/share/GeoIP/GeoIP.dat', pygeoip.MEMORY_CACHE) +mail_cache = {} + + def check_bridge(key, server): if key not in server: @@ -71,6 +77,7 @@ def update_server(server, ip): server['last_updated'] = datetime.utcnow().strftime(DATE_FORMAT) server['server_status'] = 'Online' server['country'] = gi4.country_name_by_addr(ip) + server_name = server['server_name'] if server['server_type'] == 'Bridge': if 'ip' in server: @@ -83,11 +90,27 @@ def update_server(server, ip): server['ip'] = ip try: - filename = ''.join(['data/', server['server_name'].lower(), '.json']) + filename = ''.join(['data/', server_name.lower(), '.json']) with open(filename, 'w', encoding='utf-8') as fb: json.dump(server, fb) - - return server except Exception as e: return e + + if server['tor_status'] == 'Offline': + subject = '[Ennstatus] %s Tor status went offline' + + if server_name in mail_cache: + send_date = mail_cache[server_name] + now = datetime.utcnow() + delta = now - send_date + + if not delta.seconds >= 7200: + return server + + _send_mail(server_name, server['last_updated'], subject) + mail_cache[server_name] = datetime.utcnow() + elif server_name in mail_cache: + del mail_cache[server_name] + + return server diff --git a/ennstatus/status/functions.py b/ennstatus/status/functions.py --- a/ennstatus/status/functions.py +++ b/ennstatus/status/functions.py @@ -12,11 +12,13 @@ from flask_mail import Mail, Message mail = Mail() -def _send_mail(server_name, last_updated): +def _send_mail(server_name, last_updated, subject=None): current_app.logger.info('Try sending mail') try: - msg = Message('[Ennstatus] %s went offline' % (server_name), + if subject is None: + subject = '[Ennstatus] %s went offline' + msg = Message(subject % server_name, sender='ennstatus@enn.lu') msg.add_recipient(current_app.config['SERVER_ADMINS'][server_name]) msg.body = ('%s went offline. I received the last update at %s'