Files @ 9b0101067e80
Branch filter:

Location: FVDE/ennstatus/ennstatus/status/functions.py - annotation

Dennis Fink
Create filename early in check_server as it is needed anyway
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
02b9d2a9fa0d
5f5d699c039c
9bfee64f690e
d5f3c416fe84
8fe017d00d0c
8fe017d00d0c
8fe017d00d0c
8fe017d00d0c
9bfee64f690e
e19e4b0ce714
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
188c824cd944
5f5d699c039c
5f5d699c039c
a13c3395448b
8fe017d00d0c
9b0101067e80
8fe017d00d0c
8fe017d00d0c
5f5d699c039c
5f5d699c039c
5f5d699c039c
a13c3395448b
9b0101067e80
a13c3395448b
a13c3395448b
a13c3395448b
a13c3395448b
a13c3395448b
5f5d699c039c
5f5d699c039c
5f5d699c039c
5f5d699c039c
5f5d699c039c
5f5d699c039c
5f5d699c039c
5f5d699c039c
8fe017d00d0c
d5f3c416fe84
188c824cd944
188c824cd944
8fe017d00d0c
5f5d699c039c
5f5d699c039c
5f5d699c039c
8fe017d00d0c
8fe017d00d0c
5f5d699c039c
5f5d699c039c
5f5d699c039c
5f5d699c039c
24980ece978c
24980ece978c
24980ece978c
24980ece978c
24980ece978c
24980ece978c
24980ece978c
24980ece978c
24980ece978c
24980ece978c
24980ece978c
24980ece978c
9bfee64f690e
9bfee64f690e
24980ece978c
24980ece978c
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
24980ece978c
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
a13c3395448b
a13c3395448b
a13c3395448b
a13c3395448b
a13c3395448b
02b9d2a9fa0d
02b9d2a9fa0d
02b9d2a9fa0d
02b9d2a9fa0d
02b9d2a9fa0d
02b9d2a9fa0d
02b9d2a9fa0d
a13c3395448b
a13c3395448b
a13c3395448b
a13c3395448b
02b9d2a9fa0d
02b9d2a9fa0d
import os
import os.path
import json

from collections import defaultdict
from datetime import datetime

from flask import current_app
from flask_mail import Mail, Message


mail = Mail()


def _send_mail(server_name, status, last_updated):

    current_app.logger.debug('Try sending mail')
    try:
        msg = Message('[Ennstatus] %s went %s' % (server_name, status))
        msg.add_recipient(current_app.config['ENNSTATUS_ADMINS'][server_name])
        msg.body = ('%s went to %s. I received the last update at %s'
                    % (server_name, status, last_updated))
        mail.send(msg)
    except KeyError:
        current_app.logger.error('Admin for %s not found!' % server_name)
    except Exception as e:
        current_app.logger.error('Unexpected error: %s' % e,
                                 exc_info=True)
    current_app.logger.debug('Finished trying!')


def _check_server(data):

    server_name = data['server_name']
    last_updated = data['last_updated']
    filename = os.path.join('data', '.'.join([server_name.lower(), 'json']))

    date = datetime.strptime(last_updated, '%d-%m-%Y %H:%M:%S')
    now = datetime.utcnow()
    delta = now - date

    if delta.days >= 7:
        os.remove(filename)
        current_app.logger.error('%s was removed!' % server_name)
        return False
    elif data['server_status'] == 'Offline':
        return data

    if delta.seconds >= 3600:
        status = 'Offline'
    elif delta.seconds >= 1200:
        status = 'Unknown'
    else:
        status = None

    if status is not None:
        current_app.logger.error('%s is set to %s' % (server_name,
                                 status))

        _send_mail(server_name, status, last_updated)

        for key in ('server_status', 'tor_status'):
            data[key] = status

        with open(filename, mode='w', encoding='utf-8') as file_object:
            json.dump(data, file_object)

    return data


def _load_single_server(filename):

    try:
        with open(filename, encoding='utf-8') as f:
            server = json.load(f)
    except IOError:
        return False

    server = _check_server(server)
    return server


def single_server(name):

    filename = ''.join(['data/', name, '.json'])
    return _load_single_server(filename)


def _get_json_files(root, files):

    for f in files:
        if f.endswith('.json'):
            yield os.path.join(root, f)


def all_servers():

    for root, _, files in os.walk('data'):
        for f in _get_json_files(root, files):
            yield _load_single_server(f)


def all_servers_by_type(type):

    for server in all_servers():
        try:
            if server['server_type'] == type:
                yield server
        except TypeError:
            continue


def split_all_servers_to_types():

    servers = defaultdict(list)

    for server in all_servers():
        try:
            servers[server['server_type']].append(server)
        except TypeError:
            continue

    return servers