diff options
author | kali <kali@leap.se> | 2012-11-28 03:01:53 +0900 |
---|---|---|
committer | kali <kali@leap.se> | 2012-11-28 03:02:19 +0900 |
commit | 564b82fa30ebcd8a0abfea54e00506dd77446a54 (patch) | |
tree | 27e594233eff749f928cb503e3d4a9920aa08062 | |
parent | eec567a0a26edddb30b15ea4ef67f042c160d5ba (diff) | |
parent | a3ce61ea54b0b0f5c1ecd5904379e27cfec885b5 (diff) |
Merge branch 'feature/catch-ctrl-c' into develop
Closes #760
-rw-r--r-- | src/leap/app.py | 21 | ||||
-rw-r--r-- | src/leap/baseapp/mainwindow.py | 4 | ||||
-rw-r--r-- | src/leap/eip/openvpnconnection.py | 7 |
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 |