Commit bd208417 authored by Avery Pennarun's avatar Avery Pennarun

firewall.py: clean up repeated calls to ssubprocess.call().

And make sshuttle exit with a well-defined exit code (111) if it needs to
reboot.
parent 4c1a505e
...@@ -171,7 +171,9 @@ class FirewallClient: ...@@ -171,7 +171,9 @@ class FirewallClient:
def done(self): def done(self):
self.pfile.close() self.pfile.close()
rv = self.p.wait() rv = self.p.wait()
if rv: if rv == EXITCODE_NEEDS_REBOOT:
raise FatalNeedsReboot()
elif rv:
raise Fatal('cleanup: %r returned %d' % (self.argv, rv)) raise Fatal('cleanup: %r returned %d' % (self.argv, rv))
......
...@@ -20,6 +20,14 @@ def nonfatal(func, *args): ...@@ -20,6 +20,14 @@ def nonfatal(func, *args):
log('error: %s\n' % e) log('error: %s\n' % e)
def _call(argv):
debug1('>> %s\n' % ' '.join(argv))
rv = ssubprocess.call(argv)
if rv:
raise Fatal('%r returned %d' % (argv, rv))
return rv
def ipt_chain_exists(name): def ipt_chain_exists(name):
argv = ['iptables', '-t', 'nat', '-nL'] argv = ['iptables', '-t', 'nat', '-nL']
p = ssubprocess.Popen(argv, stdout = ssubprocess.PIPE) p = ssubprocess.Popen(argv, stdout = ssubprocess.PIPE)
...@@ -33,10 +41,7 @@ def ipt_chain_exists(name): ...@@ -33,10 +41,7 @@ def ipt_chain_exists(name):
def ipt(*args): def ipt(*args):
argv = ['iptables', '-t', 'nat'] + list(args) argv = ['iptables', '-t', 'nat'] + list(args)
debug1('>> %s\n' % ' '.join(argv)) _call(argv)
rv = ssubprocess.call(argv)
if rv:
raise Fatal('%r returned %d' % (argv, rv))
_no_ttl_module = False _no_ttl_module = False
...@@ -159,15 +164,9 @@ def _defaults_write_kernel_flags(flags): ...@@ -159,15 +164,9 @@ def _defaults_write_kernel_flags(flags):
flagstr = ' '.join(flags) flagstr = ' '.join(flags)
argv = ['defaults', 'write', KERNEL_FLAGS_PATH, KERNEL_FLAGS_NAME, argv = ['defaults', 'write', KERNEL_FLAGS_PATH, KERNEL_FLAGS_NAME,
flagstr] flagstr]
debug1('>> %s\n' % ' '.join(argv)) _call(argv)
rv = ssubprocess.call(argv)
if rv:
raise Fatal('%r returned %d' (argv, rv))
argv = ['plutil', '-convert', 'xml1', KERNEL_FLAGS_PATH + '.plist'] argv = ['plutil', '-convert', 'xml1', KERNEL_FLAGS_PATH + '.plist']
debug1('>> %s\n' % ' '.join(argv)) _call(argv)
rv = ssubprocess.call(argv)
if rv:
raise Fatal('%r returned %d' (argv, rv))
...@@ -253,10 +252,7 @@ def _handle_diversion(divertsock, dnsport): ...@@ -253,10 +252,7 @@ def _handle_diversion(divertsock, dnsport):
def ipfw(*args): def ipfw(*args):
argv = ['ipfw', '-q'] + list(args) argv = ['ipfw', '-q'] + list(args)
debug1('>> %s\n' % ' '.join(argv)) _call(argv)
rv = ssubprocess.call(argv)
if rv:
raise Fatal('%r returned %d' % (argv, rv))
def do_ipfw(port, dnsport, subnets): def do_ipfw(port, dnsport, subnets):
...@@ -296,8 +292,7 @@ def do_ipfw(port, dnsport, subnets): ...@@ -296,8 +292,7 @@ def do_ipfw(port, dnsport, subnets):
"to work around a bug in MacOS 10.7 Lion. You will need\n" "to work around a bug in MacOS 10.7 Lion. You will need\n"
"to reboot before it takes effect. You only have to\n" "to reboot before it takes effect. You only have to\n"
"do this once.\n\n") "do this once.\n\n")
sys.exit(1) sys.exit(EXITCODE_NEEDS_REBOOT)
ipfw('add', sport, 'check-state', 'ip', ipfw('add', sport, 'check-state', 'ip',
'from', 'any', 'to', 'any') 'from', 'any', 'to', 'any')
......
...@@ -30,6 +30,11 @@ class Fatal(Exception): ...@@ -30,6 +30,11 @@ class Fatal(Exception):
pass pass
EXITCODE_NEEDS_REBOOT = 111
class FatalNeedsReboot(Fatal):
pass
def list_contains_any(l, sub): def list_contains_any(l, sub):
for i in sub: for i in sub:
if i in l: if i in l:
......
...@@ -126,6 +126,9 @@ try: ...@@ -126,6 +126,9 @@ try:
parse_subnets(includes), parse_subnets(includes),
parse_subnets(excludes), parse_subnets(excludes),
opt.syslog, opt.daemon, opt.pidfile)) opt.syslog, opt.daemon, opt.pidfile))
except FatalNeedsReboot, e:
log('You must reboot before using sshuttle.\n')
sys.exit(EXITCODE_NEEDS_REBOOT)
except Fatal, e: except Fatal, e:
log('fatal: %s\n' % e) log('fatal: %s\n' % e)
sys.exit(99) sys.exit(99)
......
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