On Monday 05 August 2013 07:25:20 Damian Johnson wrote:
Yup. It's unfortunate that tor decided to include an 'Exit' flag with such an unintuitive meaning. You're not the first person to be confused by it.
Is this meaning at least documented somewhere and I have just read over it?
-) It is not safe to use extend_circuit in parallel for creating new circuits. I think this is not mentioned anywhere.
What kind of issue does that encounter? Is it a problem with stem's thread safety or an issue on tor's side?
If requests are sent to Tor to create more then a single circuit at once, the mapping between circuit events and create-request is unknown because the circuit ID is not known until the LAUNCHED-event has been received. This is clearly an issue on Tor's side but one could argue that Stem should stop me from using it that way.
Manual lock handling is risky. If anything within this block raises an exception (and there's several points throughout your script where you use Controller methods that can potentially raise errors) then the lock won't be released.
The safer way of doing this is to use the 'with' keyword...
I could get rid of all manual locking besides in one case.
Not necessary. Methods return None by default.
Removed.
You might want to look into pyflakes and pep8. I've found them to be better static analysis tools.
pyflakes didn't say anything but I commited lots of cosmetic pep8 changes .
try: controller = connect_port()
except SocketError: sys.stderr.write("ERROR: Couldn't connect to Tor.\n") sys.exit(1)
controller.authenticate()
Not quite. The connect_port() function never returns an exception. Rather, if it fails to establish a control connection then it prints the issue to stdout and returns None. Also, the connection it provides is already authenticated.
If Tor has ControlPort enabled without having HashedControlPassword set, authenticate() has to be called to authenticate the connection. Though this is not recommended I don't know which other default setting would be more appropriate.
This should instead be...
controller = connect_port()
if not controller: sys.exit(1) # failed to get a control connenction
Fixed.
Best, Robert