Files @ 9bfee64f690e
Branch filter:

Location: FVDE/ennstatus/Scripts/update_server.py

Dennis Fink
First release
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)