summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkali <kali@leap.se>2012-11-28 03:01:53 +0900
committerkali <kali@leap.se>2012-11-28 03:02:19 +0900
commit564b82fa30ebcd8a0abfea54e00506dd77446a54 (patch)
tree27e594233eff749f928cb503e3d4a9920aa08062
parenteec567a0a26edddb30b15ea4ef67f042c160d5ba (diff)
parenta3ce61ea54b0b0f5c1ecd5904379e27cfec885b5 (diff)
Merge branch 'feature/catch-ctrl-c' into develop
Closes #760
-rw-r--r--src/leap/app.py21
-rw-r--r--src/leap/baseapp/mainwindow.py4
-rw-r--r--src/leap/eip/openvpnconnection.py7
3 files changed, 30 insertions, 2 deletions
diff --git a/src/leap/app.py b/src/leap/app.py
index 4dd93600..d594c7cd 100644
--- a/src/leap/app.py
+++ b/src/leap/app.py
@@ -1,16 +1,26 @@
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
+from functools import partial
import logging
+import signal
# This is only needed for Python v2 but is harmless for Python v3.
import sip
sip.setapi('QVariant', 2)
sip.setapi('QString', 2)
from PyQt4.QtGui import (QApplication, QSystemTrayIcon, QMessageBox)
+from PyQt4.QtCore import QTimer
from leap import __version__ as VERSION
from leap.baseapp.mainwindow import LeapWindow
+def sigint_handler(*args, **kwargs):
+ logger = kwargs.get('logger', None)
+ logger.debug('SIGINT catched. shutting down...')
+ mainwindow = args[0]
+ mainwindow.shutdownSignal.emit()
+
+
def main():
"""
launches the main event loop
@@ -69,6 +79,17 @@ def main():
QApplication.setQuitOnLastWindowClosed(False)
window = LeapWindow(opts)
+
+ # this dummy timer ensures that
+ # control is given to the outside loop, so we
+ # can hook our sigint handler.
+ timer = QTimer()
+ timer.start(500)
+ timer.timeout.connect(lambda: None)
+
+ sigint_window = partial(sigint_handler, window, logger=logger)
+ signal.signal(signal.SIGINT, sigint_window)
+
if debug:
# we only show the main window
# if debug mode active.
diff --git a/src/leap/baseapp/mainwindow.py b/src/leap/baseapp/mainwindow.py
index f07ebb7d..8d61bf5c 100644
--- a/src/leap/baseapp/mainwindow.py
+++ b/src/leap/baseapp/mainwindow.py
@@ -40,6 +40,7 @@ class LeapWindow(QtGui.QMainWindow,
networkError = QtCore.pyqtSignal([object])
triggerEIPError = QtCore.pyqtSignal([object])
start_eipconnection = QtCore.pyqtSignal([])
+ shutdownSignal = QtCore.pyqtSignal([])
# this is status change got from openvpn management
openvpnStatusChange = QtCore.pyqtSignal([object])
@@ -94,6 +95,8 @@ class LeapWindow(QtGui.QMainWindow,
lambda: self.start_or_stopVPN())
self.start_eipconnection.connect(
lambda: self.start_or_stopVPN())
+ self.shutdownSignal.connect(
+ self.cleanupAndQuit)
# status change.
# TODO unify
@@ -101,7 +104,6 @@ class LeapWindow(QtGui.QMainWindow,
lambda status: self.onOpenVPNStatusChange(status))
self.eipStatusChange.connect(
lambda newstatus: self.onEIPConnStatusChange(newstatus))
- # can I connect 2 signals?
self.eipStatusChange.connect(
lambda newstatus: self.toggleEIPAct())
diff --git a/src/leap/eip/openvpnconnection.py b/src/leap/eip/openvpnconnection.py
index 85874cfd..859378c0 100644
--- a/src/leap/eip/openvpnconnection.py
+++ b/src/leap/eip/openvpnconnection.py
@@ -390,9 +390,14 @@ to be triggered for each one of them.
"""
logger.debug("disconnecting...")
if self.connected():
- self._send_command("signal SIGTERM\n")
+ try:
+ self._send_command("signal SIGTERM\n")
+ except socket.error:
+ logger.warning('management socket died')
+ return
if self.subp:
+ # ???
return True
#shutting openvpn failured