1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #!/usr/bin/python2
- #$Id$
- import socket
- import struct
- import sys
- MSG_TYPE_SETCONF = 0x0002
- MSG_TYPE_GETCONF = 0x0003
- MSG_TYPE_SETEVENTS = 0x0005
- MSG_TYPE_AUTH = 0x0007
- EVENT_TYPE_BANDWIDTH = 0x0004
- EVENT_TYPE_WARN = 0x0005
- def parseHostAndPort(h):
- host, port = "localhost", 9051
- if ":" in h:
- i = h.index(":")
- host = h[:i]
- try:
- port = int(h[i+1:])
- except ValueError:
- print "Bad hostname %r"%h
- sys.exit(1)
- elif h:
- try:
- port = int(h)
- except ValueError:
- host = h
- return host, port
- def receive_message(s):
- body = ""
- header = s.recv(4)
- length,type = struct.unpack("!HH",header)
- print "Got response length %d, type %d"%(length,type)
- if length:
- body = s.recv(length)
- print "Got response length %d, type %d, body %s"%(length,type,body)
- return length,type,body
- def pack_message(type, body=""):
- length = len(body)
- reqheader = struct.pack("!HH", length, type)
- return "%s%s"%(reqheader,body)
- def authenticate(s):
- s.sendall(pack_message(MSG_TYPE_AUTH))
- length,type,body = receive_message(s)
- return
- def get_option(s,name):
- s.sendall(pack_message(MSG_TYPE_GETCONF,name))
- length,type,body = receive_message(s)
- return
- def set_option(s,msg):
- s.sendall(pack_message(MSG_TYPE_SETCONF,msg))
- length,type,body = receive_message(s)
- return
- def get_event(s,events):
- eventbody = struct.pack("!H", events)
- s.sendall(pack_message(MSG_TYPE_SETEVENTS,eventbody))
- length,type,body = receive_message(s)
- return
- def listen_for_events(s):
- while(1):
- length,type,body = receive_message(s)
- return
- def do_main_loop(host,port):
- print "host is %s:%d"%(host,port)
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((host,port))
- authenticate(s)
- get_option(s,"nickname")
- get_option(s,"DirFetchPostPeriod\n")
- set_option(s,"1")
- set_option(s,"bandwidthburstbytes 100000")
- # set_option(s,"runasdaemon 1")
- # get_event(s,EVENT_TYPE_WARN)
- get_event(s,EVENT_TYPE_BANDWIDTH)
- listen_for_events(s)
- return
- if __name__ == '__main__':
- if len(sys.argv) != 2:
- print "Syntax: tor-control.py torhost:torport"
- sys.exit(0)
- sh,sp = parseHostAndPort(sys.argv[1])
- do_main_loop(sh,sp)
|