Commit ba1cf58a authored by Brian May's avatar Brian May

Add Python 3.5 support.

parent dd8e68b6
......@@ -40,6 +40,7 @@ setup(
"GNU General Public License v2 or later (GPLv2+)",
"Operating System :: OS Independent",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.5",
"Topic :: System :: Networking",
],
entry_points={
......
import sys
import re
import socket
import helpers
import options
import sshuttle.helpers as helpers
import sshuttle.options as options
import sshuttle.client as client
import sshuttle.server as server
import sshuttle.firewall as firewall
......@@ -145,7 +145,7 @@ o = options.Options(optspec)
if opt.daemon:
opt.syslog = 1
if opt.wrap:
import ssnet
import sshuttle.ssnet as ssnet
ssnet.MAX_CHANNEL = int(opt.wrap)
helpers.verbose = opt.verbose
......@@ -230,7 +230,7 @@ try:
log('Abnormal exit code detected, failing...' % return_code)
sys.exit(return_code)
except Fatal, e:
except Fatal as e:
log('fatal: %s\n' % e)
sys.exit(99)
except KeyboardInterrupt:
......
......@@ -18,7 +18,7 @@ while 1:
setattr(sys.modules[parent], parent_name, module)
code = compile(content, name, "exec")
exec code in module.__dict__
exec(code, module.__dict__)
sys.modules[name] = module
else:
break
......
This diff is collapsed.
This diff is collapsed.
......@@ -3,8 +3,8 @@ import socket
import select
import signal
import struct
import compat.ssubprocess as ssubprocess
import ssyslog
import subprocess as ssubprocess
import sshuttle.ssyslog as ssyslog
import sys
import os
import re
......@@ -22,7 +22,7 @@ IPPROTO_DIVERT = 254
def nonfatal(func, *args):
try:
func(*args)
except Fatal, e:
except Fatal as e:
log('error: %s\n' % e)
......@@ -36,7 +36,7 @@ def ipt_chain_exists(family, table, name):
argv = [cmd, '-t', table, '-nL']
p = ssubprocess.Popen(argv, stdout=ssubprocess.PIPE)
for line in p.stdout:
if line.startswith('Chain %s ' % name):
if line.startswith(b'Chain %s ' % name.encode("ASCII")):
return True
rv = p.wait()
if rv:
......@@ -134,7 +134,7 @@ def do_iptables_nat(port, dnsport, nslist, family, subnets, udp):
'--to-ports', str(port))
if dnsport:
for f, ip in filter(lambda i: i[0] == family, nslist):
for f, ip in [i for i in nslist if i[0] == family]:
ipt_ttl('-A', chain, '-j', 'REDIRECT',
'--dest', '%s/32' % ip,
'-p', 'udp',
......@@ -193,7 +193,7 @@ def do_iptables_tproxy(port, dnsport, nslist, family, subnets, udp):
'-m', 'udp', '-p', 'udp')
if dnsport:
for f, ip in filter(lambda i: i[0] == family, nslist):
for f, ip in [i for i in nslist if i[0] == family]:
ipt('-A', mark_chain, '-j', 'MARK', '--set-mark', '1',
'--dest', '%s/32' % ip,
'-m', 'udp', '-p', 'udp', '--dport', '53')
......@@ -440,7 +440,7 @@ def do_ipfw(port, dnsport, family, subnets, udp):
IPPROTO_DIVERT)
divertsock.bind(('0.0.0.0', port)) # IP field is ignored
for f, ip in filter(lambda i: i[0] == family, nslist):
for f, ip in [i for i in nslist if i[0] == family]:
# relabel and then catch outgoing DNS requests
ipfw('add', sport, 'divert', sport,
'udp',
......@@ -553,7 +553,7 @@ def rewrite_etc_hosts(port):
try:
old_content = open(HOSTSFILE).read()
st = os.stat(HOSTSFILE)
except IOError, e:
except IOError as e:
if e.errno == errno.ENOENT:
pass
else:
......@@ -575,7 +575,7 @@ def rewrite_etc_hosts(port):
os.chmod(tmpname, st.st_mode)
else:
os.chown(tmpname, 0, 0)
os.chmod(tmpname, 0644)
os.chmod(tmpname, 0o644)
os.rename(tmpname, HOSTSFILE)
......@@ -625,11 +625,11 @@ pfioc_pooladdr = c_char * 1136 # sizeof(struct pfioc_pooladdr)
MAXPATHLEN = 1024
DIOCNATLOOK = ((0x40000000L | 0x80000000L) | (
DIOCNATLOOK = ((0x40000000 | 0x80000000) | (
(sizeof(pfioc_natlook) & 0x1fff) << 16) | ((ord('D')) << 8) | (23))
DIOCCHANGERULE = ((0x40000000L | 0x80000000L) | (
DIOCCHANGERULE = ((0x40000000 | 0x80000000) | (
(sizeof(pfioc_rule) & 0x1fff) << 16) | ((ord('D')) << 8) | (26))
DIOCBEGINADDRS = ((0x40000000L | 0x80000000L) | (
DIOCBEGINADDRS = ((0x40000000 | 0x80000000) | (
(sizeof(pfioc_pooladdr) & 0x1fff) << 16) | ((ord('D')) << 8) | (51))
PF_CHANGE_ADD_TAIL = 2
......@@ -794,14 +794,14 @@ def main(port_v6, port_v4, dnsport_v6, dnsport_v4, nslist, method, udp, syslog):
if line:
debug1('firewall manager: starting transproxy.\n')
subnets_v6 = filter(lambda i: i[0] == socket.AF_INET6, subnets)
subnets_v6 = [i for i in subnets if i[0] == socket.AF_INET6]
if port_v6:
do_wait = do_it(
port_v6, dnsport_v6, nslist, socket.AF_INET6, subnets_v6, udp)
elif len(subnets_v6) > 0:
debug1("IPv6 subnets defined but IPv6 disabled\n")
subnets_v4 = filter(lambda i: i[0] == socket.AF_INET, subnets)
subnets_v4 = [i for i in subnets if i[0] == socket.AF_INET]
if port_v4:
do_wait = do_it(
port_v4, dnsport_v4, nslist, socket.AF_INET, subnets_v4, udp)
......@@ -832,7 +832,7 @@ def main(port_v6, port_v4, dnsport_v6, dnsport_v4, nslist, method, udp, syslog):
try:
dst = pf_query_nat(*(line[13:].split(',')))
sys.stdout.write('QUERY_PF_NAT_SUCCESS %s,%r\n' % dst)
except IOError, e:
except IOError as e:
sys.stdout.write('QUERY_PF_NAT_FAILURE %s\n' % e)
sys.stdout.flush()
......
......@@ -69,7 +69,7 @@ def islocal(ip, family):
try:
try:
sock.bind((ip, 0))
except socket.error, e:
except socket.error as e:
if e.args[0] == errno.EADDRNOTAVAIL:
return False # not a local IP
else:
......
......@@ -6,7 +6,7 @@ import errno
import os
import sys
import sshuttle.compat.ssubprocess as ssubprocess
import subprocess as ssubprocess
import sshuttle.helpers as helpers
from sshuttle.helpers import log, debug1, debug2, debug3
......@@ -21,7 +21,7 @@ hostnames = {}
queue = {}
try:
null = open('/dev/null', 'wb')
except IOError, e:
except IOError as e:
log('warning: %s\n' % e)
null = os.popen("sh -c 'while read x; do :; done'", 'wb', 4096)
......@@ -48,7 +48,7 @@ def write_host_cache():
def read_host_cache():
try:
f = open(CACHEFILE)
except IOError, e:
except IOError as e:
if e.errno == errno.ENOENT:
return
else:
......@@ -122,7 +122,7 @@ def _check_netstat():
p = ssubprocess.Popen(argv, stdout=ssubprocess.PIPE, stderr=null)
content = p.stdout.read()
p.wait()
except OSError, e:
except OSError as e:
log('%r failed: %r\n' % (argv, e))
return
......@@ -142,7 +142,7 @@ def _check_smb(hostname):
p = ssubprocess.Popen(argv, stdout=ssubprocess.PIPE, stderr=null)
lines = p.stdout.readlines()
p.wait()
except OSError, e:
except OSError as e:
log('%r failed: %r\n' % (argv, e))
_smb_ok = False
return
......@@ -199,7 +199,7 @@ def _check_nmb(hostname, is_workgroup, is_master):
p = ssubprocess.Popen(argv, stdout=ssubprocess.PIPE, stderr=null)
lines = p.stdout.readlines()
rv = p.wait()
except OSError, e:
except OSError as e:
log('%r failed: %r\n' % (argv, e))
_nmb_ok = False
return
......@@ -267,7 +267,7 @@ def hw_main(seed_hosts):
while 1:
now = time.time()
for t, last_polled in queue.items():
for t, last_polled in list(queue.items()):
(op, args) = t
if not _stdin_still_ok(0):
break
......
......@@ -186,12 +186,12 @@ class Options:
try:
(flags, extra) = self.optfunc(
args, self._shortopts, self._longopts)
except getopt.GetoptError, e:
except getopt.GetoptError as e:
self.fatal(e)
opt = OptDict()
for k, v in self._defaults.iteritems():
for k, v in self._defaults.items():
k = self._aliases[k]
opt[k] = v
......@@ -210,6 +210,6 @@ class Options:
else:
v = _intify(v)
opt[k] = v
for (f1, f2) in self._aliases.iteritems():
for (f1, f2) in self._aliases.items():
opt[f1] = opt._opts.get(f2)
return (opt, flags, extra)
......@@ -9,7 +9,7 @@ import os
import sshuttle.ssnet as ssnet
import sshuttle.helpers as helpers
import sshuttle.hostwatch as hostwatch
import sshuttle.compat.ssubprocess as ssubprocess
import subprocess as ssubprocess
from sshuttle.ssnet import Handler, Proxy, Mux, MuxWrapper
from sshuttle.helpers import log, debug1, debug2, debug3, Fatal, \
resolvconf_random_nameserver
......@@ -148,7 +148,7 @@ class DnsProxy(Handler):
debug2('DNS: sending to %r\n' % self.peer)
try:
self.sock.send(self.request)
except socket.error, e:
except socket.error as e:
if e.args[0] in ssnet.NET_ERRS:
# might have been spurious; try again.
# Note: these errors sometimes are reported by recv(),
......@@ -163,7 +163,7 @@ class DnsProxy(Handler):
def callback(self):
try:
data = self.sock.recv(4096)
except socket.error, e:
except socket.error as e:
if e.args[0] in ssnet.NET_ERRS:
# might have been spurious; try again.
# Note: these errors sometimes are reported by recv(),
......@@ -195,14 +195,14 @@ class UdpProxy(Handler):
debug2('UDP: sending to %r port %d\n' % dstip)
try:
self.sock.sendto(data, dstip)
except socket.error, e:
except socket.error as e:
log('UDP send to %r port %d: %s\n' % (dstip[0], dstip[1], e))
return
def callback(self):
try:
data, peer = self.sock.recvfrom(4096)
except socket.error, e:
except socket.error as e:
log('UDP recv from %r port %d: %s\n' % (peer[0], peer[1], e))
return
debug2('UDP response: %d bytes\n' % len(data))
......@@ -322,13 +322,13 @@ def main():
if dnshandlers:
now = time.time()
for channel, h in dnshandlers.items():
for channel, h in list(dnshandlers.items()):
if h.timeout < now or not h.ok:
debug3('expiring dnsreqs channel=%d\n' % channel)
del dnshandlers[channel]
h.ok = False
if udphandlers:
for channel, h in udphandlers.items():
for channel, h in list(udphandlers.items()):
if not h.ok:
debug3('expiring UDP channel=%d\n' % channel)
del udphandlers[channel]
......
......@@ -4,7 +4,7 @@ import re
import socket
import zlib
import imp
import sshuttle.compat.ssubprocess as ssubprocess
import subprocess as ssubprocess
import sshuttle.helpers as helpers
from sshuttle.helpers import debug2
......@@ -40,7 +40,7 @@ def readfile(name):
if f is not None:
f.close()
return contents
return contents.encode("UTF8")
def empackage(z, name, data=None):
......@@ -48,7 +48,8 @@ def empackage(z, name, data=None):
data = readfile(name)
content = z.compress(data)
content += z.flush(zlib.Z_SYNC_FLUSH)
return '%s\n%d\n%s' % (name, len(content), content)
return b'%s\n%d\n%s' % (name.encode("ASCII"), len(content), content)
def connect(ssh_cmd, rhostport, python, stderr, options):
......@@ -77,16 +78,15 @@ def connect(ssh_cmd, rhostport, python, stderr, options):
z = zlib.compressobj(1)
content = readfile('sshuttle.assembler')
optdata = ''.join("%s=%r\n" % (k, v) for (k, v) in options.items())
optdata = ''.join("%s=%r\n" % (k, v) for (k, v) in list(options.items()))
optdata = optdata.encode("UTF8")
content2 = (empackage(z, 'sshuttle') +
empackage(z, 'sshuttle.cmdline_options', optdata) +
empackage(z, 'sshuttle.helpers') +
empackage(z, 'sshuttle.compat') +
empackage(z, 'sshuttle.compat.ssubprocess') +
empackage(z, 'sshuttle.ssnet') +
empackage(z, 'sshuttle.hostwatch') +
empackage(z, 'sshuttle.server') +
"\n")
b"\n")
pyscript = r"""
import sys;
......
......@@ -75,7 +75,7 @@ def _fds(l):
def _nb_clean(func, *args):
try:
return func(*args)
except OSError, e:
except OSError as e:
if e.errno not in (errno.EWOULDBLOCK, errno.EAGAIN):
raise
else:
......@@ -88,7 +88,7 @@ def _try_peername(sock):
pn = sock.getpeername()
if pn:
return '%s:%s' % (pn[0], pn[1])
except socket.error, e:
except socket.error as e:
if e.args[0] not in (errno.ENOTCONN, errno.ENOTSOCK):
raise
return 'unknown'
......@@ -144,7 +144,7 @@ class SockWrapper:
self.rsock.connect(self.connect_to)
# connected successfully (Linux)
self.connect_to = None
except socket.error, e:
except socket.error as e:
debug3('%r: connect result: %s\n' % (self, e))
if e.args[0] == errno.EINVAL:
# this is what happens when you call connect() on a socket
......@@ -191,7 +191,7 @@ class SockWrapper:
self.shut_write = True
try:
self.wsock.shutdown(SHUT_WR)
except socket.error, e:
except socket.error as e:
self.seterr('nowrite: %s' % e)
def too_full(self):
......@@ -203,7 +203,7 @@ class SockWrapper:
self.wsock.setblocking(False)
try:
return _nb_clean(os.write, self.wsock.fileno(), buf)
except OSError, e:
except OSError as e:
if e.errno == errno.EPIPE:
debug1('%r: uwrite: got EPIPE\n' % self)
self.nowrite()
......@@ -225,9 +225,9 @@ class SockWrapper:
self.rsock.setblocking(False)
try:
return _nb_clean(os.read, self.rsock.fileno(), 65536)
except OSError, e:
except OSError as e:
self.seterr('uread: %s' % e)
return '' # unexpected error... we'll call it EOF
return b'' # unexpected error... we'll call it EOF
def fill(self):
if self.buf:
......@@ -235,7 +235,7 @@ class SockWrapper:
rb = self.uread()
if rb:
self.buf.append(rb)
if rb == '': # empty string means EOF; None means temporarily empty
if rb == b'': # empty string means EOF; None means temporarily empty
self.noread()
def copy_to(self, outwrap):
......@@ -333,15 +333,15 @@ class Mux(Handler):
self.channels = {}
self.chani = 0
self.want = 0
self.inbuf = ''
self.inbuf = b''
self.outbuf = []
self.fullness = 0
self.too_full = False
self.send(0, CMD_PING, 'chicken')
self.send(0, CMD_PING, b'chicken')
def next_channel(self):
# channel 0 is special, so we never allocate it
for timeout in xrange(1024):
for timeout in range(1024):
self.chani += 1
if self.chani > MAX_CHANNEL:
self.chani = 1
......@@ -357,7 +357,7 @@ class Mux(Handler):
def check_fullness(self):
if self.fullness > 32768:
if not self.too_full:
self.send(0, CMD_PING, 'rttest')
self.send(0, CMD_PING, b'rttest')
self.too_full = True
#ob = []
# for b in self.outbuf:
......@@ -366,9 +366,9 @@ class Mux(Handler):
#log('outbuf: %d %r\n' % (self.amount_queued(), ob))
def send(self, channel, cmd, data):
data = str(data)
assert(len(data) <= 65535)
p = struct.pack('!ccHHH', 'S', 'S', channel, cmd, len(data)) + data
assert isinstance(data, bytes)
assert len(data) <= 65535
p = struct.pack('!ccHHH', b'S', b'S', channel, cmd, len(data)) + data
self.outbuf.append(p)
debug2(' > channel=%d cmd=%s len=%d (fullness=%d)\n'
% (channel, cmd_to_name.get(cmd, hex(cmd)),
......@@ -435,10 +435,10 @@ class Mux(Handler):
self.rsock.setblocking(False)
try:
b = _nb_clean(os.read, self.rsock.fileno(), 32768)
except OSError, e:
except OSError as e:
raise Fatal('other end: %r' % e)
#log('<<< %r\n' % b)
if b == '': # EOF
if b == b'': # EOF
self.ok = False
if b:
self.inbuf += b
......@@ -451,8 +451,8 @@ class Mux(Handler):
if len(self.inbuf) >= (self.want or HDR_LEN):
(s1, s2, channel, cmd, datalen) = \
struct.unpack('!ccHHH', self.inbuf[:HDR_LEN])
assert(s1 == 'S')
assert(s2 == 'S')
assert(s1 == b'S')
assert(s2 == b'S')
self.want = datalen + HDR_LEN
if self.want and len(self.inbuf) >= self.want:
data = self.inbuf[HDR_LEN:self.want]
......@@ -494,18 +494,21 @@ class MuxWrapper(SockWrapper):
def noread(self):
if not self.shut_read:
debug2('%r: done reading\n' % self)
self.shut_read = True
self.mux.send(self.channel, CMD_TCP_STOP_SENDING, '')
self.mux.send(self.channel, CMD_TCP_STOP_SENDING, b'')
self.maybe_close()
def nowrite(self):
if not self.shut_write:
debug2('%r: done writing\n' % self)
self.shut_write = True
self.mux.send(self.channel, CMD_TCP_EOF, '')
self.mux.send(self.channel, CMD_TCP_EOF, b'')
self.maybe_close()
def maybe_close(self):
if self.shut_read and self.shut_write:
debug2('%r: closing connection\n' % self)
# remove the mux's reference to us. The python garbage collector
# will then be able to reap our object.
self.mux.channels[self.channel] = None
......@@ -523,7 +526,7 @@ class MuxWrapper(SockWrapper):
def uread(self):
if self.shut_read:
return '' # EOF
return b'' # EOF
else:
return None # no data available right now
......@@ -552,7 +555,7 @@ def runonce(handlers, mux):
r = []
w = []
x = []
to_remove = filter(lambda s: not s.ok, handlers)
to_remove = [s for s in handlers if not s.ok]
for h in to_remove:
handlers.remove(h)
......
import sys
import os
from compat import ssubprocess
import subprocess as ssubprocess
_p = None
......
......@@ -25,10 +25,10 @@ while 1:
count += 1
if count >= 16384:
count = 1
print 'cli CREATING %d' % count
print('cli CREATING %d' % count)
b = struct.pack('I', count) + 'x' * count
remain[c] = count
print 'cli >> %r' % len(b)
print('cli >> %r' % len(b))
c.send(b)
c.shutdown(socket.SHUT_WR)
clients.append(c)
......@@ -36,7 +36,7 @@ while 1:
time.sleep(0.1)
else:
r = [listener] + servers + clients
print 'select(%d)' % len(r)
print('select(%d)' % len(r))
r, w, x = select.select(r, [], [], 5)
assert(r)
for i in r:
......@@ -45,7 +45,7 @@ while 1:
servers.append(s)
elif i in servers:
b = i.recv(4096)
print 'srv << %r' % len(b)
print('srv << %r' % len(b))
if not i in remain:
assert(len(b) >= 4)
want = struct.unpack('I', b[:4])[0]
......@@ -54,34 +54,34 @@ while 1:
else:
want = remain[i]
if want < len(b):
print 'weird wanted %d bytes, got %d: %r' % (want, len(b), b)
print('weird wanted %d bytes, got %d: %r' % (want, len(b), b))
assert(want >= len(b))
want -= len(b)
remain[i] = want
if not b: # EOF
if want:
print 'weird: eof but wanted %d more' % want
print('weird: eof but wanted %d more' % want)
assert(want == 0)
i.close()
servers.remove(i)
del remain[i]
else:
print 'srv >> %r' % len(b)
print('srv >> %r' % len(b))
i.send('y' * len(b))
if not want:
i.shutdown(socket.SHUT_WR)
elif i in clients:
b = i.recv(4096)
print 'cli << %r' % len(b)
print('cli << %r' % len(b))
want = remain[i]
if want < len(b):
print 'weird wanted %d bytes, got %d: %r' % (want, len(b), b)
print('weird wanted %d bytes, got %d: %r' % (want, len(b), b))
assert(want >= len(b))
want -= len(b)
remain[i] = want
if not b: # EOF
if want:
print 'weird: eof but wanted %d more' % want
print('weird: eof but wanted %d more' % want)
assert(want == 0)
i.close()
clients.remove(i)
......
......@@ -60,7 +60,7 @@ class Callback:
class Runner:
def __init__(self, argv, logfunc, promptfunc, serverobj):
print 'in __init__'
print('in __init__')
self.id = argv
self.rv = None
self.pid = None
......@@ -70,14 +70,14 @@ class Runner:
self.serverobj = serverobj
self.buf = ''
self.logfunc('\nConnecting to %s.\n' % self.serverobj.host())
print 'will run: %r' % argv
print('will run: %r' % argv)
self.serverobj.setConnected_(False)
pid, fd = pty.fork()
if pid == 0:
# child
try:
os.execvp(argv[0], argv)
except Exception, e:
except Exception as e:
sys.stderr.write('failed to start: %r\n' % e)
raise
finally:
......@@ -107,7 +107,7 @@ class Runner:
self.serverobj.setConnected_(False)
self.serverobj.setError_('VPN process died')
self.logfunc('Disconnected.\n')
print 'wait_result: %r' % self.rv
print('wait_result: %r' % self.rv)
return self.rv
def wait(self):
......@@ -121,14 +121,14 @@ class Runner:
def kill(self):
assert(self.pid > 0)
print 'killing: pid=%r rv=%r' % (self.pid, self.rv)
print('killing: pid=%r rv=%r' % (self.pid, self.rv))
if self.rv is None:
self.logfunc('Disconnecting from %s.\n' % self.serverobj.host())
os.kill(self.pid, 15)
self.wait()
def gotdata(self, notification):
print 'gotdata!'
print('gotdata!')
d = str(self.file.availableData())
if d:
self.logfunc(d)
......@@ -171,18 +171,18 @@ class SshuttleController(NSObject):
def _connect(self, server):
host = server.host()
print 'connecting %r' % host
print('connecting %r' % host)
self.fill_menu()
def logfunc(msg):
print 'log! (%d bytes)' % len(msg)
print('log! (%d bytes)' % len(msg))
self.logField.textStorage()\
.appendAttributedString_(NSAttributedString.alloc()
.initWithString_(msg))
self.logField.didChangeText()
def promptfunc(prompt):
print 'prompt! %r' % prompt
print('prompt! %r' % prompt)
return askpass.askpass(prompt)
nets_mode = server.autoNets()
if nets_mode == models.NET_MANUAL:
......@@ -206,7 +206,7 @@ class SshuttleController(NSObject):
def _disconnect(self, server):
host = server.host()
print 'disconnecting %r' % host
print('disconnecting %r' % host)
conn = self.conns.get(host)
if conn:
conn.kill()
......
......@@ -89,7 +89,7 @@ class SshuttleServer(NSObject):
return getattr(self, '_k_connected', False)
def setConnected_(self, v):
print 'setConnected of %r to %r' % (self, v)
print('setConnected of %r to %r' % (self, v))
self._k_connected = v
if v:
self.setError_(None) # connected ok, so no error
......
......@@ -53,7 +53,7 @@ def DelayedCallback(func, *args, **kwargs):
def _go():
if flag[0]:
print 'running %r (flag=%r)' % (func, flag)
print('running %r (flag=%r)' % (func, flag))
flag[0] = 0
func(*args, **kwargs)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment