Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
sshuttle
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
pub
sshuttle
Commits
ba1cf58a
Commit
ba1cf58a
authored
Nov 15, 2015
by
Brian May
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add Python 3.5 support.
parent
dd8e68b6
Changes
18
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
146 additions
and
1429 deletions
+146
-1429
setup.py
setup.py
+1
-0
__main__.py
sshuttle/__main__.py
+4
-4
assembler.py
sshuttle/assembler.py
+1
-1
client.py
sshuttle/client.py
+51
-42
__init__.py
sshuttle/compat/__init__.py
+0
-0
ssubprocess.py
sshuttle/compat/ssubprocess.py
+0
-1296
firewall.py
sshuttle/firewall.py
+15
-15
helpers.py
sshuttle/helpers.py
+1
-1
hostwatch.py
sshuttle/hostwatch.py
+7
-7
options.py
sshuttle/options.py
+3
-3
server.py
sshuttle/server.py
+7
-7
ssh.py
sshuttle/ssh.py
+7
-7
ssnet.py
sshuttle/ssnet.py
+26
-23
ssyslog.py
sshuttle/ssyslog.py
+1
-1
stresstest.py
sshuttle/stresstest.py
+10
-10
main.py
sshuttle/ui-macos/main.py
+10
-10
models.py
sshuttle/ui-macos/models.py
+1
-1
my.py
sshuttle/ui-macos/my.py
+1
-1
No files found.
setup.py
View file @
ba1cf58a
...
...
@@ -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
=
{
...
...
sshuttle/__main__.py
View file @
ba1cf58a
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
ss
huttle.ssnet
as
ss
net
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
:
...
...
sshuttle/assembler.py
View file @
ba1cf58a
...
...
@@ -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
...
...
sshuttle/client.py
View file @
ba1cf58a
This diff is collapsed.
Click to expand it.
sshuttle/compat/__init__.py
deleted
100644 → 0
View file @
dd8e68b6
sshuttle/compat/ssubprocess.py
deleted
100644 → 0
View file @
dd8e68b6
This diff is collapsed.
Click to expand it.
sshuttle/firewall.py
View file @
ba1cf58a
...
...
@@ -3,8 +3,8 @@ import socket
import
select
import
signal
import
struct
import
compat.s
subprocess
as
ssubprocess
import
ssyslog
import
subprocess
as
ssubprocess
import
ss
huttle.ssyslog
as
ss
yslog
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
,
0
o
644
)
os
.
rename
(
tmpname
,
HOSTSFILE
)
...
...
@@ -625,11 +625,11 @@ pfioc_pooladdr = c_char * 1136 # sizeof(struct pfioc_pooladdr)
MAXPATHLEN
=
1024
DIOCNATLOOK
=
((
0x40000000
L
|
0x80000000
L
)
|
(
DIOCNATLOOK
=
((
0x40000000
|
0x80000000
)
|
(
(
sizeof
(
pfioc_natlook
)
&
0x1fff
)
<<
16
)
|
((
ord
(
'D'
))
<<
8
)
|
(
23
))
DIOCCHANGERULE
=
((
0x40000000
L
|
0x80000000
L
)
|
(
DIOCCHANGERULE
=
((
0x40000000
|
0x80000000
)
|
(
(
sizeof
(
pfioc_rule
)
&
0x1fff
)
<<
16
)
|
((
ord
(
'D'
))
<<
8
)
|
(
26
))
DIOCBEGINADDRS
=
((
0x40000000
L
|
0x80000000
L
)
|
(
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
()
...
...
sshuttle/helpers.py
View file @
ba1cf58a
...
...
@@ -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
:
...
...
sshuttle/hostwatch.py
View file @
ba1cf58a
...
...
@@ -6,7 +6,7 @@ import errno
import
os
import
sys
import
s
shuttle.compat.ss
ubprocess
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
...
...
sshuttle/options.py
View file @
ba1cf58a
...
...
@@ -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
.
ite
rite
ms
():
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
.
ite
rite
ms
():
for
(
f1
,
f2
)
in
self
.
_aliases
.
items
():
opt
[
f1
]
=
opt
.
_opts
.
get
(
f2
)
return
(
opt
,
flags
,
extra
)
sshuttle/server.py
View file @
ba1cf58a
...
...
@@ -9,7 +9,7 @@ import os
import
sshuttle.ssnet
as
ssnet
import
sshuttle.helpers
as
helpers
import
sshuttle.hostwatch
as
hostwatch
import
s
shuttle.compat.ss
ubprocess
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
]
...
...
sshuttle/ssh.py
View file @
ba1cf58a
...
...
@@ -4,7 +4,7 @@ import re
import
socket
import
zlib
import
imp
import
s
shuttle.compat.ss
ubprocess
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;
...
...
sshuttle/ssnet.py
View file @
ba1cf58a
...
...
@@ -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
x
range
(
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
)
...
...
sshuttle/ssyslog.py
View file @
ba1cf58a
import
sys
import
os
from
compat
import
ssubprocess
import
subprocess
as
ssubprocess
_p
=
None
...
...
sshuttle/stresstest.py
View file @
ba1cf58a
...
...
@@ -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
)
...
...
sshuttle/ui-macos/main.py
View file @
ba1cf58a
...
...
@@ -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
(
'
\n
Connecting 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
()
...
...
sshuttle/ui-macos/models.py
View file @
ba1cf58a
...
...
@@ -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
...
...
sshuttle/ui-macos/my.py
View file @
ba1cf58a
...
...
@@ -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
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment