diff options
Diffstat (limited to 'src/leap/bitmask')
-rw-r--r-- | src/leap/bitmask/vpn/_control.py | 18 | ||||
-rw-r--r-- | src/leap/bitmask/vpn/process.py | 75 |
2 files changed, 48 insertions, 45 deletions
diff --git a/src/leap/bitmask/vpn/_control.py b/src/leap/bitmask/vpn/_control.py index 8211e622..74182a9e 100644 --- a/src/leap/bitmask/vpn/_control.py +++ b/src/leap/bitmask/vpn/_control.py @@ -5,8 +5,8 @@ from twisted.internet.task import LoopingCall from twisted.internet import reactor from twisted.logger import Logger -from .process import VPNProcess, VPNCanary -from .constants import IS_LINUX, IS_MAC +from .process import VPNProcess +from .constants import IS_MAC log = Logger() @@ -57,16 +57,10 @@ class VPNControl(object): kwargs = {'openvpn_verb': 7, 'remotes': self._remotes, 'restartfun': self.restart} - if IS_LINUX: - vpnproc = VPNProcess(*args, **kwargs) - if vpnproc.get_openvpn_process(): - log.info('Another vpn process is running. Will try to stop it.') - vpnproc.stop_if_already_running() - elif IS_MAC: - # start the main vpn subprocess - vpnproc = VPNCanary(*args, **kwargs) - else: - raise Exception('This platform does not support VPN yet!') + vpnproc = VPNProcess(*args, **kwargs) + if vpnproc.get_openvpn_process(): + log.info('Another vpn process is running. Will try to stop it.') + vpnproc.stop_if_already_running() try: cmd = vpnproc.getCommand() diff --git a/src/leap/bitmask/vpn/process.py b/src/leap/bitmask/vpn/process.py index 429b7b75..895cd0a2 100644 --- a/src/leap/bitmask/vpn/process.py +++ b/src/leap/bitmask/vpn/process.py @@ -33,13 +33,14 @@ from leap.bitmask.vpn import _status from leap.bitmask.vpn import _management from leap.bitmask.vpn.launchers import darwin +from leap.bitmask.vpn.constants import IS_MAC, IS_LINUX # OpenVPN verbosity level - from flags.py OPENVPN_VERBOSITY = 1 -class VPNProcess(protocol.ProcessProtocol, _management.VPNManagement): +class _VPNProcess(protocol.ProcessProtocol, _management.VPNManagement): """ A ProcessProtocol class that can be used to spawn a process that will @@ -233,41 +234,49 @@ class VPNProcess(protocol.ProcessProtocol, _management.VPNManagement): self.log.debug('Process Exited Already') -class VPNCanary(VPNProcess): +if IS_LINUX: - """ - Special form of the VPNProcess, for Darwin Launcher (windows might use 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. + VPNProcess = _VPNProcess - This is a workaround to allow the state machine to be notified when openvpn - process is spawned by the privileged helper. - """ - def setupHelper(self): - self.helper = darwin.HelperCommand() - - def connectionMade(self): - VPNProcess.connectionMade(self) - reactor.callLater(2, self.registerPID) +elif IS_MAC: - def registerPID(self): - cmd = 'openvpn_set_watcher %s' % self.pid - self.helper.send(cmd) + class _VPNCanary(_VPNProcess): - def killProcess(self): - cmd = 'openvpn_force_stop' - self.helper.send(cmd) + """ + Special form of _VPNProcess, for Darwin Launcher (windows might use + same strategy). - def getVPNCommand(self): - return VPNProcess.getCommand(self) + This is a Canary Process that does not run openvpn itself, but it's + notified by the privileged process when the process dies. - 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)''' - return ['python', '-c', '%s' % canary] + This is a workaround to allow the state machine to be notified when + openvpn process is spawned by the privileged helper. + """ + def setupHelper(self): + self.helper = darwin.HelperCommand() + + def connectionMade(self): + VPNProcess.connectionMade(self) + reactor.callLater(2, self.registerPID) + + def registerPID(self): + cmd = 'openvpn_set_watcher %s' % self.pid + self.helper.send(cmd) + + def killProcess(self): + cmd = 'openvpn_force_stop' + self.helper.send(cmd) + + def getVPNCommand(self): + return VPNProcess.getCommand(self) + + 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)''' + return ['python', '-c', '%s' % canary] + + VPNProcess = _VPNCanary |