diff options
author | Avery Pennarun <apenwarr@gmail.com> | 2012-01-08 19:16:05 -0500 |
---|---|---|
committer | Avery Pennarun <apenwarr@gmail.com> | 2012-01-08 19:16:05 -0500 |
commit | d5c3aa61b8b77d3b12647bb15a83ba51a5f4d312 (patch) | |
tree | f2be45bae2de7bf76bd25e3120228747372452c9 /Sshuttle VPN.app/Contents/Resources/sshuttle/client.py | |
parent | 5b57de24041a4c184197fa369859dcaf95c1bdf4 (diff) |
MacOS precompiled app package for sshuttle-0.60sshuttle-0.60-macos-bin
Diffstat (limited to 'Sshuttle VPN.app/Contents/Resources/sshuttle/client.py')
-rw-r--r-- | Sshuttle VPN.app/Contents/Resources/sshuttle/client.py | 122 |
1 files changed, 65 insertions, 57 deletions
diff --git a/Sshuttle VPN.app/Contents/Resources/sshuttle/client.py b/Sshuttle VPN.app/Contents/Resources/sshuttle/client.py index 449a75a..06fc573 100644 --- a/Sshuttle VPN.app/Contents/Resources/sshuttle/client.py +++ b/Sshuttle VPN.app/Contents/Resources/sshuttle/client.py @@ -171,10 +171,71 @@ class FirewallClient: def done(self): self.pfile.close() rv = self.p.wait() - if rv: + if rv == EXITCODE_NEEDS_REBOOT: + raise FatalNeedsReboot() + elif rv: raise Fatal('cleanup: %r returned %d' % (self.argv, rv)) +def onaccept(listener, mux, handlers): + global _extra_fd + try: + sock,srcip = listener.accept() + except socket.error, e: + if e.args[0] in [errno.EMFILE, errno.ENFILE]: + debug1('Rejected incoming connection: too many open files!\n') + # free up an fd so we can eat the connection + os.close(_extra_fd) + try: + sock,srcip = listener.accept() + sock.close() + finally: + _extra_fd = os.open('/dev/null', os.O_RDONLY) + return + else: + raise + dstip = original_dst(sock) + debug1('Accept: %s:%r -> %s:%r.\n' % (srcip[0],srcip[1], + dstip[0],dstip[1])) + if dstip[1] == listener.getsockname()[1] and islocal(dstip[0]): + debug1("-- ignored: that's my address!\n") + sock.close() + return + chan = mux.next_channel() + if not chan: + log('warning: too many open channels. Discarded connection.\n') + sock.close() + return + mux.send(chan, ssnet.CMD_CONNECT, '%s,%s' % dstip) + outwrap = MuxWrapper(mux, chan) + handlers.append(Proxy(SockWrapper(sock, sock), outwrap)) + + +dnsreqs = {} +def dns_done(chan, data): + peer,sock,timeout = dnsreqs.get(chan) or (None,None,None) + debug3('dns_done: channel=%r peer=%r\n' % (chan, peer)) + if peer: + del dnsreqs[chan] + debug3('doing sendto %r\n' % (peer,)) + sock.sendto(data, peer) + + +def ondns(listener, mux, handlers): + pkt,peer = listener.recvfrom(4096) + now = time.time() + if pkt: + debug1('DNS request from %r: %d bytes\n' % (peer, len(pkt))) + chan = mux.next_channel() + dnsreqs[chan] = peer,listener,now+30 + mux.send(chan, ssnet.CMD_DNS_REQ, pkt) + mux.channels[chan] = lambda cmd,data: dns_done(chan,data) + for chan,(peer,sock,timeout) in dnsreqs.items(): + if timeout < now: + del dnsreqs[chan] + debug3('Remaining DNS requests: %d\n' % len(dnsreqs)) + + def _main(listener, fw, ssh_cmd, remotename, python, latency_control, dnslistener, seed_hosts, auto_nets, syslog, daemon): @@ -255,63 +316,10 @@ def _main(listener, fw, ssh_cmd, remotename, python, latency_control, fw.sethostip(name, ip) mux.got_host_list = onhostlist - def onaccept(): - global _extra_fd - try: - sock,srcip = listener.accept() - except socket.error, e: - if e.args[0] in [errno.EMFILE, errno.ENFILE]: - debug1('Rejected incoming connection: too many open files!\n') - # free up an fd so we can eat the connection - os.close(_extra_fd) - try: - sock,srcip = listener.accept() - sock.close() - finally: - _extra_fd = os.open('/dev/null', os.O_RDONLY) - return - else: - raise - dstip = original_dst(sock) - debug1('Accept: %s:%r -> %s:%r.\n' % (srcip[0],srcip[1], - dstip[0],dstip[1])) - if dstip[1] == listener.getsockname()[1] and islocal(dstip[0]): - debug1("-- ignored: that's my address!\n") - sock.close() - return - chan = mux.next_channel() - if not chan: - log('warning: too many open channels. Discarded connection.\n') - sock.close() - return - mux.send(chan, ssnet.CMD_CONNECT, '%s,%s' % dstip) - outwrap = MuxWrapper(mux, chan) - handlers.append(Proxy(SockWrapper(sock, sock), outwrap)) - handlers.append(Handler([listener], onaccept)) - - dnsreqs = {} - def dns_done(chan, data): - peer,timeout = dnsreqs.get(chan) or (None,None) - debug3('dns_done: channel=%r peer=%r\n' % (chan, peer)) - if peer: - del dnsreqs[chan] - debug3('doing sendto %r\n' % (peer,)) - dnslistener.sendto(data, peer) - def ondns(): - pkt,peer = dnslistener.recvfrom(4096) - now = time.time() - if pkt: - debug1('DNS request from %r: %d bytes\n' % (peer, len(pkt))) - chan = mux.next_channel() - dnsreqs[chan] = peer,now+30 - mux.send(chan, ssnet.CMD_DNS_REQ, pkt) - mux.channels[chan] = lambda cmd,data: dns_done(chan,data) - for chan,(peer,timeout) in dnsreqs.items(): - if timeout < now: - del dnsreqs[chan] - debug3('Remaining DNS requests: %d\n' % len(dnsreqs)) + handlers.append(Handler([listener], lambda: onaccept(listener, mux, handlers))) + if dnslistener: - handlers.append(Handler([dnslistener], ondns)) + handlers.append(Handler([dnslistener], lambda: ondns(dnslistener, mux, handlers))) if seed_hosts != None: debug1('seed_hosts: %r\n' % seed_hosts) |