diff options
author | Kali Kaneko <kali@leap.se> | 2017-06-15 09:24:03 -0700 |
---|---|---|
committer | Kali Kaneko (leap communications) <kali@leap.se> | 2017-06-16 19:22:26 +0200 |
commit | 91b001b65f6974897fb0d7fd13991facd8227c47 (patch) | |
tree | 64e389ba68037173f7937af4ffd380e1c684bd67 /src/leap/bitmask/vpn/process.py | |
parent | b3428331a04bc4d8843b4ef2d4a62eaf3f7beafe (diff) |
[feat] fix OpenVPN start/stop in OSX using a process canary
- correctly start the openvpn process canary
- use helper to fix tearing down of the vpn
Diffstat (limited to 'src/leap/bitmask/vpn/process.py')
-rw-r--r-- | src/leap/bitmask/vpn/process.py | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/leap/bitmask/vpn/process.py b/src/leap/bitmask/vpn/process.py index 3de652ff..170df446 100644 --- a/src/leap/bitmask/vpn/process.py +++ b/src/leap/bitmask/vpn/process.py @@ -137,7 +137,6 @@ class _VPNProcess(protocol.ProcessProtocol, _management.VPNManagement): # TODO -- internalize this into _status!!! so that it can be shared if 'SIGTERM[soft,ping-restart]' in line: self.restarting = True - self.log.info(line) def processExited(self, failure): """ @@ -151,10 +150,14 @@ class _VPNProcess(protocol.ProcessProtocol, _management.VPNManagement): elif err == internet_error.ProcessTerminated: status, errmsg = 'failure', failure.value.exitCode if errmsg: - self.log.debug('processExited, status %d' % (errmsg,)) + self.log.debug('Process Exited, status %d' % (errmsg,)) else: self.log.warn('%r' % failure.value) + if IS_MAC: + # TODO: need to exit properly! + status, errmsg = 'off', None + self._status.set_status(status, errmsg) self._alive = False @@ -195,6 +198,9 @@ class _VPNProcess(protocol.ProcessProtocol, _management.VPNManagement): def preUp(self): pass + def preDown(self): + pass + def getCommand(self): """ Gets the vpn command from the aproppriate launcher. @@ -255,8 +261,8 @@ elif IS_MAC: class _VPNCanary(_VPNProcess): """ - Special form of _VPNProcess, for Darwin Launcher (windows might use - same strategy). + Special form of _VPNProcess, for Darwin Launcher (windows might end up + using the same strategy). This is a Canary Process that does not run openvpn itself, but it's notified by the privileged process when the process dies. @@ -274,10 +280,13 @@ elif IS_MAC: cmd = self.getVPNCommand() self.helper.send('openvpn_start %s' % ' '.join(cmd)) + def preDown(self): + self.helper.send('openvpn_stop') + def connectionMade(self): - super(_VPNProcess, self).connectionMade() self.setupHelper() reactor.callLater(2, self.registerPID) + _VPNProcess.connectionMade(self) def registerPID(self): cmd = 'openvpn_set_watcher %s' % self.pid @@ -293,11 +302,9 @@ elif IS_MAC: def getCommand(self): canary = '''import sys, signal, time - def receive_signal(signum, stack): - sys.exit() - signal.signal(signal.SIGTERM, receive_signal) - while True: - time.sleep(60)''' +def receive_signal(signum, stack): sys.exit() +signal.signal(signal.SIGTERM, receive_signal) +while True: time.sleep(90)''' return ['python', '-c', '%s' % canary] VPNProcess = _VPNCanary |