1 from __future__
import print_function
19 def try_connecting_to_socksport():
20 socks_socket
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
21 e
= socks_socket
.connect_ex(('127.0.0.1', socks_port
))
23 tor_process
.terminate()
24 fail('Cannot connect to SOCKSPort: error ' + os
.strerror(e
))
28 cutoff
= time
.time() + LOG_TIMEOUT
29 while time
.time() < cutoff
:
30 l
= tor_process
.stdout
.readline()
33 logging
.info('Tor logged: "{}"'.format(l
.strip()))
35 logging
.info('Tor logged: "{}", waiting for "{}"'.format(l
.strip(), s
))
36 # readline() returns a blank string when there is no output
40 fail('Could not find "{}" in logs after {} seconds'.format(s
, LOG_TIMEOUT
))
42 def pick_random_port():
47 port
= random
.randint(10000, 60000)
48 s
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
49 if s
.connect_ex(('127.0.0.1', port
)) == 0:
55 fail('Could not find a random free port between 10000 and 60000')
59 logging
.basicConfig(level
=logging
.DEBUG
,
60 format
='%(asctime)s.%(msecs)03d %(message)s',
61 datefmt
='%Y-%m-%d %H:%M:%S')
63 if sys
.hexversion
< 0x02070000:
64 fail("ERROR: unsupported Python version (should be >= 2.7)")
66 if sys
.hexversion
> 0x03000000 and sys
.hexversion
< 0x03010000:
67 fail("ERROR: unsupported Python3 version (should be >= 3.1)")
69 control_port
= pick_random_port()
70 socks_port
= pick_random_port()
72 assert control_port
!= 0
73 assert socks_port
!= 0
76 fail('Usage: %s <path-to-tor> <data-dir>' % sys
.argv
[0])
78 if not os
.path
.exists(sys
.argv
[1]):
79 fail('ERROR: cannot find tor at %s' % sys
.argv
[1])
80 if not os
.path
.exists(sys
.argv
[2]):
81 fail('ERROR: cannot find datadir at %s' % sys
.argv
[2])
83 tor_path
= sys
.argv
[1]
84 data_dir
= sys
.argv
[2]
86 tor_process
= subprocess
.Popen([tor_path
,
87 '-DataDirectory', data_dir
,
88 '-ControlPort', '127.0.0.1:{}'.format(control_port
),
89 '-SOCKSPort', '127.0.0.1:{}'.format(socks_port
),
90 '-Log', 'debug stdout',
91 '-LogTimeGranularity', '1',
92 '-FetchServerDescriptors', '0'],
93 stdout
=subprocess
.PIPE
,
94 stderr
=subprocess
.PIPE
)
96 if tor_process
== None:
97 fail('ERROR: running tor failed')
99 wait_for_log('Opened Control listener on')
101 try_connecting_to_socksport()
103 control_socket
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
104 if control_socket
.connect_ex(('127.0.0.1', control_port
)):
105 tor_process
.terminate()
106 fail('Cannot connect to ControlPort')
108 control_socket
.sendall('AUTHENTICATE \r\n'.encode('utf8'))
109 control_socket
.sendall('SETCONF SOCKSPort=0.0.0.0:{}\r\n'.format(socks_port
).encode('utf8'))
110 wait_for_log('Opened Socks listener')
112 try_connecting_to_socksport()
114 control_socket
.sendall('SETCONF SOCKSPort=127.0.0.1:{}\r\n'.format(socks_port
).encode('utf8'))
115 wait_for_log('Opened Socks listener')
117 try_connecting_to_socksport()
119 control_socket
.sendall('SIGNAL HALT\r\n'.encode('utf8'))
121 wait_for_log('exiting cleanly')
125 tor_process
.terminate()
127 if e
.errno
== errno
.ESRCH
: # errno 3: No such process
128 # assume tor has already exited due to SIGNAL HALT
129 logging
.warn("Tor has already exited")