diff options
author | Nick Mathewson <nickm@torproject.org> | 2005-04-05 22:57:39 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2005-04-05 22:57:39 +0000 |
commit | 22d8461191c4bb7c5f03dfeb265e92ef6bc7af78 (patch) | |
tree | 35d06213463a7d86b9f046d056a101950ea09a1c /contrib/TorControl.py | |
parent | 499129093599f2395331c53fc2b911ed66b97a22 (diff) | |
download | tor-22d8461191c4bb7c5f03dfeb265e92ef6bc7af78.tar.gz tor-22d8461191c4bb7c5f03dfeb265e92ef6bc7af78.zip |
Update TorControl to handle new event types. EVENT_WARN is obsolete, so rename it to EVENT_TYPE.OBSOLETE_LOG.
svn:r4011
Diffstat (limited to 'contrib/TorControl.py')
-rwxr-xr-x | contrib/TorControl.py | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/contrib/TorControl.py b/contrib/TorControl.py index 9bfe93514a..8eb0d5e9c8 100755 --- a/contrib/TorControl.py +++ b/contrib/TorControl.py @@ -7,7 +7,10 @@ import socket import struct import sys +#__all__ = [ "MSG_TYPE", "" ] + class _Enum: + # Helper: define an ordered dense name-to-number 1-1 mapping. def __init__(self, start, names): self.nameOf = {} idx = start @@ -16,9 +19,14 @@ class _Enum: self.nameOf[idx] = name idx += 1 class _Enum2: + # Helper: define an ordered sparse name-to-number 1-1 mapping. def __init__(self, **args): self.__dict__.update(args) + self.nameOf = {} + for k,v in args.items(): + self.nameOf[v] = k +# Message types that client or server can send. MSG_TYPE = _Enum(0x0000, ["ERROR", "DONE", @@ -43,23 +51,37 @@ MSG_TYPE = _Enum(0x0000, "CLOSECIRCUIT", ]) +# Make sure that the enumeration code is working. assert MSG_TYPE.SAVECONF == 0x0008 assert MSG_TYPE.CLOSECIRCUIT == 0x0014 +# Types of "EVENT" message. EVENT_TYPE = _Enum(0x0001, ["CIRCSTATUS", "STREAMSTATUS", "ORCONNSTATUS", "BANDWIDTH", - "WARN", - "NEWDESC"]) - + "OBSOLETE_LOG", + "NEWDESC", + "DEBUG_MSG", + "INFO_MSG", + "NOTICE_MSG", + "WARN_MSG", + "ERR_MSG", + ]) + +assert EVENT_TYPE.ERR_MSG == 0x000B +assert EVENT_TYPE.OBSOLETE_LOG == 0x0005 + +# Status codes for "CIRCSTATUS" events. CIRC_STATUS = _Enum(0x00, ["LAUNCHED", "BUILT", "EXTENDED", "FAILED", "CLOSED"]) + +# Status codes for "STREAMSTATUS" events STREAM_STATUS = _Enum(0x00, ["SENT_CONNECT", "SENT_RESOLVE", @@ -69,10 +91,15 @@ STREAM_STATUS = _Enum(0x00, "NEW_CONNECT", "NEW_RESOLVE", "DETACHED"]) + +# Status codes for "ORCONNSTATUS" events OR_CONN_STATUS = _Enum(0x00, ["LAUNCHED","CONNECTED","FAILED","CLOSED"]) + +# Signal codes for "SIGNAL" events. SIGNAL = _Enum2(HUP=0x01,INT=0x02,USR1=0x0A,USR2=0x0C,TERM=0x0F) +# Error codes for "ERROR" events. ERR_CODES = { 0x0000 : "Unspecified error", 0x0001 : "Internal error", @@ -90,13 +117,16 @@ ERR_CODES = { } class TorCtlError(Exception): - pass + "Generic error raised by TorControl code." + pass class ProtocolError(TorCtlError): - pass + "Raised on violations in Tor controller protocol" + pass class ErrorReply(TorCtlError): - pass + "" + pass def parseHostAndPort(h): host, port = "localhost", 9051 @@ -326,6 +356,11 @@ def close_circuit(s, circid, flags=0): send_message(s,MSG_TYPE.CLOSECIRCUIT,msg) tp,body = receive_reply(s,[MSG_TYPE.DONE]) +def post_descriptor(s, descriptor): + send_message(s,MSG_TYPE.POSTDESCRIPTOR,descriptor) + tp,body = receive_reply(s,[MSG_TYPE.DONE]) + + def _unterminate(s): if s[-1] == '\0': return s[:-1] @@ -360,10 +395,12 @@ def unpack_event(body): raise ProtocolError("BANDWIDTH event too short.") read, written = struct.unpack("!LL",body[:8]) args = read, written - elif evtype == EVENT_TYPE.WARN: + elif evtype == EVENT_TYPE.OBSOLETE_LOG: args = (_unterminate(body),) elif evtype == EVENT_TYPE.NEWDESC: args = (_unterminate(body).split(","),) + elif EVENT_TYPE.DEBUG_MSG <= evtype <= EVENT_TYPE.ERR_MSG: + args = (EVENT_TYPE.nameOf(evtype), _unterminate(body)) else: args = (body,) @@ -372,7 +409,7 @@ def unpack_event(body): def listen_for_events(s): while(1): _,type,body = receive_message(s) - print "event",type + print unpack_event(body) return def do_main_loop(host,port): @@ -402,7 +439,7 @@ def do_main_loop(host,port): #set_option(s,"bandwidthburstbytes 100000") #set_option(s,"runasdaemon 1") #set_events(s,[EVENT_TYPE.WARN]) - set_events(s,[EVENT_TYPE.WARN,EVENT_TYPE.STREAMSTATUS]) + set_events(s,[EVENT_TYPE.OBSOLETE_LOG]) listen_for_events(s) |