Files @ 9bfee64f690e
Branch filter:

Location: FVDE/ennstatus/Scripts/update_server.py - annotation

Dennis Fink
First release
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
import subprocess
import configparser
import re
import json

import requests

from ast import literal_eval

OBFS_REGEX = re.compule(r'^ServerTransportPlugin obfs2,obfs3')

IP_REGEX = re.compile((r'^(OutboundBindAddress)'
                       r' (\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3})'))


def read_tor_config(configfile="/etc/tor/torrc"):

    with open(configfile) as fb:
        lines = {line[:-1] for line in fb if not line.startswith('#')}

    lines = {line for line in filter(None, lines)}
    return lines


def get_tor_status(name='tor'):

    try:
        pids = subprocess.check_output(['pidof', 'tor']).decode('utf-8')
        pids = pids.split(' ')
        pid_file = '.'.join([name, 'pid'])
        pid = open('/'.join(['var', 'run', name, pid_file])).readline()

        if pid in pids:
            return "Online"
        else:
            return "Offline"
    except subprocess.CalledProcessError:
        return "Offline"


def get_tor_fingerprint(name='tor'):

    fingerprint_file = '/'.join(['var', 'lib', name, 'fingerprint'])

    with open(fingerprint_file) as fb:
        line = fb.readline()[:-1]

    hostname, fingerprint = line.split(' ')
    return hostname, fingerprint


def get_server_type(tor_config):

    if 'BridgeRelay 1' in tor_config:
        if any(OBFS_REGEX.match(i) for i in tor_config):
            return 'Bridge', 'True'
        else:
            return 'Bridge', 'False'
    elif 'ExitPolicy reject *:*' in tor_config:
        return 'Relay', None
    else:
        return 'Exit', None


def get_ip(tor_config):

    for i in tor_config:
        match = IP_REGEX.match(i)

        if match:
            return i.groups()[1]
        else:
            return None


def get_config():

    config = configparser.ConfigParser()
    config.read('/etc/ennstatus_updater.conf')

    return config


def create_server_json(tor_configfile='/etc/tor/torrc', name='tor'):

    tor_config = read_tor_config(tor_configfile)
    server_type, obfs = get_server_type(tor_config)
    hostname, fingerprint = get_tor_fingerprint(name)
    tor_status = get_tor_status(name)
    ip = get_ip(tor_config)

    dictionary = {'server_type': server_type, 'server_name': hostname,
                  'tor_status': tor_status}

    if ip is not None:
        dictionary['ip'] = ip

    if obfs is not None:
        dictionary['obfs'] = obfs

    if server_type != 'Bridge':
        dictionary['fingerprint'] = fingerprint

    return json.dumps(dictionary)


def update_server(server_json, url):

    response = requests.post(url + '/api/update', data=server_json)

    return response.text


def main():

    config = get_config()
    ennstatus_url = config['main']['ennstatus_url']

    if 'servers' in config['main']:
        for server in literal_eval(config['main']['servers']):
            server_json = create_server_json(config[server]['configfile'],
                                             server)
            response = update_server(server_json, ennstatus_url)
    else:
        server_json = create_server_json()
        response = update_server(server_json, ennstatus_url)

    print(response)