Files @ 054c5e8fb877
Branch filter:

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

Dennis Fink
updated script
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
2d83b2f6b3fb
9bfee64f690e
9bfee64f690e
10a3ee9cb0c8
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
10a3ee9cb0c8
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
de6292f200dc
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
10a3ee9cb0c8
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
de6292f200dc
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
19eee9446f54
19eee9446f54
10a3ee9cb0c8
10a3ee9cb0c8
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
9bfee64f690e
054c5e8fb877
054c5e8fb877
054c5e8fb877
054c5e8fb877
9bfee64f690e
054c5e8fb877
054c5e8fb877
054c5e8fb877
054c5e8fb877
054c5e8fb877
9bfee64f690e
dc9fa1a9e864
dc9fa1a9e864
dc9fa1a9e864
import subprocess
import configparser
import re
import json

import requests

from ast import literal_eval

OBFS_REGEX = re.compile(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', 'tor', 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 is not None:
            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 dictionary


def update_server(server_json, url):

    headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}

    response = requests.post(url + '/api/update', data=json.dumps(server_json),
                             headers=headers)
    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)
            print(response, end='')
    else:
        server_json = create_server_json()
        response = update_server(server_json, ennstatus_url)
        print(response, end='')


if __name__ == '__main__':
    main()