diff options
| author | ficus <ficus@robocracy.org> | 2012-09-25 15:59:18 +0200 | 
|---|---|---|
| committer | ficus <ficus@robocracy.org> | 2012-09-25 15:59:18 +0200 | 
| commit | 79b260db495e94430d499906f321dc022c68fec1 (patch) | |
| tree | 71b33694a9b9f7fc7f43b611191dc2cd5d1e1fc5 /torouterui/tor.py | |
| parent | fe4b8a01fc87d1a76fca8e8733270a260aa23cc0 (diff) | |
| download | tui-79b260db495e94430d499906f321dc022c68fec1.tar.gz tui-79b260db495e94430d499906f321dc022c68fec1.zip  | |
basic tor control (needs testing)
Diffstat (limited to 'torouterui/tor.py')
| -rw-r--r-- | torouterui/tor.py | 86 | 
1 files changed, 83 insertions, 3 deletions
diff --git a/torouterui/tor.py b/torouterui/tor.py index cf18ce2..a44aea4 100644 --- a/torouterui/tor.py +++ b/torouterui/tor.py @@ -2,12 +2,18 @@  Helper code for interacting with Tor and modifying the Tor system  configuration.  """ +import os +import time  from TorCtl import TorCtl +import util  def tor_getinfo(conn, key):      return conn.get_info(key)[key] +def tor_getoption(conn, key): +    return conn.get_option(key)[0][1] +  def get_tor_status():      """Ask for status over torctl pipe"""      d = dict() @@ -35,6 +41,7 @@ def get_tor_status():      d['version_current'] = tor_getinfo(conn, 'status/version/current')      d['circuit_established'] = bool(          tor_getinfo(conn, 'status/circuit-established')) +    d['is_alive'] = conn.is_live()      if d['circuit_established']:          d['state'] = 'ESTABLISHED'      else: @@ -46,9 +53,82 @@ def get_tor_status():  def get_tor_settings():      """Ask for settings over torctl pipe; don't use augeas"""      d = dict() -    return d +    conn = TorCtl.connect() +    if not conn: +        # couldn't connect; will need to display error to user +        return None +    d['tor_relaybandwidthrateKBps'] = \ +        int(int(tor_getoption(conn, 'RelayBandwidthRate'))/1024.) +    d['tor_relaybandwidthburstKBps'] = \ +        int(int(tor_getoption(conn, 'RelayBandwidthBurst'))/1024.) + +    d['tor_sockslistenaddress'] = tor_getoption(conn, 'SocksListenAddress') +    d['tor_virtualaddrnetwork'] = tor_getoption(conn, 'VirtualAddrNetwork') +    d['tor_translistenaddress'] = tor_getoption(conn, 'TransListenAddress') +    d['tor_dnslistenaddress'] = tor_getoption(conn, 'DNSListenAddress') +    d['tor_enable'] = (not bool(int(tor_getoption(conn, 'DisableNetwork')))) and 'true' +    if tor_getoption(conn, 'ExitPolicy') == 'reject *:*': +        d['tor_exitnodeenable'] = False +    else: +        d['tor_exitnodeenable'] = 'true' + +    orport = tor_getoption(conn, 'ORPort') +    bridgerelay = tor_getoption(conn, 'BridgeRelay') +    if orport == 'auto' and bridgerelay == '0': +        d['tor_relaytype'] = 'relay' +    elif orport == 'auto' and bridgerelay == '1': +        d['tor_relaytype'] = 'bridge' +    elif orport == '0': +        d['tor_relaytype'] = 'none' +    else: +        print "WARNING: unknown tor_relaytype state" +        d['tor_relaytype'] = 'unknown' + +    conn.close() +    return d -def save_tor_settings(): +def save_tor_settings(form):      """Commit settings through torctl pipe, then send SAVECONF""" -    pass +    conn = TorCtl.connect() +    if not conn: +        print "Warning: couldn't connect to tor daemon; need to boot up tor daemon in disabled state" +        os.system('echo "DisableNetwork 1" >> /etc/tor/torrc') +        # tor daemon should always be running, even if disabled +        util.enable_service('tor') +        time.sleep(3) +        conn = TorCtl.connect() +        if not conn: +            raise Exception("Could not start tor daemon!") + +    conn.set_option('RelayBandwidthRate', +                    "%dKB" % int(form['tor_relaybandwidthrateKBps'])) +    conn.set_option('RelayBandwidthBurst', +                    "%dKB" % int(form['tor_relaybandwidthburstKBps'])) + +    conn.set_option('DNSListenAddress', form['tor_dnslistenaddress']) +    conn.set_option('SocksListenAddress', form['tor_sockslistenaddress']) +    conn.set_option('VirtualAddrNetwork', form['tor_virtualaddrnetwork']) +    conn.set_options([('TransListenAddress', form['tor_translistenaddress']), +                      ('TransPort', form['tor_translistenport'])]) + +    if form.get('tor_enable') == 'true': +        conn.set_option('DisableNetwork', '0') +    else: +        conn.set_option('DisableNetwork', '1') + +    if form.get('tor_exitnodeenable') == 'true': +        conn.set_option('ExitPolicy', '') +    else:  +        conn.set_option('ExitPolicy', 'reject *:*') + +    if form['tor_relaytype'] == 'relay': +        conn.set_options([('ORPort', 'auto'), ('BridgeRelay', '0')]) +    elif form['tor_relaytype'] == 'bridge': +        conn.set_options([('ORPort', 'auto'), ('BridgeRelay', '1')]) +    else:   # type = 'none' +        conn.set_options([('ORPort', '0'), ('BridgeRelay', '0')]) + +    conn.save_conf()  +    conn.close() +  | 
