summaryrefslogtreecommitdiff
path: root/src/leap/services/eip
diff options
context:
space:
mode:
Diffstat (limited to 'src/leap/services/eip')
-rw-r--r--src/leap/services/eip/vpnlaunchers.py9
-rw-r--r--src/leap/services/eip/vpnprocess.py30
2 files changed, 34 insertions, 5 deletions
diff --git a/src/leap/services/eip/vpnlaunchers.py b/src/leap/services/eip/vpnlaunchers.py
index 762b536d..56df0b1c 100644
--- a/src/leap/services/eip/vpnlaunchers.py
+++ b/src/leap/services/eip/vpnlaunchers.py
@@ -24,6 +24,7 @@ import getpass
import os
import platform
import subprocess
+import stat
try:
import grp
except ImportError:
@@ -167,7 +168,11 @@ def _has_updown_scripts(path, warn=True):
"Might produce DNS leaks." % (path,))
# XXX check if applies in win
- is_exe = os.access(path, os.X_OK)
+ is_exe = False
+ try:
+ is_exe = (stat.S_IXUSR & os.stat(path)[stat.ST_MODE] != 0)
+ except OSError as e:
+ logger.warn("%s" % (e,))
if warn and not is_exe:
logger.error("Up/down script %s is not executable. "
"Might produce DNS leaks." % (path,))
@@ -211,7 +216,7 @@ def _try_to_launch_agent():
Tries to launch a polkit daemon.
"""
opts = [
- "/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1&",
+ "/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1",
# XXX add kde thing here
]
for cmd in opts:
diff --git a/src/leap/services/eip/vpnprocess.py b/src/leap/services/eip/vpnprocess.py
index d9fa85a6..0ec56ae7 100644
--- a/src/leap/services/eip/vpnprocess.py
+++ b/src/leap/services/eip/vpnprocess.py
@@ -142,6 +142,14 @@ class VPN(object):
# after running out of patience, we try a killProcess
logger.debug("Process did not died. Sending a SIGKILL.")
+ self.killit()
+
+ def killit(self):
+ """
+ Sends a kill signal to the process.
+ """
+ self._stop_pollers()
+ self._vpnproc.aborted = True
self._vpnproc.killProcess()
def terminate(self, shutdown=False):
@@ -225,11 +233,20 @@ class VPNManager(object):
self._reactor = reactor
self._tn = None
self._qtsigs = qtsigs
+ self._aborted = False
@property
def qtsigs(self):
return self._qtsigs
+ @property
+ def aborted(self):
+ return self._aborted
+
+ @aborted.setter
+ def aborted(self, value):
+ self._aborted = value
+
def _seek_to_eof(self):
"""
Read as much as available. Position seek pointer to end of stream
@@ -378,7 +395,7 @@ class VPNManager(object):
"""
# TODO decide about putting a max_lim to retries and signaling
# an error.
- if not self.is_connected():
+ if not self.aborted and not self.is_connected():
self.connect_to_management(self._socket_host, self._socket_port)
self._reactor.callLater(
self.CONNECTION_RETRY_TIME,
@@ -611,6 +628,7 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):
self._last_state = None
self._last_status = None
+ self._alive = False
# processProtocol methods
@@ -620,6 +638,8 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):
.. seeAlso: `http://twistedmatrix.com/documents/13.0.0/api/twisted.internet.protocol.ProcessProtocol.html` # noqa
"""
+ self._alive = True
+ self.aborted = False
self.try_to_connect_to_management()
def outReceived(self, data):
@@ -643,6 +663,8 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):
exit_code = reason.value.exitCode
if isinstance(exit_code, int):
logger.debug("processExited, status %d" % (exit_code,))
+ self.qtsigs.process_finished.emit(exit_code)
+ self._alive = False
def processEnded(self, reason):
"""
@@ -661,13 +683,15 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):
"""
Polls connection status.
"""
- self.get_status()
+ if self._alive:
+ self.get_status()
def pollState(self):
"""
Polls connection state.
"""
- self.get_state()
+ if self._alive:
+ self.get_state()
# launcher