diff --git a/Scripts/update_server.py b/Scripts/update_server.py new file mode 100644 --- /dev/null +++ b/Scripts/update_server.py @@ -0,0 +1,128 @@ +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)