From 479710e977327774b9ba9e1839f75b4a38b51e5f Mon Sep 17 00:00:00 2001 From: kali Date: Mon, 8 Oct 2012 09:32:34 +0900 Subject: add leap-status to main window in non-debug mode not very DRY but just to have it ready for rc cut. --- src/leap/baseapp/eip.py | 1 + src/leap/baseapp/leap_app.py | 42 ++++++++++++++++++++++-------------------- src/leap/baseapp/mainwindow.py | 37 +++++++++++++------------------------ src/leap/baseapp/systray.py | 41 +++++++++++++++++++++++++++++------------ src/leap/eip/eipconnection.py | 26 ++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 56 deletions(-) diff --git a/src/leap/baseapp/eip.py b/src/leap/baseapp/eip.py index e291de34..311470f2 100644 --- a/src/leap/baseapp/eip.py +++ b/src/leap/baseapp/eip.py @@ -36,6 +36,7 @@ class EIPConductorAppMixin(object): self.conductor = EIPConnection( watcher_cb=self.newLogLine.emit, config_file=config_file, + checker_signals=(self.changeLeapStatus.emit, ), status_signals=(self.statusChange.emit, ), debug=self.debugmode, ovpn_verbosity=opts.openvpn_verb) diff --git a/src/leap/baseapp/leap_app.py b/src/leap/baseapp/leap_app.py index 460d1269..f9eb3bb1 100644 --- a/src/leap/baseapp/leap_app.py +++ b/src/leap/baseapp/leap_app.py @@ -31,6 +31,8 @@ class MainWindowMixin(object): # add widgets to layout #self.createWindowHeader() #mainLayout.addWidget(self.headerBox) + + # created in systray mainLayout.addWidget(self.statusIconBox) if self.debugmode: mainLayout.addWidget(self.statusBox) @@ -87,26 +89,26 @@ class MainWindowMixin(object): icon = QtGui.QIcon(APP_LOGO) self.setWindowIcon(icon) - def createWindowHeader(self): - """ - description lines for main window - """ - self.headerBox = QtGui.QGroupBox() - self.headerLabel = QtGui.QLabel( - "LEAP Encryption Access Project") - self.headerLabelSub = QtGui.QLabel( - "
your internet encryption toolkit") - - pixmap = QtGui.QPixmap(APP_LOGO) - leap_lbl = QtGui.QLabel() - leap_lbl.setPixmap(pixmap) - - headerLayout = QtGui.QHBoxLayout() - headerLayout.addWidget(leap_lbl) - headerLayout.addWidget(self.headerLabel) - headerLayout.addWidget(self.headerLabelSub) - headerLayout.addStretch() - self.headerBox.setLayout(headerLayout) + #def createWindowHeader(self): + #""" + #description lines for main window + #""" + #self.headerBox = QtGui.QGroupBox() + #self.headerLabel = QtGui.QLabel( + #"LEAP Encryption Access Project") + #self.headerLabelSub = QtGui.QLabel( + #"
your internet encryption toolkit") +# + #pixmap = QtGui.QPixmap(APP_LOGO) + #leap_lbl = QtGui.QLabel() + #leap_lbl.setPixmap(pixmap) +# + #headerLayout = QtGui.QHBoxLayout() + #headerLayout.addWidget(leap_lbl) + #headerLayout.addWidget(self.headerLabel) + #headerLayout.addWidget(self.headerLabelSub) + #headerLayout.addStretch() + #self.headerBox.setLayout(headerLayout) def set_statusbarMessage(self, msg): self.statusBar().showMessage(msg) diff --git a/src/leap/baseapp/mainwindow.py b/src/leap/baseapp/mainwindow.py index 09e0c0bb..bf42f0e7 100644 --- a/src/leap/baseapp/mainwindow.py +++ b/src/leap/baseapp/mainwindow.py @@ -10,7 +10,6 @@ from leap.baseapp.log import LogPaneMixin from leap.baseapp.systray import StatusAwareTrayIconMixin from leap.baseapp.network import NetworkCheckerAppMixin from leap.baseapp.leap_app import MainWindowMixin -from leap.baseapp import dialogs logger = logging.getLogger(name=__name__) @@ -28,11 +27,16 @@ class LeapWindow(QtGui.QMainWindow, """ newLogLine = QtCore.pyqtSignal([str]) - statusChange = QtCore.pyqtSignal([object]) mainappReady = QtCore.pyqtSignal([]) initReady = QtCore.pyqtSignal([]) networkError = QtCore.pyqtSignal([object]) + # XXX fix nomenclature here + # this is eip status change got from vpn management + statusChange = QtCore.pyqtSignal([object]) + # this is global leap status + changeLeapStatus = QtCore.pyqtSignal([str]) + def __init__(self, opts): logger.debug('init leap window') self.debugmode = getattr(opts, 'debug', False) @@ -59,13 +63,18 @@ class LeapWindow(QtGui.QMainWindow, self.trayIcon.activated.connect(self.iconActivated) self.newLogLine.connect( lambda line: self.onLoggerNewLine(line)) - self.statusChange.connect( - lambda status: self.onStatusChange(status)) self.timer.timeout.connect( lambda: self.onTimerTick()) self.networkError.connect( lambda exc: self.onNetworkError(exc)) + # status change. + # TODO unify + self.statusChange.connect( + lambda status: self.onStatusChange(status)) + self.changeLeapStatus.connect( + lambda newstatus: self.onChangeLeapConnStatus(newstatus)) + # do frwizard and init signals self.mainappReady.connect(self.do_first_run_wizard_check) self.initReady.connect(self.runchecks_and_eipconnect) @@ -100,25 +109,5 @@ class InitChecksThread(QtCore.QThread): def run(self): self.fun() -#<<<<<<< HEAD def begin(self): self.start() -#======= - # could send "ready" signal instead - # eipapp should catch that - #if self.conductor.autostart: - #self.start_or_stopVPN() -# - #TODO: Put all Dialogs in one place - #@QtCore.pyqtSlot() - #def raise_Network_Error(self, exc): - #message = exc.message -# - # XXX - # check headless = False before - # launching dialog. - # (so Qt tests can assert stuff) -# - #dialog = dialogs.ErrorDialog() - #dialog.warningMessage(message, 'error') -#>>>>>>> feature/network_check diff --git a/src/leap/baseapp/systray.py b/src/leap/baseapp/systray.py index 1939bc09..d5d44f61 100644 --- a/src/leap/baseapp/systray.py +++ b/src/leap/baseapp/systray.py @@ -41,7 +41,7 @@ class StatusAwareTrayIconMixin(object): self.createIconGroupBox() self.createActions() self.createTrayIcon() - logger.debug('showing tray icon................') + #logger.debug('showing tray icon................') self.trayIcon.show() # not sure if this really belongs here, but... @@ -75,6 +75,10 @@ class StatusAwareTrayIconMixin(object): statusIconLayout.addWidget(self.ConnectionWidgets['connected']) statusIconLayout.itemAt(1).widget().hide() statusIconLayout.itemAt(2).widget().hide() + + self.leapConnStatus = QtGui.QLabel("disconnected") + statusIconLayout.addWidget(self.leapConnStatus) + self.statusIconBox.setLayout(statusIconLayout) def createTrayIcon(self): @@ -84,9 +88,6 @@ class StatusAwareTrayIconMixin(object): self.trayIconMenu = QtGui.QMenu(self) self.trayIconMenu.addAction(self.connAct) - #self.trayIconMenu.addAction(self.minimizeAction) - #self.trayIconMenu.addAction(self.maximizeAction) - #self.trayIconMenu.addAction(self.restoreAction) self.trayIconMenu.addSeparator() self.trayIconMenu.addAction(self.detailsAct) self.trayIconMenu.addSeparator() @@ -113,12 +114,6 @@ class StatusAwareTrayIconMixin(object): self.detailsAct = QtGui.QAction("&Details...", self, triggered=self.detailsWin) - #self.minimizeAction = QtGui.QAction("Mi&nimize", self, - #triggered=self.hide) - #self.maximizeAction = QtGui.QAction("Ma&ximize", self, - #triggered=self.showMaximized) - #self.restoreAction = QtGui.QAction("&Restore", self, - #triggered=self.showNormal) self.aboutAct = QtGui.QAction("&About", self, triggered=self.about) self.aboutQtAct = QtGui.QAction("About Q&t", self, @@ -197,10 +192,32 @@ class StatusAwareTrayIconMixin(object): @QtCore.pyqtSlot(object) def onStatusChange(self, status): """ - slot for status changes. triggers new signals for - updating icon, status bar, etc. + updates icon """ icon_name = self.conductor.get_icon_name() + + # XXX refactor. Use QStateMachine + + if icon_name in ("disconnected", "connected"): + self.changeLeapStatus.emit(icon_name) + + if icon_name in ("connecting"): + # let's see how it matches + leap_status_name = self.conductor.get_leap_status() + self.changeLeapStatus.emit(leap_status_name) + self.setIcon(icon_name) # change connection pixmap widget self.setConnWidget(icon_name) + + @QtCore.pyqtSlot(str) + def onChangeLeapConnStatus(self, newstatus): + """ + slot for LEAP status changes + not to be confused with onStatusChange. + this only updates the non-debug LEAP Status line + next to the connection icon. + """ + # XXX move bold to style sheet + self.leapConnStatus.setText( + "%s" % newstatus) diff --git a/src/leap/eip/eipconnection.py b/src/leap/eip/eipconnection.py index f0a98d8c..a5b59892 100644 --- a/src/leap/eip/eipconnection.py +++ b/src/leap/eip/eipconnection.py @@ -35,6 +35,9 @@ class EIPConnection(OpenVPNConnection): status_signals = kwargs.pop('status_signals', None) self.status = EIPConnectionStatus(callbacks=status_signals) + checker_signals = kwargs.pop('checker_signals', None) + self.checker_signals = checker_signals + self.provider_cert_checker = provider_cert_checker() self.config_checker = config_checker() @@ -59,10 +62,14 @@ class EIPConnection(OpenVPNConnection): try: # network (1) + for signal in self.checker_signals: + signal('checking encryption keys') self.provider_cert_checker.run_all(skip_verify=skip_verify) except Exception as exc: push_err(exc) try: + for signal in self.checker_signals: + signal('checking provider config') self.config_checker.run_all(skip_download=skip_download) except Exception as exc: push_err(exc) @@ -125,6 +132,9 @@ class EIPConnection(OpenVPNConnection): """ return self.status.get_state_icon() + def get_leap_status(self): + return self.status.get_leap_status() + # # private methods # @@ -231,6 +241,22 @@ class EIPConnectionStatus(object): } return human_status[self.current] + def get_leap_status(self): + # XXX improve nomenclature + leap_status = { + 1: 'connecting to gateway', + 2: 'connecting to gateway', + 3: 'authenticating', + 4: 'establishing network encryption', + 5: 'establishing network encryption', + 6: 'establishing network encryption', + 7: 'connected', + 8: 'reconnecting', + 9: 'exiting', + 11: 'unrecoverable error', + } + return leap_status[self.current] + def get_state_icon(self): """ returns the high level icon -- cgit v1.2.3