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
Show 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(
...
@@ -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
=
{
...
...
sshuttle/__main__.py
View file @
ba1cf58a
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
ss
huttle.ssnet
as
ss
net
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
:
...
...
sshuttle/assembler.py
View file @
ba1cf58a
...
@@ -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
...
...
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
...
@@ -3,8 +3,8 @@ import socket
import
select
import
select
import
signal
import
signal
import
struct
import
struct
import
compat.s
subprocess
as
ssubprocess
import
subprocess
as
ssubprocess
import
ssyslog
import
ss
huttle.ssyslog
as
ss
yslog
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
,
0
o
644
)
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
=
((
0x40000000
L
|
0x80000000
L
)
|
(
DIOCNATLOOK
=
((
0x40000000
|
0x80000000
)
|
(
(
sizeof
(
pfioc_natlook
)
&
0x1fff
)
<<
16
)
|
((
ord
(
'D'
))
<<
8
)
|
(
23
))
(
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
))
(
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
))
(
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
()
...
...
sshuttle/helpers.py
View file @
ba1cf58a
...
@@ -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
:
...
...
sshuttle/hostwatch.py
View file @
ba1cf58a
...
@@ -6,7 +6,7 @@ import errno
...
@@ -6,7 +6,7 @@ import errno
import
os
import
os
import
sys
import
sys
import
s
shuttle.compat.ss
ubprocess
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
...
...
sshuttle/options.py
View file @
ba1cf58a
...
@@ -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
.
ite
rite
ms
():
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
.
ite
rite
ms
():
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
)
sshuttle/server.py
View file @
ba1cf58a
...
@@ -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
s
shuttle.compat.ss
ubprocess
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
]
...
...
sshuttle/ssh.py
View file @
ba1cf58a
...
@@ -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
s
shuttle.compat.ss
ubprocess
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;
...
...
sshuttle/ssnet.py
View file @
ba1cf58a
...
@@ -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
x
range
(
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
)
...
...
sshuttle/ssyslog.py
View file @
ba1cf58a
import
sys
import
sys
import
os
import
os
from
compat
import
ssubprocess
import
subprocess
as
ssubprocess
_p
=
None
_p
=
None
...
...
sshuttle/stresstest.py
View file @
ba1cf58a
...
@@ -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
)
...
...
sshuttle/ui-macos/main.py
View file @
ba1cf58a
...
@@ -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
(
'
\n
Connecting to
%
s.
\n
'
%
self
.
serverobj
.
host
())
self
.
logfunc
(
'
\n
Connecting 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
()
...
...
sshuttle/ui-macos/models.py
View file @
ba1cf58a
...
@@ -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
...
...
sshuttle/ui-macos/my.py
View file @
ba1cf58a
...
@@ -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
)
...
...
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