Commit ba1cf58a authored by Brian May's avatar Brian May

Add Python 3.5 support.

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