summaryrefslogtreecommitdiff
path: root/src/leap/bitmask/vpn
diff options
context:
space:
mode:
Diffstat (limited to 'src/leap/bitmask/vpn')
-rw-r--r--src/leap/bitmask/vpn/_control.py20
-rw-r--r--src/leap/bitmask/vpn/_management.py67
-rw-r--r--src/leap/bitmask/vpn/_telnet.py (renamed from src/leap/bitmask/vpn/udstelnet.py)4
-rw-r--r--src/leap/bitmask/vpn/manager.py13
-rw-r--r--src/leap/bitmask/vpn/process.py12
5 files changed, 76 insertions, 40 deletions
diff --git a/src/leap/bitmask/vpn/_control.py b/src/leap/bitmask/vpn/_control.py
index 82dd90bc..6e942f48 100644
--- a/src/leap/bitmask/vpn/_control.py
+++ b/src/leap/bitmask/vpn/_control.py
@@ -1,3 +1,21 @@
+
+import os
+
+from twisted.internet.task import LoopingCall
+from twisted.internet import reactor
+from twisted.logger import Logger
+
+from .process import VPNProcess
+from .constants import IS_MAC
+
+logger = Logger()
+
+# NOTE: We need to set a bigger poll time in OSX because it seems
+# openvpn malfunctions when you ask it a lot of things in a short
+# amount of time.
+POLL_TIME = 2.5 if IS_MAC else 1.0
+
+
class VPNControl(object):
"""
This is the high-level object that the service is dealing with.
@@ -181,7 +199,7 @@ class VPNControl(object):
and start the looping call for them.
"""
for poller in self._pollers:
- poller.start(VPNManager.POLL_TIME)
+ poller.start(POLL_TIME)
def _stop_pollers(self):
diff --git a/src/leap/bitmask/vpn/_management.py b/src/leap/bitmask/vpn/_management.py
index 51120a34..9ae90118 100644
--- a/src/leap/bitmask/vpn/_management.py
+++ b/src/leap/bitmask/vpn/_management.py
@@ -1,4 +1,24 @@
-from leap.bitmask.vpn.constants import IS_MAC
+import os
+import shutil
+import socket
+
+from twisted.internet import defer, reactor
+from twisted.logger import Logger
+
+import psutil
+try:
+ # psutil < 2.0.0
+ from psutil.error import AccessDenied as psutil_AccessDenied
+ PSUTIL_2 = False
+except ImportError:
+ # psutil >= 2.0.0
+ from psutil import AccessDenied as psutil_AccessDenied
+ PSUTIL_2 = True
+
+from ._telnet import UDSTelnet
+
+
+logger = Logger()
class OpenVPNAlreadyRunning(Exception):
@@ -23,10 +43,6 @@ class VPNManagement(object):
"""
# Timers, in secs
- # NOTE: We need to set a bigger poll time in OSX because it seems
- # openvpn malfunctions when you ask it a lot of things in a short
- # amount of time.
- POLL_TIME = 2.5 if IS_MAC else 1.0
CONNECTION_RETRY_TIME = 1
def __init__(self, signaler=None):
@@ -81,7 +97,7 @@ class VPNManagement(object):
except socket.error:
# XXX should get a counter and repeat only
# after mod X times.
- logger.warning('socket error (command was: "%s")' % (command,))
+ logger.warn('socket error (command was: "%s")' % (command,))
self._close_management_socket(announce=False)
logger.debug('trying to connect to management again')
self.try_to_connect_to_management(max_retries=5)
@@ -89,8 +105,8 @@ class VPNManagement(object):
# XXX should move this to a errBack!
except Exception as e:
- logger.warning("Error sending command %s: %r" %
- (command, e))
+ logger.warn("Error sending command %s: %r" %
+ (command, e))
return []
def _close_management_socket(self, announce=True):
@@ -135,7 +151,7 @@ class VPNManagement(object):
# XXX move this to the Errback
except Exception as e:
- logger.warning("Could not connect to OpenVPN yet: %r" % (e,))
+ logger.warn("Could not connect to OpenVPN yet: %r" % (e,))
self._tn = None
def _connectCb(self, *args):
@@ -155,7 +171,7 @@ class VPNManagement(object):
:param failure: Failure
"""
- logger.warning(failure)
+ logger.warn(failure)
def connect_to_management(self, host, port):
"""
@@ -192,8 +208,8 @@ class VPNManagement(object):
:type retry: int
"""
if max_retries and retry > max_retries:
- logger.warning("Max retries reached while attempting to connect "
- "to management. Aborting.")
+ logger.warn("Max retries reached while attempting to connect "
+ "to management. Aborting.")
self.aborted = True
return
@@ -230,7 +246,8 @@ class VPNManagement(object):
state = status_step
if state != self._last_state:
if self._signaler is not None:
- self._signaler.signal(self._signaler.eip_state_changed, state)
+ self._signaler.signal(
+ self._signaler.eip_state_changed, state)
self._last_state = state
def _parse_status_and_notify(self, output):
@@ -269,7 +286,8 @@ class VPNManagement(object):
status = (tun_tap_read, tun_tap_write)
if status != self._last_status:
if self._signaler is not None:
- self._signaler.signal(self._signaler.eip_status_changed, status)
+ self._signaler.signal(
+ self._signaler.eip_status_changed, status)
self._last_status = status
def get_state(self):
@@ -313,7 +331,7 @@ class VPNManagement(object):
"""
if self._socket_port == "unix":
logger.debug('cleaning socket file temp folder')
- tempfolder = first(os.path.split(self._socket_host))
+ tempfolder = _first(os.path.split(self._socket_host))
if tempfolder and os.path.isdir(tempfolder):
try:
shutil.rmtree(tempfolder)
@@ -371,12 +389,16 @@ class VPNManagement(object):
cmdline = process.cmdline
manag_flag = "--management"
+
if isinstance(cmdline, list) and manag_flag in cmdline:
+
# we know that our invocation has this distinctive fragment, so
# we use this fingerprint to tell other invocations apart.
# this might break if we change the configuration path in the
# launchers
- smellslikeleap = lambda s: "leap" in s and "providers" in s
+
+ def smellslikeleap(s):
+ return "leap" in s and "providers" in s
if not any(map(smellslikeleap, cmdline)):
logger.debug("We cannot stop this instance since we do not "
@@ -401,8 +423,8 @@ class VPNManagement(object):
self._send_command("signal SIGTERM")
self._close_management_socket(announce=True)
except (Exception, AssertionError) as e:
- logger.warning("Problem trying to terminate OpenVPN: %r"
- % (e,))
+ logger.warn("Problem trying to terminate OpenVPN: %r"
+ % (e,))
else:
logger.debug("Could not find the expected openvpn command line.")
@@ -412,5 +434,12 @@ class VPNManagement(object):
"openvpn process.")
return True
else:
- logger.warning("Unable to terminate OpenVPN")
+ logger.warn("Unable to terminate OpenVPN")
raise OpenVPNAlreadyRunning
+
+
+def _first(things):
+ try:
+ return things[0]
+ except (IndexError, TypeError):
+ return None
diff --git a/src/leap/bitmask/vpn/udstelnet.py b/src/leap/bitmask/vpn/_telnet.py
index e6c82350..cfc82ef0 100644
--- a/src/leap/bitmask/vpn/udstelnet.py
+++ b/src/leap/bitmask/vpn/_telnet.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# udstelnet.py
-# Copyright (C) 2013 LEAP
+# _telnet.py
+# Copyright (C) 2013-2017 LEAP
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/src/leap/bitmask/vpn/manager.py b/src/leap/bitmask/vpn/manager.py
index 68025852..a27789c3 100644
--- a/src/leap/bitmask/vpn/manager.py
+++ b/src/leap/bitmask/vpn/manager.py
@@ -22,14 +22,14 @@ VPN Manager
import os
import tempfile
-from .process import VPNProcess
-from ._config import _TempEIPConfig
+from ._control import VPNControl
+from ._config import _TempEIPConfig, _TempProviderConfig
from .constants import IS_WIN
# TODO this is very badly named. There is another class that is called
-# manager!!!
+# manager. This
class VPNManager(object):
@@ -50,10 +50,9 @@ class VPNManager(object):
self._remotes = remotes
self._eipconfig = _TempEIPConfig(extra_flags, cert_path, ports)
- self._providerconfig = _config._TempProviderConfig(domain, ca_path)
- # signaler = None # XXX handle signaling somehow...
- signaler = mock_signaler
- self._vpn = VPNProcess(remotes=remotes, signaler=signaler)
+ self._providerconfig = _TempProviderConfig(domain, ca_path)
+ signaler = None # XXX handle signaling somehow...
+ self._vpn = VPNControl(remotes=remotes, signaler=signaler)
def start(self):
diff --git a/src/leap/bitmask/vpn/process.py b/src/leap/bitmask/vpn/process.py
index 47c29423..ef5ee37f 100644
--- a/src/leap/bitmask/vpn/process.py
+++ b/src/leap/bitmask/vpn/process.py
@@ -29,16 +29,6 @@ import sys
from itertools import chain, repeat
-import psutil
-try:
- # psutil < 2.0.0
- from psutil.error import AccessDenied as psutil_AccessDenied
- PSUTIL_2 = False
-except ImportError:
- # psutil >= 2.0.0
- from psutil import AccessDenied as psutil_AccessDenied
- PSUTIL_2 = True
-
from twisted.internet import defer, protocol, reactor
from twisted.internet import error as internet_error
from twisted.internet.task import LoopingCall
@@ -90,7 +80,7 @@ class VPNProcess(protocol.ProcessProtocol, _management.VPNManagement):
openvpn invocation
:type openvpn_verb: int
"""
- VPNManagement.__init__(self, signaler=signaler)
+ _management.VPNManagement.__init__(self, signaler=signaler)
self._eipconfig = eipconfig
self._providerconfig = providerconfig