Changeset - 2d83b2f6b3fb
[Not reviewed]
default
0 1 0
Dennis Fink - 11 years ago 2013-11-17 00:04:07
dennis.fink@c3l.lu
updated script
1 file changed with 13 insertions and 8 deletions:
0 comments (0 inline, 0 general)
Scripts/update_server.py
Show inline comments
 
import subprocess
 
import configparser
 
import re
 
import json
 

	
 
import requests
 

	
 
from ast import literal_eval
 

	
 
OBFS_REGEX = re.compule(r'^ServerTransportPlugin obfs2,obfs3')
 
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', 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'
 
@@ -63,66 +63,71 @@ def get_server_type(tor_config):
 

	
 

	
 
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)
 

	
 
    response.raise_for_status()
 

	
 
    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)
 
    try:
 
        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)
 
    else:
 
        server_json = create_server_json()
 
        response = update_server(server_json, ennstatus_url)
 
    except Exception as e:
 
        print('Error: %s' % str(e))
 

	
 
    print(response)
0 comments (0 inline, 0 general)