From 7868fbc6c97c2a69ff2b9bb2c00f46675e9f721b Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 10 Jan 2014 15:25:40 -0800 Subject: [PATCH] ovsdbmonitor: Remove. ovsdbmonitor was poorly maintained and not widely used. Acked-by: Flavio Leitner Signed-off-by: Ben Pfaff --- INSTALL | 21 -- INSTALL.NetBSD | 3 +- Makefile.am | 3 +- NEWS | 3 +- README | 3 - configure.ac | 5 +- debian/.gitignore | 1 - debian/automake.mk | 2 - debian/control | 19 -- debian/ovsdbmonitor.install | 2 - debian/ovsdbmonitor.manpages | 1 - debian/rules | 1 - m4/openvswitch.m4 | 41 +-- ovsdb/automake.mk | 2 - ovsdb/ovsdbmonitor/.gitignore | 1 - ovsdb/ovsdbmonitor/COPYING | 13 - ovsdb/ovsdbmonitor/ConfigWindow.ui | 185 ----------- ovsdb/ovsdbmonitor/FlowWindow.ui | 216 ------------- ovsdb/ovsdbmonitor/HostWindow.ui | 145 --------- ovsdb/ovsdbmonitor/LogWindow.ui | 71 ----- ovsdb/ovsdbmonitor/MainWindow.ui | 253 --------------- ovsdb/ovsdbmonitor/OVEApp.py | 105 ------- ovsdb/ovsdbmonitor/OVECommonWindow.py | 221 -------------- ovsdb/ovsdbmonitor/OVEConfig.py | 101 ------ ovsdb/ovsdbmonitor/OVEConfigWindow.py | 127 -------- ovsdb/ovsdbmonitor/OVEFetch.py | 388 ------------------------ ovsdb/ovsdbmonitor/OVEFlowWindow.py | 327 -------------------- ovsdb/ovsdbmonitor/OVEHostWindow.py | 54 ---- ovsdb/ovsdbmonitor/OVELogWindow.py | 64 ---- ovsdb/ovsdbmonitor/OVELogger.py | 45 --- ovsdb/ovsdbmonitor/OVEMainWindow.py | 138 --------- ovsdb/ovsdbmonitor/OVEStandard.py | 42 --- ovsdb/ovsdbmonitor/OVEUtil.py | 135 --------- ovsdb/ovsdbmonitor/Ui_ConfigWindow.py | 106 ------- ovsdb/ovsdbmonitor/Ui_FlowWindow.py | 136 --------- ovsdb/ovsdbmonitor/Ui_HostWindow.py | 75 ----- ovsdb/ovsdbmonitor/Ui_LogWindow.py | 42 --- ovsdb/ovsdbmonitor/Ui_MainWindow.py | 222 -------------- ovsdb/ovsdbmonitor/automake.mk | 62 ---- ovsdb/ovsdbmonitor/ovsdbmonitor.1 | 20 -- ovsdb/ovsdbmonitor/ovsdbmonitor.desktop | 7 - ovsdb/ovsdbmonitor/ovsdbmonitor.in | 39 --- ovsdb/ovsdbmonitor/qt4reactor.py | 331 -------------------- 43 files changed, 6 insertions(+), 3772 deletions(-) delete mode 100644 debian/ovsdbmonitor.install delete mode 100644 debian/ovsdbmonitor.manpages delete mode 100644 ovsdb/ovsdbmonitor/.gitignore delete mode 100644 ovsdb/ovsdbmonitor/COPYING delete mode 100644 ovsdb/ovsdbmonitor/ConfigWindow.ui delete mode 100644 ovsdb/ovsdbmonitor/FlowWindow.ui delete mode 100644 ovsdb/ovsdbmonitor/HostWindow.ui delete mode 100644 ovsdb/ovsdbmonitor/LogWindow.ui delete mode 100644 ovsdb/ovsdbmonitor/MainWindow.ui delete mode 100644 ovsdb/ovsdbmonitor/OVEApp.py delete mode 100644 ovsdb/ovsdbmonitor/OVECommonWindow.py delete mode 100644 ovsdb/ovsdbmonitor/OVEConfig.py delete mode 100644 ovsdb/ovsdbmonitor/OVEConfigWindow.py delete mode 100644 ovsdb/ovsdbmonitor/OVEFetch.py delete mode 100644 ovsdb/ovsdbmonitor/OVEFlowWindow.py delete mode 100644 ovsdb/ovsdbmonitor/OVEHostWindow.py delete mode 100644 ovsdb/ovsdbmonitor/OVELogWindow.py delete mode 100644 ovsdb/ovsdbmonitor/OVELogger.py delete mode 100644 ovsdb/ovsdbmonitor/OVEMainWindow.py delete mode 100644 ovsdb/ovsdbmonitor/OVEStandard.py delete mode 100644 ovsdb/ovsdbmonitor/OVEUtil.py delete mode 100644 ovsdb/ovsdbmonitor/Ui_ConfigWindow.py delete mode 100644 ovsdb/ovsdbmonitor/Ui_FlowWindow.py delete mode 100644 ovsdb/ovsdbmonitor/Ui_HostWindow.py delete mode 100644 ovsdb/ovsdbmonitor/Ui_LogWindow.py delete mode 100644 ovsdb/ovsdbmonitor/Ui_MainWindow.py delete mode 100644 ovsdb/ovsdbmonitor/automake.mk delete mode 100644 ovsdb/ovsdbmonitor/ovsdbmonitor.1 delete mode 100644 ovsdb/ovsdbmonitor/ovsdbmonitor.desktop delete mode 100755 ovsdb/ovsdbmonitor/ovsdbmonitor.in delete mode 100644 ovsdb/ovsdbmonitor/qt4reactor.py diff --git a/INSTALL b/INSTALL index 12128c82c..001d3cbea 100644 --- a/INSTALL +++ b/INSTALL @@ -86,11 +86,6 @@ or the database schema, you will also need the following software: - libtool version 2.4 or later. (Older versions might work too.) -If you modify the ovsdbmonitor tool, then you will also need the -following: - - - pyuic4 from PyQt4 (http://www.riverbankcomputing.co.uk). - To run the unit tests, you also need: - Perl. Version 5.10.1 is known to work. Earlier versions should @@ -138,22 +133,6 @@ following software: On Linux you should ensure that /dev/urandom exists. To support TAP devices, you must also ensure that /dev/net/tun exists. -To run the ovsdbmonitor tool, the machine must also have the following -software: - - - Python 2.x, for x >= 4. - - - Python Twisted Conch. - - - Python JSON. - - - PySide or PyQt4. - - - Python Zope interface module. - -(On Debian "lenny" the above can be installed with "apt-get install -python-json python-qt4 python-zopeinterface python-twisted-conch".) - Building and Installing Open vSwitch for Linux, FreeBSD or NetBSD ================================================================= diff --git a/INSTALL.NetBSD b/INSTALL.NetBSD index 49782a805..aab8793e9 100644 --- a/INSTALL.NetBSD +++ b/INSTALL.NetBSD @@ -11,8 +11,7 @@ In that case, you need at least the following packages. py27-xml pkg_alternatives -Some components (eg. ovsdbmonitor) have additional requirements. -(See INSTALL) +Some components have additional requirements. (See INSTALL) Assuming you are running NetBSD/amd64 6.1.2, you can download and install pre-built binary packages as the following. diff --git a/Makefile.am b/Makefile.am index 857708f0c..4299a23cd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. +# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright @@ -139,7 +139,6 @@ SUFFIXES += .in -e 's,[@]bindir[@],$(bindir),g' \ -e 's,[@]sbindir[@],$(sbindir),g' \ -e 's,[@]abs_top_srcdir[@],$(abs_top_srcdir),g' \ - -e 's,[@]ovsdbmonitordir[@],$(ovsdbmonitordir),g' \ > $@.tmp @if head -n 1 $@.tmp | grep '#!' > /dev/null; then \ echo chmod +x $@.tmp; \ diff --git a/NEWS b/NEWS index 515a2362e..8689f5c14 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ Post-v2.1.0 --------------------- - + - The "ovsdbmonitor" graphical tool has been removed, because it was + poorly maintained and not widely used. v2.1.0 - xx xxx xxxx --------------------- diff --git a/README b/README index 63f293357..f6d1a19d1 100644 --- a/README +++ b/README @@ -64,9 +64,6 @@ The main components of this distribution are: * ovs-appctl, a utility that sends commands to running Open vSwitch daemons. - * ovsdbmonitor, a GUI tool for remotely viewing OVS databases and - OpenFlow flow tables. - Open vSwitch also provides some tools: * ovs-ofctl, a utility for querying and controlling OpenFlow diff --git a/configure.ac b/configure.ac index 6a999d035..9b6c69ef5 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. +# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -57,8 +57,6 @@ OVS_CHECK_NETLINK OVS_CHECK_OPENSSL OVS_CHECK_LOGDIR OVS_CHECK_PYTHON -OVS_CHECK_PYUIC4 -OVS_CHECK_OVSDBMONITOR OVS_CHECK_PYTHON_COMPAT OVS_CHECK_DOT OVS_CHECK_IF_PACKET @@ -132,7 +130,6 @@ AC_CONFIG_FILES(tests/atlocal) dnl This makes sure that include/openflow gets created in the build directory. AC_CONFIG_COMMANDS([include/openflow/openflow.h.stamp]) -AC_CONFIG_COMMANDS([ovsdb/ovsdbmonitor/dummy], [:]) AC_CONFIG_COMMANDS([utilities/bugtool/dummy], [:]) AM_CONDITIONAL([LINUX_DATAPATH], [test "$HAVE_NETLINK" = yes && test "$ESX" = no]) diff --git a/debian/.gitignore b/debian/.gitignore index c1aa05957..3d376985e 100644 --- a/debian/.gitignore +++ b/debian/.gitignore @@ -16,6 +16,5 @@ /openvswitch-switch /openvswitch-switch.copyright /openvswitch-test -/ovsdbmonitor /python-openvswitch /tmp diff --git a/debian/automake.mk b/debian/automake.mk index 59db61d19..948a619e7 100644 --- a/debian/automake.mk +++ b/debian/automake.mk @@ -42,8 +42,6 @@ EXTRA_DIST += \ debian/openvswitch-vtep.init \ debian/openvswitch-vtep.install \ debian/openvswitch-vtep.manpages \ - debian/ovsdbmonitor.install \ - debian/ovsdbmonitor.manpages \ debian/ovs-monitor-ipsec \ debian/python-openvswitch.dirs \ debian/python-openvswitch.install \ diff --git a/debian/control b/debian/control index 3b5810dc8..b3e89dfad 100644 --- a/debian/control +++ b/debian/control @@ -152,25 +152,6 @@ Description: Python bindings for Open vSwitch . This package contains the full Python bindings for Open vSwitch database. -Package: ovsdbmonitor -Architecture: all -Section: utils -Depends: ${python:Depends}, python-openvswitch, ${misc:Depends} -Description: Open vSwitch graphical monitoring tool - Open vSwitch is a production quality, multilayer, software-based, - Ethernet virtual switch. It is designed to enable massive network - automation through programmatic extension, while still supporting - standard management interfaces and protocols (e.g. NetFlow, IPFIX, - sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag). In addition, it is designed - to support distribution across multiple physical servers similar to - VMware's vNetwork distributed vswitch or Cisco's Nexus 1000V. - . - This package is a GUI tool for monitoring and troubleshooting local - or remote Open vSwitch installations. It presents GUI tables that - graphically represent an Open vSwitch kernel flow table (similar to - "ovs-dpctl dump-flows") and Open vSwitch database contents (similar - to "ovs-vsctl list "). - Package: openvswitch-test Architecture: all Depends: ${misc:Depends}, ${python:Depends}, python-twisted-web, python (>= 2.7) | python-argparse diff --git a/debian/ovsdbmonitor.install b/debian/ovsdbmonitor.install deleted file mode 100644 index 0572be4b3..000000000 --- a/debian/ovsdbmonitor.install +++ /dev/null @@ -1,2 +0,0 @@ -usr/bin/ovsdbmonitor -usr/share/ovsdbmonitor diff --git a/debian/ovsdbmonitor.manpages b/debian/ovsdbmonitor.manpages deleted file mode 100644 index b30fc8e76..000000000 --- a/debian/ovsdbmonitor.manpages +++ /dev/null @@ -1 +0,0 @@ -ovsdb/ovsdbmonitor/ovsdbmonitor.1 diff --git a/debian/rules b/debian/rules index b21c8dbf0..799bf2e9f 100755 --- a/debian/rules +++ b/debian/rules @@ -107,7 +107,6 @@ install-indep: build-indep # And we should also clean useless license files, which are already # descriped in our debian/copyright anyway. rm -f debian/$(pdkms)/usr/src/$(PACKAGE)-$(DEB_UPSTREAM_VERSION)/COPYING \ - debian/$(pdkms)/usr/src/$(PACKAGE)-$(DEB_UPSTREAM_VERSION)/ovsdb/ovsdbmonitor/COPYING \ debian/$(pdkms)/usr/src/$(PACKAGE)-$(DEB_UPSTREAM_VERSION)/xenserver/LICENSE install-arch: build-arch diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4 index ee7e96a8d..c0af6d47d 100644 --- a/m4/openvswitch.m4 +++ b/m4/openvswitch.m4 @@ -1,6 +1,6 @@ # -*- autoconf -*- -# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. +# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -242,21 +242,6 @@ AC_DEFUN([OVS_CHECK_DOT], fi]) AM_CONDITIONAL([HAVE_DOT], [test "$ovs_cv_dot" = yes])]) -dnl Checks for pyuic4. -AC_DEFUN([OVS_CHECK_PYUIC4], - [AC_CACHE_CHECK( - [for pyuic4], - [ovs_cv_pyuic4], - [if (pyuic4 --version) >/dev/null 2>&1; then - ovs_cv_pyuic4=pyuic4 - else - ovs_cv_pyuic4=no - fi]) - AM_MISSING_PROG([PYUIC4], [pyuic4]) - if test $ovs_cv_pyuic4 != no; then - PYUIC4=$ovs_cv_pyuic4 - fi]) - dnl Checks whether $PYTHON supports the module given as $1 AC_DEFUN([OVS_CHECK_PYTHON_MODULE], [AC_REQUIRE([OVS_CHECK_PYTHON]) @@ -275,30 +260,6 @@ sys.exit(0)' >&AS_MESSAGE_LOG_FD 2>&1; then fi fi])]) -dnl Checks for Python modules needed by ovsdbmonitor. -AC_DEFUN([OVS_CHECK_OVSDBMONITOR], - [OVS_CHECK_PYTHON_MODULE([PySide.QtCore]) - OVS_CHECK_PYTHON_MODULE([PyQt4.QtCore]) - OVS_CHECK_PYTHON_MODULE([twisted.conch.ssh]) - OVS_CHECK_PYTHON_MODULE([twisted.internet]) - OVS_CHECK_PYTHON_MODULE([twisted.application]) - OVS_CHECK_PYTHON_MODULE([json]) - OVS_CHECK_PYTHON_MODULE([zope.interface]) - if (test $ovs_cv_py_PySide_QtCore = yes \ - || test $ovs_cv_py_PyQt4_QtCore = yes) \ - && test $ovs_cv_py_twisted_conch_ssh = yes \ - && test $ovs_cv_py_twisted_internet = yes \ - && test $ovs_cv_py_twisted_application = yes \ - && test $ovs_cv_py_json = yes \ - && test $ovs_cv_py_zope_interface = yes; then - BUILD_OVSDBMONITOR=yes - else - BUILD_OVSDBMONITOR=no - fi - AC_MSG_CHECKING([whether to build ovsdbmonitor]) - AC_MSG_RESULT([$BUILD_OVSDBMONITOR]) - AM_CONDITIONAL([BUILD_OVSDBMONITOR], [test $BUILD_OVSDBMONITOR = yes])]) - dnl Checks for missing python modules at build time AC_DEFUN([OVS_CHECK_PYTHON_COMPAT], [OVS_CHECK_PYTHON_MODULE([uuid]) diff --git a/ovsdb/automake.mk b/ovsdb/automake.mk index b97365ed9..69e790098 100644 --- a/ovsdb/automake.mk +++ b/ovsdb/automake.mk @@ -101,5 +101,3 @@ EXTRA_DIST += ovsdb/ovsdb-dot.in ovsdb/dot2pic noinst_SCRIPTS += ovsdb/ovsdb-dot DISTCLEANFILES += ovsdb/ovsdb-dot OVSDB_DOT = $(run_python) $(srcdir)/ovsdb/ovsdb-dot.in - -include ovsdb/ovsdbmonitor/automake.mk diff --git a/ovsdb/ovsdbmonitor/.gitignore b/ovsdb/ovsdbmonitor/.gitignore deleted file mode 100644 index e02ced007..000000000 --- a/ovsdb/ovsdbmonitor/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/ovsdbmonitor diff --git a/ovsdb/ovsdbmonitor/COPYING b/ovsdb/ovsdbmonitor/COPYING deleted file mode 100644 index f1c6e1ce5..000000000 --- a/ovsdb/ovsdbmonitor/COPYING +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2010 Citrix Systems, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at: - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/ovsdb/ovsdbmonitor/ConfigWindow.ui b/ovsdb/ovsdbmonitor/ConfigWindow.ui deleted file mode 100644 index 6a1316e39..000000000 --- a/ovsdb/ovsdbmonitor/ConfigWindow.ui +++ /dev/null @@ -1,185 +0,0 @@ - - - ConfigWindow - - - - 0 - 0 - 386 - 303 - - - - Qt::TabFocus - - - OVSDB Monitor Configuration - - - - - - - - 0 - - - - Hosts - - - - - 10 - 10 - 341 - 194 - - - - - - - - - - - - Add - - - - - - - Edit - - - - - - - Delete - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - Logging - - - - - - Whether to log traffic exchanges in the log window - - - Log traffic - - - - - - - Qt::Vertical - - - - 20 - 164 - - - - - - - - - View - - - - - - Replaces UUIDs with a shorter string of the first few characters. The tooltip still contains the full value - - - Truncate UUIDs - - - - - - - Qt::Vertical - - - - 20 - 164 - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - - - hostList - hostAddButton - hostEditButton - hostDeleteButton - buttonBox - tabWidget - - - - diff --git a/ovsdb/ovsdbmonitor/FlowWindow.ui b/ovsdb/ovsdbmonitor/FlowWindow.ui deleted file mode 100644 index f3605b4f6..000000000 --- a/ovsdb/ovsdbmonitor/FlowWindow.ui +++ /dev/null @@ -1,216 +0,0 @@ - - - FlowWindow - - - - 0 - 0 - 800 - 600 - - - - OVSDB Monitor - - - - - - - 0 - - - - Awaiting update... - - - - - - - - - - - Server-side grep - - - - - - - true - - - 20 - - - QComboBox::NoInsert - - - 32 - - - - - - - Save - - - - - - - Delete - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Host - - - hostComboBox - - - - - - - QComboBox::AdjustToContents - - - - - - - Auto-refetch every - - - - - - - s - - - 1 - - - 1000000 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Refetches the datapath names and rebuilds the window tabs to reflect them. Use when the network has been reconfigured, e.g. a bond has been created - - - Refetch Datapath List - - - - - - - Refetch - - - - - - - - - Qt::Horizontal - - - - - - - - - 0 - 0 - 800 - 28 - - - - - File - - - - - - - - - - - - - - Show Log - - - - - New DB Window - - - - - Preferences - - - - - Quit - - - - - New Flow Window - - - - - - diff --git a/ovsdb/ovsdbmonitor/HostWindow.ui b/ovsdb/ovsdbmonitor/HostWindow.ui deleted file mode 100644 index e72ac0236..000000000 --- a/ovsdb/ovsdbmonitor/HostWindow.ui +++ /dev/null @@ -1,145 +0,0 @@ - - - HostWindow - - - Qt::WindowModal - - - - 0 - 0 - 400 - 300 - - - - - 0 - 0 - - - - Host Properties - - - - - - - - Host name or IP - - - hostAddressEdit - - - - - - - - 256 - 0 - - - - - - - - SSH Password - - - hostPasswordEdit - - - - - - - - 256 - 0 - - - - QLineEdit::Password - - - - - - - Connect target - - - hostConnectTarget - - - - - - - - 256 - 0 - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - hostAddressEdit - hostPasswordEdit - buttonBox - - - - - buttonBox - accepted() - HostWindow - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - HostWindow - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/ovsdb/ovsdbmonitor/LogWindow.ui b/ovsdb/ovsdbmonitor/LogWindow.ui deleted file mode 100644 index f2ac7cd4f..000000000 --- a/ovsdb/ovsdbmonitor/LogWindow.ui +++ /dev/null @@ -1,71 +0,0 @@ - - - LogWindow - - - - 0 - 0 - 735 - 558 - - - - OVSDB Monitor Log - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Close|QDialogButtonBox::Reset - - - - - - - - - - - buttonBox - accepted() - LogWindow - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - LogWindow - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/ovsdb/ovsdbmonitor/MainWindow.ui b/ovsdb/ovsdbmonitor/MainWindow.ui deleted file mode 100644 index b49c85e57..000000000 --- a/ovsdb/ovsdbmonitor/MainWindow.ui +++ /dev/null @@ -1,253 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - OVSDB Monitor - - - - - - - - - 0 - - - - Bridge - - - - - - - - - - Controller - - - - - - - - - - Interface - - - - - - - - - - Mirror - - - - - - - - - - NetFlow - - - - - - - - - - Open_vSwitch - - - - - - - - - - Port - - - - - - - - - - QoS - - - - - - - - - - Queue - - - - - - - - - - sFlow - - - - - - - - - - SSL - - - - - - - - - - - - - - - Host - - - hostComboBox - - - - - - - QComboBox::AdjustToContents - - - - - - - Auto-refetch every - - - - - - - s - - - 1 - - - 1000000 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Refetch - - - - - - - - - - - - - 0 - 0 - 800 - 28 - - - - - File - - - - - - - - - - - - - - Show Log - - - - - New DB Window - - - - - Preferences - - - - - Quit - - - - - New Flow Window - - - - - - diff --git a/ovsdb/ovsdbmonitor/OVEApp.py b/ovsdb/ovsdbmonitor/OVEApp.py deleted file mode 100644 index 56b6b17c2..000000000 --- a/ovsdb/ovsdbmonitor/OVEApp.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -from OVEStandard import * -from OVEConfig import * -from OVEFetch import * - -from OVEConfigWindow import * -from OVEFlowWindow import * -from OVELogWindow import * -from OVEMainWindow import * - -class OVEApp: - def __init__(self): - self.app = globalApp - self.app.setOrganizationName("Citrix_Systems_Inc") - self.app.setOrganizationDomain("citrix.com") - self.app.setApplicationName("ovsdbmonitor") - self.mainWindows = [] - self.flowWindows = [] - self.configWindow = None - - def enter(self): - if len(OVEConfig.Inst().hosts) < 1: - self.showConfig(True) - QtGui.QMessageBox.information( - None, "OVSDB Monitor", - "This application browses openvswitch databases on remote hosts. Please add one or more openvswitch hosts to continue") - self.loadMainWindows() - self.loadFlowWindows() - if len(self.mainWindows) == 0 and len(self.flowWindows) == 0: - self.newMainWindow() - self.newLogWindow() - # Reactor must be started after the event loop is running, so use a zero timeout - QtCore.QTimer.singleShot(0, OVEFetch.startReactor) - OVELog("Application started") - retCode = self.app.exec_() - index = 0 - for mainWindow in self.mainWindows: - if mainWindow.isVisible(): - mainWindow.saveSettings(index) - index += 1 # Indent intentional - OVEMainWindow.terminateSettings(index) - index = 0 - for flowWindow in self.flowWindows: - if flowWindow.isVisible(): - flowWindow.saveSettings(index) - index += 1 # Indent intentional - OVEFlowWindow.terminateSettings(index) - self.logWindow.saveSettings() - - def quit(self): - self.app.quit() - - def showLog(self, value): - if value: - self.logWindow.hide() - self.logWindow.show() - else: - self.logWindow.hide() - - def showConfig(self, value): - if value: - del self.configWindow - self.configWindow = OVEConfigWindow(self) - self.configWindow.show() - else: - self.configWindow.hide() - - def newMainWindow(self, loadIndex = None): - self.mainWindows.append(OVEMainWindow(self, loadIndex)) - self.mainWindows[-1].show() - - def newFlowWindow(self, loadIndex = None): - self.flowWindows.append(OVEFlowWindow(self, loadIndex)) - self.flowWindows[-1].show() - - def newLogWindow(self): - self.logWindow = OVELogWindow(self) - - def loadMainWindows(self): - for loadIndex in range(0, 100): - if OVEMainWindow.isLoadable(loadIndex): - self.newMainWindow(loadIndex) - else: - break - - def loadFlowWindows(self): - for loadIndex in range(0, 100): - if OVEFlowWindow.isLoadable(loadIndex): - self.newFlowWindow(loadIndex) - else: - break diff --git a/ovsdb/ovsdbmonitor/OVECommonWindow.py b/ovsdb/ovsdbmonitor/OVECommonWindow.py deleted file mode 100644 index 5c014b77c..000000000 --- a/ovsdb/ovsdbmonitor/OVECommonWindow.py +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from OVEStandard import * -from OVEConfig import * -from OVEFetch import * -from OVELogger import * -from OVEUtil import * - -from Ui_MainWindow import * - -class OVECommonWindow: - def __init__(self, app, loadIndex = None): - self.app = app - self.intervalTimerId = None - self.hostUuid = '' - self.intervalChecked = True - self.intervalSeconds = 5 - self.fetchSkip = 0 - self.currentRef = self.BASE_REF - - self.ui.setupUi(self) - - if loadIndex is not None: - self.loadSettings(loadIndex) - - self.connect(self.ui.actionNew_DB_Window, QtCore.SIGNAL("triggered()"), self.xon_actionNew_DB_Window_triggered) - self.connect(self.ui.actionNew_Flow_Window, QtCore.SIGNAL("triggered()"), self.xon_actionNew_Flow_Window_triggered) - self.connect(self.ui.actionShow_Log, QtCore.SIGNAL("triggered()"), self.xon_actionShow_Log_triggered) - self.connect(self.ui.actionPreferences, QtCore.SIGNAL("triggered()"), self.xon_actionPreferences_triggered) - self.connect(self.ui.actionQuit, QtCore.SIGNAL("triggered()"), self.xon_actionQuit_triggered) - self.connect(self.ui.fetchButton, QtCore.SIGNAL("clicked()"), self.xon_fetchButton_clicked) - self.connect(self.ui.tabWidget, QtCore.SIGNAL("currentChanged(int)"), self.xon_tabWidget_currentChanged) - self.connect(self.ui.hostComboBox, QtCore.SIGNAL("currentIndexChanged(int)"), self.xon_hostComboBox_currentIndexChanged) - self.connect(self.ui.intervalCheckBox, QtCore.SIGNAL("stateChanged(int)"), self.xon_intervalCheckBox_stateChanged) - self.connect(self.ui.intervalSpinBox, QtCore.SIGNAL("valueChanged(int)"), self.xon_intervalSpinBox_valueChanged) - self.connect(OVEConfig.Inst(), QtCore.SIGNAL("configUpdated()"), self.xon_configUpdated) - - self.updateHosts() - self.updateInterval() - self.updateIntervalState() - self.updateTable() - - def xon_actionNew_DB_Window_triggered(self): - self.app.newMainWindow() - - def xon_actionNew_Flow_Window_triggered(self): - self.app.newFlowWindow() - - def xon_actionShow_Log_triggered(self): - self.app.showLog(True) - - def xon_actionPreferences_triggered(self): - self.app.showConfig(True) - - def xon_actionQuit_triggered(self): - self.app.quit() - - def xon_tabWidget_currentChanged(self, value): - self.updateTable() - - def xon_fetchButton_clicked(self): - self.updateTable() - - def xon_configUpdated(self): - self.updateHosts() - - def xon_hostComboBox_currentIndexChanged(self, index): - if (index >= 0): - itemData = self.ui.hostComboBox.itemData(index) - self.hostUuid = str(itemData.toString()) - self.deleteCurrentTable() - self.updateTable() - - def xon_intervalCheckBox_stateChanged(self, state): - self.intervalChecked = (state == Qt.Checked) - self.updateIntervalState() - - def xon_intervalSpinBox_valueChanged(self, value): - self.intervalSeconds = value - self.updateIntervalState() - - def updateIntervalState(self): - if self.intervalTimerId is not None: - self.killTimer(self.intervalTimerId) - if self.intervalChecked: - self.intervalTimerId = self.startTimer(1000*self.intervalSeconds) - - def updateHosts(self): - currentHostUuid = self.hostUuid # self.hostUuid will change due to currentIndexChanged events as we rebuild the combo box - self.hostUuid = '' - self.ui.hostComboBox.clear() - for i, host in enumerate(OVEConfig.Inst().hosts): - self.ui.hostComboBox.addItem(host['address'], QVariant(host['uuid'])) - if host['uuid'] == currentHostUuid: - # This is the currently selected host - self.ui.hostComboBox.setCurrentIndex(i) - if len(OVEConfig.Inst().hosts) == 0: - self.ui.hostComboBox.addItem('(No hosts configured)', QVariant('')) - - def updateInterval(self): - self.ui.intervalCheckBox.setChecked(self.intervalChecked) - self.ui.intervalSpinBox.setValue(self.intervalSeconds) - - def handleFetchEvent(self, ref, values): - OVELog('Unhandled FetchEvent') - - def handleFetchFailEvent(self, ref, message): - OVELog('Unhandled FetchFailEvent') - - def setFetchSkip(self): - # Call before sending a request via OVEFetch - self.fetchSkip = 6 - - def timerEvent(self, event): - if event.timerId() == self.intervalTimerId: - if self.fetchSkip > 0: - self.statusBar().showMessage('Fetch stalled... resend in '+str(self.fetchSkip*self.intervalSeconds)+'s') - self.fetchSkip -= 1 - if self.fetchSkip == 0: - # Stall has timed out. The connection might have hung so reset. Seems to happen with PySide only - OVEFetch.Inst(self.hostUuid).resetTransport() - else: - self.updateTable() - else: - QtGui.QMainWindow.timerEvent(self, event) - - def customEvent(self, event): - if event.type() == OVEFetchEvent.TYPE: - if isinstance(event, OVEFetchEvent): - # The right way to get data - ref = event.ref - values = event.data - else: - # Workaround for PySide issue - ref = OVEFetch.Inst(self.hostUuid).snoopRef(self) - values = OVEFetch.Inst(self.hostUuid).snoopValues(self) - try: - if ref == self.currentRef: - self.fetchSkip = 0 - self.currentRef += 1 # PySide workaround - self.handleFetchEvent(ref, values) - else: - # If refs don't match this event relates to a request before the current one. We've moved - # on since then, e.g. changed the table we've viewing, so ignore it - if OVEConfig.Inst().logTraffic: - OVELog('FetchEvent ref mismatch '+str(ref)+' != '+str(self.currentRef)) - except Exception, e: - OVELog("Error during data handling: "+str(e)) - - elif event.type() == OVEFetchFailEvent.TYPE: - if isinstance(event, OVEFetchFailEvent): - # The right way to get data - ref = event.ref - message = event.message - else: - # Workaround for PySide issue - ref = OVEFetch.Inst(self.hostUuid).snoopRef(self) - message = OVEFetch.Inst(self.hostUuid).snoopMessage(self) - if message is not None: - OVELog(message) - if ref == self.currentRef: - self.fetchSkip = 0 - self.currentRef += 1 # PySide workaround - self.handleFetchFailEvent(ref, message) - else: - if OVEConfig.Inst().logTraffic: - OVELog('FetchFailEvent ref mismatch '+str(ref)+' != '+str(self.currentRef)) - - def deleteCurrentTable(self): - pass - - def saveSettings(self, index): - key = self.LOAD_KEY+str(index) - settings = QtCore.QSettings() - settings.setValue(key+"/loadable", QVariant(True)) - settings.setValue(key+"/pos", QVariant(self.pos())) - settings.setValue(key+"/size", QVariant(self.size())) - settings.setValue(key+"/hostUuid", QVariant(self.hostUuid)) - settings.setValue(key+"/intervalChecked", QVariant(self.intervalChecked)) - settings.setValue(key+"/intervalSeconds", QVariant(self.intervalSeconds)) - - return settings, key - - def loadSettings(self, index): - key = self.LOAD_KEY+str(index) - settings = QtCore.QSettings() - pos = settings.value(key+"/pos", QVariant(QtCore.QPoint(200, 200))).toPoint() - size = settings.value(key+"/size", QVariant(QtCore.QSize(400, 400))).toSize(); - - self.hostUuid = str(settings.value(key+"/hostUuid", QVariant('Unloaded')).toString()) - self.intervalChecked = settings.value(key+"/intervalChecked", QVariant(True)).toBool() - self.intervalSeconds = settings.value(key+"/intervalSeconds", QVariant(5)).toInt()[0] - self.resize(size) - self.move(pos) - return settings, key - - @classmethod - def terminateSettings(self, index): - key = self.LOAD_KEY+str(index) - settings = QtCore.QSettings() - settings.setValue(key+"/loadable", QVariant(False)) - settings.sync() - - @classmethod - def isLoadable(cls, index): - key = cls.LOAD_KEY+str(index) - settings = QtCore.QSettings() - return settings.value(key+"/loadable", QVariant(False)).toBool() - diff --git a/ovsdb/ovsdbmonitor/OVEConfig.py b/ovsdb/ovsdbmonitor/OVEConfig.py deleted file mode 100644 index 9520ae753..000000000 --- a/ovsdb/ovsdbmonitor/OVEConfig.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright (c) 2011 Nicira, Inc. -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from OVEStandard import * -from OVELogger import * -import ovs.json - -def str_recursive(x): - t = type(x) - if t == unicode: - return str(x) - elif t == list: - return [str_recursive(_) for _ in x] - elif t == dict: - out = {} - for k,v in x.iteritems(): - out[str_recursive(k)] = str_recursive(v) - return out - else: - return x - -class OVEConfig(QtCore.QObject): - instance = None - def __init__(self): - QtCore.QObject.__init__(self) - self.hosts = [] - self.logTraffic = True - self.truncateUuids = True - self.ssgList = [] - - @classmethod - def Inst(cls): - if cls.instance is None: - cls.instance = OVEConfig() - cls.instance.loadConfig() - return cls.instance - - def hostFromUuid(self, uuid): - for host in self.hosts: - if host['uuid'] == uuid: - return host - OVELog("+++ Couldn't find host '"+str(uuid)+"' in "+str([x['uuid'] for x in self.hosts])) - return None - - def saveConfig(self): - settings = QtCore.QSettings() - settings.setValue('config/hosts', QVariant(ovs.json.to_string((self.hosts)))) - settings.setValue('config/logTraffic', QVariant(self.logTraffic)) - settings.setValue('config/truncateUuids', QVariant(self.truncateUuids)) - settings.setValue('config/ssgList', QVariant(ovs.json.to_string(self.ssgList))) - settings.sync() - self.emitUpdated() - - def loadConfig(self): - settings = QtCore.QSettings() - jsonText = unicode(settings.value('config/hosts', QVariant('[]')).toString()) - self.hosts = str_recursive(ovs.json.from_string(str(jsonText))) - self.logTraffic = settings.value('config/logTraffic', QVariant(False)).toBool() - self.truncateUuids = settings.value('config/truncateUuids', QVariant(False)).toBool() - jsonText = unicode(settings.value('config/ssgList', QVariant('[]')).toString()) - self.ssgList = ovs.json.from_string(str(jsonText)) - if len(self.ssgList) == 0: - self.ssgList = [ - r'in_port0000', - r'in_port0001', - r'in_port0002', - r'in_port0003', - r'vlan65535', - r'type0800', - r'type0806', - r'proto0', - r'proto6', - r'proto17', - r'ff:ff:ff:ff:ff:ff', - r'!ff:ff:ff:ff:ff:ff', - r'0\.0\.0\.0', - r'!0\.0\.0\.0', - r'255\.255\.255\.255', - r'!255\.255\.255\.255', - r'never', - r'drop', - r'!never', - r'!drop', - r'(never|drop)', - r'!(never|drop)' - ] - - def emitUpdated(self): - self.emit(QtCore.SIGNAL("configUpdated()")) diff --git a/ovsdb/ovsdbmonitor/OVEConfigWindow.py b/ovsdb/ovsdbmonitor/OVEConfigWindow.py deleted file mode 100644 index b5b8d707d..000000000 --- a/ovsdb/ovsdbmonitor/OVEConfigWindow.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from OVEStandard import * -from OVEConfig import * -from OVELogger import * -from Ui_ConfigWindow import * - -from OVEHostWindow import * - -class OVEConfigWindow(QtGui.QDialog): - def __init__(self, app): - QtGui.QDialog.__init__(self) - self.app = app - self.ui = Ui_ConfigWindow() - self.ui.setupUi(self) - - self.connect(self.ui.hostAddButton, QtCore.SIGNAL("clicked()"), self.xon_hostAddButton_clicked) - self.connect(self.ui.hostEditButton, QtCore.SIGNAL("clicked()"), self.xon_hostEditButton_clicked) - self.connect(self.ui.hostDeleteButton, QtCore.SIGNAL("clicked()"), self.xon_hostDeleteButton_clicked) - self.connect(self.ui.buttonBox, QtCore.SIGNAL("clicked(QAbstractButton *)"), self.xon_actionButton_Box_clicked) - self.connect(self.ui.hostList, QtCore.SIGNAL("currentItemChanged(QListWidgetItem *, QListWidgetItem *)"), self.xon_hostList_currentItemChanged) - self.connect(self.ui.logTrafficCheckBox, QtCore.SIGNAL("stateChanged(int)"), self.xon_logTrafficCheckBox_stateChanged) - self.connect(self.ui.truncateUuidsCheckBox, QtCore.SIGNAL("stateChanged(int)"), self.xon_truncateUuidsCheckBox_stateChanged) - self.readConfig() - self.updateWidgets() - - def handleHostWindowRecord(self, record, isEdit): - if record['accepted'] and record['address'].strip() != '': - currentRow = self.ui.hostList.currentRow() - if isEdit: - self.configHosts[currentRow] = record - else: - self.configHosts.append(record) - - self.updateWidgets() - - def xon_hostAddButton_clicked(self): - hostWindow = OVEHostWindow(self) - hostWindow.exec_() - self.handleHostWindowRecord(hostWindow.record(), False) - - def xon_hostEditButton_clicked(self): - if self.ui.hostList.currentItem() is None: - pass # OVELog('No item to edit') - else: - currentRow = self.ui.hostList.currentRow() - hostWindow = OVEHostWindow(self, self.configHosts[currentRow]) - hostWindow.exec_() - self.handleHostWindowRecord(hostWindow.record(), True) - - def xon_hostDeleteButton_clicked(self): - if self.ui.hostList.currentItem() is not None: - currentRow = self.ui.hostList.currentRow() - del self.configHosts[currentRow] - self.updateWidgets() - - def xon_actionButton_Box_clicked(self, button): - role = self.ui.buttonBox.buttonRole(button) - if role == QtGui.QDialogButtonBox.AcceptRole: - self.writeConfig() - self.close() - elif role == QtGui.QDialogButtonBox.ApplyRole: - self.writeConfig() - elif role == QtGui.QDialogButtonBox.RejectRole: - if self.configChanged(): - self.close() - else: - ret = QtGui.QMessageBox.warning( - self, "OVSDB Monitor", - "Changes not applied. Discard?", - QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Apply, - QtGui.QMessageBox.Discard) - - if ret == QtGui.QMessageBox.Apply: - self.writeConfig() - if ret != QtGui.QMessageBox.Cancel: - self.close() - - def xon_hostList_currentItemChanged(self, current, previous): - editable = (current is not None) - self.ui.hostEditButton.setEnabled(editable) - self.ui.hostDeleteButton.setEnabled(editable) - - def xon_logTrafficCheckBox_stateChanged(self, value): - self.configLogTraffic = (value == Qt.Checked) - - def xon_truncateUuidsCheckBox_stateChanged(self, value): - self.configTruncateUuids = (value == Qt.Checked) - - def updateWidgets(self): - self.ui.hostList.clear() - for host in self.configHosts: - self.ui.hostList.addItem(host['address']) - self.ui.logTrafficCheckBox.setChecked(self.configLogTraffic) - self.ui.truncateUuidsCheckBox.setChecked(self.configTruncateUuids) - - def configChanged(self): - return ( - (self.configHosts == OVEConfig.Inst().hosts) and - (self.configLogTraffic == (OVEConfig.Inst().logTraffic))and - (self.configTruncateUuids == (OVEConfig.Inst().truncateUuids)) - ) - - def readConfig(self): - self.configHosts = deepcopy(OVEConfig.Inst().hosts) - self.configLogTraffic = OVEConfig.Inst().logTraffic - self.configTruncateUuids = OVEConfig.Inst().truncateUuids - - def writeConfig(self): - OVEConfig.Inst().hosts = deepcopy(self.configHosts) - OVEConfig.Inst().logTraffic = self.configLogTraffic - OVEConfig.Inst().truncateUuids = self.configTruncateUuids - OVEConfig.Inst().saveConfig() - - diff --git a/ovsdb/ovsdbmonitor/OVEFetch.py b/ovsdb/ovsdbmonitor/OVEFetch.py deleted file mode 100644 index 0beafe7da..000000000 --- a/ovsdb/ovsdbmonitor/OVEFetch.py +++ /dev/null @@ -1,388 +0,0 @@ -# Copyright (c) 2011 Nicira, Inc. -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from OVEStandard import * -from OVEConfig import * -from OVELogger import * -import ovs.json - -# This sequence installs the qt4reactor before twisted gets a chance to install its reactor -import qt4reactor -globalApp = QtGui.QApplication([]) -qt4reactor.install() - -try: - from twisted.conch.ssh import transport, userauth, connection, common, keys, channel - from twisted.internet import defer, protocol, reactor - from twisted.application import reactors -except Exception, e: - print('+++ Python Twisted Conch module is required\n') - raise - -class OVEFetchUserAuth(userauth.SSHUserAuthClient): - def __init__(self, fetch, *params): - userauth.SSHUserAuthClient.__init__(self, *params) - self.fetch = fetch - self.authFails = 0 - - def getPassword(self): - return defer.succeed(self.fetch.config()['password']) - - def ssh_USERAUTH_FAILURE(self, packet): - if self.authFails > 0: # We normally get one so ignore. Real failures send these repeatedly - OVELog('Authentication failure for '+self.fetch.config()['address']) - self.authFails += 1 - userauth.SSHUserAuthClient.ssh_USERAUTH_FAILURE(self, packet) - -class OVEFetchConnection(connection.SSHConnection, QtCore.QObject): - def __init__(self, fetch, *params): - connection.SSHConnection.__init__(self, *params) - QtCore.QObject.__init__(self) - self.fetch = fetch - self._channel = None - self._oldChannels = [] - - def serviceStarted(self): - self.emit(QtCore.SIGNAL('connectionService(QObject)'), self) - - def serviceStopped(self): - self.emit(QtCore.SIGNAL('connectionService(QObject)'), None) - - def execCommand(self, requester, ref, command, commandType): - if self._channel is not None: - # Don't delete old channels immediately in case they're e.g. going to time out with a failure - self._oldChannels.append(self._channel) - if len(self._oldChannels) > 90: - # For 30 second timeouts at 1 second refresh interval and three windows open on a single host, need 90 channels - del self._oldChannels[1] - self._channel = OVECommandChannel(self.fetch, requester, ref, command, commandType, 2**16, 2**15, self) - self.openChannel(self._channel) - - def connectionLost(self, reason): - if self._channel is not None: - self._channel.connectionLost(reason) - -class OVEFetchTransport(transport.SSHClientTransport, QtCore.QObject): - def __init__(self, fetch, *params): - # There is no __init__ method for this class - # transport.SSHClientTransport.__init__(self, *params) - - QtCore.QObject.__init__(self) - self.fetch = fetch - self._connection = None - self.connect(self, QtCore.SIGNAL('channelFailure(QObject, int, QString, QString, QString)'), self.fetch.xon_channelFailure) - - def verifyHostKey(self, hostKey, fingerprint): - return defer.succeed(1) - - def connectionSecure(self): - self._connection = OVEFetchConnection(self.fetch) - QtCore.QObject.connect(self._connection, QtCore.SIGNAL('connectionService(QObject)'), self.fetch.xon_connectionService) - self.requestService( - OVEFetchUserAuth(self.fetch, self.fetch.config().get('username', 'root'), - self._connection)) - - def connectionLost(self, reason): - if self._connection is not None: - self._connection.connectionLost(reason) - -class OVEFetchWrapper: - def __init__(self, contents): - self.contents = contents - -class OVECommandChannel(channel.SSHChannel, QtCore.QObject): - name = 'session' - MSEC_TIMEOUT=10000 - STATUS_CONNECTION_LOST = 100001 - STATUS_TIMEOUT = 100002 - END_MARKER='END-MARKER' - END_MARKER_RE=re.compile(r'^END-MARKER$', re.MULTILINE) - - def __init__(self, fetch, requester, ref, command, commandType, *params): - channel.SSHChannel.__init__(self, *params) - QtCore.QObject.__init__(self) - self.fetch = fetch - self.requester = requester - self.ref = ref - self.command = command - self.commandType= commandType - self._data = '' - self._extData = '' - self._jsonValues = None - self._timerId = None - self._status = None - self.connect(self, QtCore.SIGNAL('channelData(QObject, int, QString)'), self.fetch.xon_channelData) - self.connect(self, QtCore.SIGNAL('channelExtData(QObject, int, QString)'), self.fetch.xon_channelExtData) - self.connect(self, QtCore.SIGNAL('channelSuccess(QObject, int, QString, QString, QVariant)'), self.fetch.xon_channelSuccess) - self.connect(self, QtCore.SIGNAL('channelFailure(QObject, int, QString, QString, QString)'), self.fetch.xon_channelFailure) - - def openFailed(self, reason): - if self._timerId is not None: - self.killTimer(self._timerId) - self.emit(QtCore.SIGNAL('channelFailure(QObject, int, QString, QString, QString)'), self.requester, self.ref, - 'Open failed:'+str(reason), '', '') - - def channelOpen(self, ignoredData): - try: - nsCommand = common.NS(str(self.command)) - self._timerId = self.startTimer(self.MSEC_TIMEOUT) - self.conn.sendRequest(self, 'exec', nsCommand, wantReply=1) - except Exception, e: - self.emit(QtCore.SIGNAL('channelFailure(QObject, int, QString, QString, QString)'), self.requester, self.ref, - 'Open failed:'+str(e), self._data, self._extData) - - def dataReceived(self, data): - self._data += data - if OVEConfig.Inst().logTraffic: - self.emit(QtCore.SIGNAL('channelData(QObject, int, QString)'), self.requester, self.ref, data) - self.testIfDone() - - def extDataReceived(self, extData): - self._extData += extData - if OVEConfig.Inst().logTraffic: - self.emit(QtCore.SIGNAL('channelExtData(QObject, int, QString)'), self.requester, self.ref, extData) - - def request_exit_status(self, data): - # We can get the exit status before the data, so delay calling sendResult until we get both - self._status = struct.unpack('>L', data)[0] - self.testIfDone() - - def testIfDone(self): - if self._status is not None: - if self._status != 0: - self.sendResult() # Failed, so send what we have - elif len(self._data) > 0: - # Status == success and we have some data - if self.commandType == 'JSON': - try: - # Decode the JSON data, to confirm that we have all of the data - self._jsonValues = ovs.json.from_string(str(self._data)) # FIXME: Should handle unicode - self.sendResult() - except: - pass # Wait for more data - elif self.commandType == 'framed': - match = self.END_MARKER_RE.search(self._data) - if match: - self._data = self._data[:match.start()] # Remove end marker - self.sendResult() - else: - OVELog('Bad command type') - - def sendResult(self): - if self._timerId is not None: - self.killTimer(self._timerId) - if self.commandType == 'JSON' and self._status == 0 and self._jsonValues is not None: - self.emit(QtCore.SIGNAL('channelSuccess(QObject, int, QString, QString, QVariant)'), self.requester, self.ref, self._data, self._extData, QVariant(OVEFetchWrapper(self._jsonValues))) - elif self.commandType != 'JSON' and self._status == 0: - self.emit(QtCore.SIGNAL('channelSuccess(QObject, int, QString, QString, QVariant)'), self.requester, self.ref, self._data, self._extData, QVariant(None)) - else: - self.emit(QtCore.SIGNAL('channelFailure(QObject, int, QString, QString, QString)'), self.requester, self.ref, 'Remote command failed (rc='+str(self._status)+')', self._data, self._extData) - if self._status != self.STATUS_CONNECTION_LOST: - try: - self.loseConnection() - except Exception, e: - OVELog('OVECommandChannel.sendResult loseConnection error: '+str(e)) - - def connectionLost(self, reason): - self._extData += '+++ Connection lost' - self._status = self.STATUS_CONNECTION_LOST - self.sendResult() - - def timerEvent(self, event): - if event.timerId() == self._timerId: - self._extData += '+++ Timeout' - self._status = self.STATUS_TIMEOUT - self.sendResult() - else: - QtCore.QObject.timerEvent(self, event) - -class OVEFetchEvent(QtCore.QEvent): - TYPE = QtCore.QEvent.Type(QtCore.QEvent.registerEventType()) - def __init__(self, ref, data): - QtCore.QEvent.__init__(self, self.TYPE) - self.ref = ref - self.data = data - -class OVEFetchFailEvent(QtCore.QEvent): - TYPE = QtCore.QEvent.Type(QtCore.QEvent.registerEventType()) - def __init__(self, ref, message): - QtCore.QEvent.__init__(self, self.TYPE) - self.ref = ref - self.message = str(message) - -class OVEFetch(QtCore.QObject): - instances = {} - SEC_TIMEOUT = 10.0 - - def __init__(self, uuid): - QtCore.QObject.__init__(self) - self._hostUuid = uuid - self._config = None - self._transport = None - self._connection = None - self._commandQueue = [] - self._timerRef = 0 - self.refs = {} - self.messages = {} - self.values = {} - self.connect(OVEConfig.Inst(), QtCore.SIGNAL("configUpdated()"), self.xon_configUpdated) - - @classmethod - def Inst(cls, uuid): - if uuid not in cls.instances: - cls.instances[uuid] = OVEFetch(uuid) - return cls.instances[uuid] - - @classmethod - def startReactor(cls): - reactor.runReturn() - - def xon_configUpdated(self): - self._config = None - self.resetTransport() - - def xon_connectionService(self, connection): - self._connection = connection - if self._connection is not None: - OVELog('SSH connection to '+self.config()['address'] +' established') - for command in self._commandQueue: - # OVELog('Unqueueing '+str(command)) - self.execCommand2(*command) - self._commandQueue = [] - - def xon_channelData(self, requester, ref, data): - if OVEConfig.Inst().logTraffic: - OVELog('Channel data received: '+str(data)) - - def xon_channelExtData(self, requester, ref, data): - if OVEConfig.Inst().logTraffic: - OVELog('+++ Channel extData (stderr) received: '+str(data)) - - def xon_channelFailure(self, requester, ref, message, data, extData): - if OVEConfig.Inst().logTraffic: - OVELog('+++ Channel failure: '+str(message)) - OVELog("Closing SSH session due to failure") - - errMessage = message - if len(data) > 0: - errMessage += '\n+++ Failed command output: '+data - if len(extData) > 0: - errMessage += '\n+++ Failed command output (stderr): '+extData - - self.refs[requester] = ref # For PySide workaround - self.messages[requester] = errMessage # For PySide workaround - event = OVEFetchFailEvent(ref, errMessage) - QtCore.QCoreApplication.postEvent(requester, event) - self.resetTransport() - - def xon_channelSuccess(self, requester, ref, data, extData, jsonValueVariant): - jsonValues = jsonValueVariant.toPyObject() - if OVEConfig.Inst().logTraffic: - OVELog('--- Channel success') - try: - if jsonValues is not None: - values = jsonValues.contents - else: - values = str(data) - - self.refs[requester] = ref # For PySide workaround - self.values[requester] = values # For PySide workaround - event = OVEFetchEvent(ref, values) - QtCore.QCoreApplication.postEvent(requester, event) - except Exception, e: - message = ('+++ Failed to decode JSON reply: '+str(e)) - if len(data) > 0: message += "\n++++++ Data (stdout): "+str(data) - if len(extData) > 0: message += '\n++++++ Error (stderr): '+str(extData) - self.refs[requester] = ref # For PySide workaround - self.messages[requester] = message # For PySide workaround - event = OVEFetchFailEvent(ref, message) - QtCore.QCoreApplication.postEvent(requester, event) - - # Use for workaround only - def snoopRef(self, requester): - return self.refs.get(requester, None) - - # Use for workaround only - def snoopValues(self, requester): - return self.values.get(requester, None) - - # Use for workaround only - def snoopMessage(self, requester): - return self.messages.get(requester, None) - - def config(self): - if self._config is None: - self._config = OVEConfig.Inst().hostFromUuid(self._hostUuid) - - return self._config - - def resetTransport(self): - if OVEConfig.Inst().logTraffic: - OVELog('Transport reset for '+self.config()['address']) - del self._connection - del self._transport - self._connection = None - self._transport = None - - def transportErrback(self, failure, requester, ref, address): - self._timerRef += 1 # Prevent timeout handling - self.resetTransport() - message = 'Failure connecting to '+address+': '+failure.getErrorMessage() - self.refs[requester] = ref # For PySide workaround - self.messages[requester] = message # For PySide workaround - event = OVEFetchFailEvent(ref, message) - QtCore.QCoreApplication.postEvent(requester, event) - - def transportTimeout(self, timerRef, requester, ref, address): - if self._timerRef == timerRef and self._transport is not None and self._connection is None: - message = 'Connection attempt to ' +address+' timed out' - self.refs[requester] = ref # For PySide workaround - self.messages[requester] = message # For PySide workaround - event = OVEFetchFailEvent(ref, message) - QtCore.QCoreApplication.postEvent(requester, event) - self.resetTransport() - - def execCommand(self, requester, ref, command, commandType): - if OVEConfig.Inst().logTraffic: - hostName = (self.config() or {}).get('address', '
') - OVELog(str(QtCore.QTime.currentTime().toString())+' '+hostName+': Executing '+command) - if self._transport is None: - self._connection = None - self._commandQueue.append((requester, ref, command, commandType)) - config = self.config() - creator = protocol.ClientCreator(reactor, OVEFetchTransport, self) - self._transport = creator.connectTCP(config['address'], config.get('port', 22), timeout = self.SEC_TIMEOUT) - self._transport.addErrback(self.transportErrback, requester, ref, config['address']) - self._timerRef += 1 - # Set this timer slightly longer than the twisted.conch timeout, as transportErrback can cancel - # the timeout and prevent double handling - # lambda timerRef = self._timerRef: takes a copy of self._timerRef - QtCore.QTimer.singleShot(int((1+self.SEC_TIMEOUT) * 1000), lambda timerRef = self._timerRef: self.transportTimeout(timerRef, requester, ref, config['address'])) - else: - self.execCommand2(requester, ref, command, commandType) - - def execCommand2(self, requester, ref, command, commandType): - if self._connection is None: - self._commandQueue.append((requester, ref, command, commandType)) - else: - self._connection.execCommand(requester, ref, command, commandType) - - def getTable(self, requester, tableName, ref = QtCore.QObject()): - command = '/usr/bin/ovsdb-client transact '+self.config()['connectTarget']+' \'["Open_vSwitch", {"op":"select","table":"'+tableName+'", "where":[]}]\'' - - self.execCommand(requester, ref, command, 'JSON') - - def execCommandFramed(self, requester, ref, command): - self.execCommand(requester, ref, command + ' && echo ' + OVECommandChannel.END_MARKER, 'framed') diff --git a/ovsdb/ovsdbmonitor/OVEFlowWindow.py b/ovsdb/ovsdbmonitor/OVEFlowWindow.py deleted file mode 100644 index caf6533e9..000000000 --- a/ovsdb/ovsdbmonitor/OVEFlowWindow.py +++ /dev/null @@ -1,327 +0,0 @@ -# Copyright (c) 2011 Nicira, Inc. -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from OVEStandard import * -from OVEConfig import * -from OVEFetch import * -from OVELogger import * -from OVEUtil import * - -from OVECommonWindow import * - -from Ui_FlowWindow import * - -import re - -class OVEFlowWindow(QtGui.QMainWindow, OVECommonWindow): - LOAD_KEY = 'FlowWindow/window' - COMMAND_OVS_DPCTL='/usr/bin/ovs-dpctl' - BASE_REF=200000 - - def __init__(self, app, loadIndex = None): - QtGui.QMainWindow.__init__(self) - self.ui = Ui_FlowWindow() - self.dpNames = [] - self.dpTables = [] - self.currentOpIndex = None - self.resizeCount = [] - self.ssgChecked = False - self.ssgText = '' - self.lastTime = None - self.lastByteCount = 0 - OVECommonWindow.__init__(self, app, loadIndex) - - self.updateSsgList() - self.updateDatapaths() - self.updateSsgState() - - self.connect(self.ui.fetchPathsButton, QtCore.SIGNAL("clicked()"), self.xon_fetchPathsButton_clicked) - self.connect(self.ui.ssgSaveButton, QtCore.SIGNAL("clicked()"), self.xon_ssgSaveButton_clicked) - self.connect(self.ui.ssgDeleteButton, QtCore.SIGNAL("clicked()"), self.xon_ssgDeleteButton_clicked) - self.connect(self.ui.ssgComboBox, QtCore.SIGNAL("activated(int)"), self.xon_ssgComboBox_activated) - self.connect(self.ui.ssgComboBox, QtCore.SIGNAL("editTextChanged(QString)"), self.xon_ssgComboBox_editTextChanged) - self.connect(self.ui.ssgCheckBox, QtCore.SIGNAL("stateChanged(int)"), self.xon_ssgCheckBox_stateChanged) - - - def xon_fetchPathsButton_clicked(self): - self.updateDatapaths() - - def xon_hostComboBox_currentIndexChanged(self, index): - OVECommonWindow.xon_hostComboBox_currentIndexChanged(self, index) - if (index >= 0): - self.updateDatapaths() - - def xon_ssgSaveButton_clicked(self): - if self.ssgText not in OVEConfig.Inst().ssgList: - OVEConfig.Inst().ssgList.append(self.ssgText) - OVEConfig.Inst().saveConfig() - self.updateSsgList() - - def updateSsgList(self): - currentSsgText = self.ssgText - self.ui.ssgComboBox.clear() - isFound = False - for i, ssgText in enumerate(OVEConfig.Inst().ssgList): - self.ui.ssgComboBox.addItem(ssgText) - if ssgText == currentSsgText: - # This is the currently selected item - self.ui.ssgComboBox.setCurrentIndex(i) - isFound = True - - if not isFound: - self.ui.ssgComboBox.setCurrentIndex(-1) - self.ui.ssgComboBox.lineEdit().setText(currentSsgText) - - def xon_ssgDeleteButton_clicked(self): - if self.ssgText in OVEConfig.Inst().ssgList: - OVEConfig.Inst().ssgList.remove(self.ssgText) - self.ssgText = '' - OVEConfig.Inst().saveConfig() - self.updateSsgList() - - def xon_ssgComboBox_activated(self, index): - if (index >= 0): - itemData = self.ui.ssgComboBox.itemText(index) - self.ssgText = str(itemData) - self.updateTable() - - def xon_ssgComboBox_editTextChanged(self, text): - self.ssgText = str(text) - self.statusBar().showMessage('Remote command is: '+self.updateCommand()) - present = (self.ssgText in OVEConfig.Inst().ssgList) - self.ui.ssgDeleteButton.setEnabled(present) - self.ui.ssgSaveButton.setEnabled(not present) - - def xon_ssgCheckBox_stateChanged(self, state): - self.ssgChecked = (state == Qt.Checked) - self.updateTable() - - def xon_configUpdated(self): - OVECommonWindow.xon_configUpdated(self) - self.updateSsgList() - self.updateDatapaths() - - def timerEvent(self, event): - OVECommonWindow.timerEvent(self, event) - - def customEvent(self, event): - OVECommonWindow.customEvent(self, event) - - def updateDatapaths(self): - if self.hostUuid == '': - self.statusBar().showMessage('No host selected') - else: - self.currentRef += 1 - self.currentOp = 'dump-dps' - command = self.COMMAND_OVS_DPCTL+' dump-dps' - OVEFetch.Inst(self.hostUuid).execCommandFramed(self, self.currentRef, command) - - def rebuildTables(self): - self.ui.tabWidget.clear() # Let the garbage collector delete the pages - self.dpTables = [] - self.dpFlows = [] - self.resizeCount = [] - headings = OVEUtil.flowDecodeHeadings() - - for dpName in self.dpNames: - pageWidget = QtGui.QWidget() - pageWidget.setObjectName(dpName+'_page') - gridLayout = QtGui.QGridLayout(pageWidget) - gridLayout.setObjectName(dpName+"_gridLayout") - table = QtGui.QTableWidget(pageWidget) - table.setObjectName(dpName+"_table") - table.setColumnCount(len(headings)) - table.setRowCount(0) - gridLayout.addWidget(table, 0, 0, 1, 1) - self.dpTables.append(table) - self.ui.tabWidget.addTab(pageWidget, dpName) - self.dpFlows.append([]) - self.resizeCount.append(0) - for i, heading in enumerate(headings): - table.setHorizontalHeaderItem(i, QtGui.QTableWidgetItem(heading)) - - table.setSortingEnabled(True) - - table.sortItems(OVEUtil.getFlowColumn('source mac')) - table.setSelectionMode(QtGui.QAbstractItemView.NoSelection) - - def updateSsgState(self): - self.ui.ssgCheckBox.setChecked(self.ssgChecked) - - def updateCommand(self, overrideText = None): - command = self.COMMAND_OVS_DPCTL+' dump-flows ' - if self.currentOpIndex is not None: - command += self.dpNames[self.currentOpIndex] - exp = None - if overrideText is not None: - exp = overrideText - elif self.ssgChecked: - exp = self.ssgText - - if exp is not None: - opts='-E ' - if exp.startswith('!'): - exp =exp[1:] - opts += '-v ' - command += " | grep "+opts+"'"+exp+"' ; test ${PIPESTATUS[0]} -eq 0 " - - return command - - def updateTable(self): - if self.hostUuid == '': - self.statusBar().showMessage('No host selected') - self.setWindowTitle('OVS Flows') - elif len(self.dpNames) > 0: - config = OVEConfig.Inst().hostFromUuid(self.hostUuid) - self.setWindowTitle('OVS Flows - '+config.get('address', '')) - try: - self.setFetchSkip() - self.statusBar().showMessage('Fetching data...') - self.currentRef += 1 - self.currentOp = 'dump-flows' - self.currentOpIndex = self.ui.tabWidget.currentIndex() - OVEFetch.Inst(self.hostUuid).execCommandFramed(self, self.currentRef, self.updateCommand()) - except Exception, e: - message = 'Update failed: '+str(e) - OVELog(message) - self.statusBar().showMessage(message) - - def writeCurrentTable(self): - index = self.ui.tabWidget.currentIndex() - actionsColumn = OVEUtil.getFlowColumn('actions') - usedColumn = OVEUtil.getFlowColumn('used') - srcMacColumn = OVEUtil.getFlowColumn('source mac') - destMacColumn = OVEUtil.getFlowColumn('destination mac') - srcIPColumn = OVEUtil.getFlowColumn('source ip') - destIPColumn = OVEUtil.getFlowColumn('destination ip') - inportColumn = OVEUtil.getFlowColumn('inport') - vlanColumn = OVEUtil.getFlowColumn('vlan') - bytesColumn = OVEUtil.getFlowColumn('bytes') - - byteCount = 0 - try: - table = self.dpTables[index] - table.setUpdatesEnabled(False) - table.setSortingEnabled(False) - try: - flows = self.dpFlows[index] - table.setRowCount(len(flows)) - if len(flows) > 0: - table.setColumnCount(len(flows[0])) - for rowNum, flow in enumerate(flows): - - inport = flow[inportColumn] - if flow[actionsColumn] == 'drop': - baseLum=172 - else: - baseLum=239 - background = QtGui.QColor(baseLum+16*(inport % 2), baseLum+8*(inport % 3), baseLum+4*(inport % 5)) - if flow[usedColumn] == 'never': - colour = QtGui.QColor(112,112,112) - else: - colour = Qt.black - - for colNum, data in enumerate(flow): - item = None - try: - item = table.takeItem(rowNum, colNum) - except: - pass - if item is None: - item = QtGui.QTableWidgetItem('') - - if colNum == vlanColumn: - item.setBackground(QtGui.QColor(255-(10*data % 192), 255-((17*data) % 192), 255-((37*data) % 192))) - elif colNum == srcMacColumn or colNum == destMacColumn: - cols = [int(x, 16) for x in data.split(':')] - item.setBackground(QtGui.QColor(255-cols[2]*cols[3] % 192, 255-cols[3]*cols[4] % 192, 255-cols[4]*cols[5] % 192)) - elif re.match(r'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+', str(data)): - cols = [int(x) for x in data.split('.')] - item.setBackground(QtGui.QColor(255-cols[1]*cols[2] % 192, 255-cols[2]*cols[3] % 192, 255-cols[3]*cols[0] % 192)) - else: - item.setBackground(background) - item.setForeground(colour) - - if colNum == bytesColumn: - byteCount += int(data) - - # PySide 0.2.3 fails to convert long ints to QVariants and logs 'long int too large to convert to int' errors - try: - item.setData(Qt.DisplayRole, QVariant(data)) - item.setToolTip(str(data)) - except Exception, e: - item.setText('Error: See tooltip') - item.setToolTip(str(e)) - table.setItem(rowNum, colNum, item) - - if self.resizeCount[index] < 2: - self.resizeCount[index] += 1 - for i in range(0, table.columnCount()): - table.resizeColumnToContents(i) - - finally: - table.setUpdatesEnabled(True) - table.setSortingEnabled(True) - - message = 'Updated at '+str(QtCore.QTime.currentTime().toString()) - - if self.lastTime is not None: - timeDiff = time.time() - self.lastTime - byteDiff = byteCount - self.lastByteCount - bitRate = long(8 * byteDiff / timeDiff) - if abs(bitRate) < 10*2**20: - message += ' ('+str(bitRate/2**10)+' kbit/s)' - elif abs(bitRate) < 10*2**30: - message += ' ('+str(bitRate/2**20)+' Mbit/s)' - else: - message += ' ('+str(bitRate/2**30)+' Gbit/s)' - - self.lastByteCount = byteCount - self.lastTime = time.time() - if table.rowCount() == 0: - message += ' - Table is empty' - self.statusBar().showMessage(message) - - except Exception, e: - message = 'Table update failed: '+str(e) - OVELog(message) - self.statusBar().showMessage(message) - - def handleFetchEvent(self, ref, values): - if self.currentOp == 'dump-dps': - self.dpNames =values.strip().split('\n') - self.rebuildTables() - self.updateTable() - elif self.currentOp == 'dump-flows': - self.dpFlows[self.currentOpIndex] = OVEUtil.decodeFlows(values) - self.writeCurrentTable() - - def handleFetchFailEvent(self, ref, message): - self.statusBar().showMessage(message) - OVELog('Fetch ('+self.currentOp+') failed') - - def customEvent(self, event): - OVECommonWindow.customEvent(self, event) - - def saveSettings(self, index): - settings, key = OVECommonWindow.saveSettings(self, index) - settings.setValue(key+"/ssgText", QVariant(self.ssgText)) - settings.setValue(key+"/ssgChecked", QVariant(self.ssgChecked)) - - def loadSettings(self, index): - settings, key = OVECommonWindow.loadSettings(self, index) - self.ssgText = str(settings.value(key+"/ssgText", QVariant('10\.80\.226\..*')).toString()) - self.ssgChecked = settings.value(key+"/ssgChecked", QVariant(False)).toBool() - self.ssgRe = re.compile(self.ssgText) diff --git a/ovsdb/ovsdbmonitor/OVEHostWindow.py b/ovsdb/ovsdbmonitor/OVEHostWindow.py deleted file mode 100644 index e56b98144..000000000 --- a/ovsdb/ovsdbmonitor/OVEHostWindow.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from OVEStandard import * -from OVELogger import * -from Ui_HostWindow import * - -class OVEHostWindow(QtGui.QDialog): - DEFAULT_CONNECT_TARGET = 'unix:/var/run/openvswitch/db.sock' - def __init__(self, parent, currentValues = None): - QtGui.QDialog.__init__(self, parent) - self.ui = Ui_HostWindow() - self.ui.setupUi(self) - self.resize(-1, -1) - self.connect(self.ui.buttonBox, QtCore.SIGNAL("clicked(QAbstractButton *)"), self.xon_actionButton_Box_clicked) - if currentValues is not None: - self.ui.hostAddressEdit.setText(currentValues['address']) - self.ui.hostPasswordEdit.setText(currentValues['password']) - self.ui.hostConnectTarget.setText(currentValues.get('connectTarget', self.DEFAULT_CONNECT_TARGET)) - self.uuid = currentValues.get('uuid', str(uuid.uuid4())) - else: - self.ui.hostConnectTarget.setText(self.DEFAULT_CONNECT_TARGET) - self.uuid = str(uuid.uuid4()) - self.accepted = None - - def xon_actionButton_Box_clicked(self, button): - role = self.ui.buttonBox.buttonRole(button) - if role == QtGui.QDialogButtonBox.AcceptRole: - self.accepted = True - self.close() - elif role == QtGui.QDialogButtonBox.RejectRole: - self.accepted = False - self.close() - - def record(self): - return { - 'accepted' : self.accepted, - 'uuid' : self.uuid, - 'address' : str(self.ui.hostAddressEdit.text()), - 'password' : str(self.ui.hostPasswordEdit.text()), - 'connectTarget' : str(self.ui.hostConnectTarget.text()) - } - diff --git a/ovsdb/ovsdbmonitor/OVELogWindow.py b/ovsdb/ovsdbmonitor/OVELogWindow.py deleted file mode 100644 index 3c1a2efe4..000000000 --- a/ovsdb/ovsdbmonitor/OVELogWindow.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from OVEStandard import * -from OVELogger import * -from Ui_LogWindow import * - -class OVELogWindow(QtGui.QDialog): - LOAD_KEY = 'LogWindow/window' - def __init__(self, app): - QtGui.QDialog.__init__(self) - self.app = app - self.ui = Ui_LogWindow() - self.ui.setupUi(self) - if self.isLoadable(): - self.loadSettings() - self.connect(OVELogger.Inst(), QtCore.SIGNAL("logUpdated()"), self.logUpdated) - self.connect(self.ui.buttonBox, QtCore.SIGNAL("clicked(QAbstractButton *)"), self.xon_actionButton_Box_clicked) - - def xon_actionButton_Box_clicked(self, button): - role = self.ui.buttonBox.buttonRole(button) - if role == QtGui.QDialogButtonBox.ResetRole: - OVELogger.Inst().reset() - OVELog("Log reset") - - def logUpdated(self): - self.ui.textBrowser.setText("\n".join(OVELogger.Inst().contents)) - self.ui.textBrowser.moveCursor(QtGui.QTextCursor.End) - self.ui.textBrowser.ensureCursorVisible() - - def saveSettings(self): - key = self.LOAD_KEY - settings = QtCore.QSettings() - settings.setValue(key+"/loadable", QVariant(True)) - settings.setValue(key+"/pos", QVariant(self.pos())) - settings.setValue(key+"/size", QVariant(self.size())) - settings.setValue(key+"/visible", QVariant(self.isVisible())) - - def loadSettings(self): - key = self.LOAD_KEY - settings = QtCore.QSettings() - pos = settings.value(key+"/pos", QVariant(QtCore.QPoint(200, 200))).toPoint() - size = settings.value(key+"/size", QVariant(QtCore.QSize(400, 400))).toSize() - visible = settings.value(key+"/visible", QVariant(True)).toBool() - self.resize(size) - self.move(pos) - self.setVisible(visible) - - @classmethod - def isLoadable(cls): - key = cls.LOAD_KEY - settings = QtCore.QSettings() - return settings.value(key+"/loadable", QVariant(False)).toBool() diff --git a/ovsdb/ovsdbmonitor/OVELogger.py b/ovsdb/ovsdbmonitor/OVELogger.py deleted file mode 100644 index 5f39762de..000000000 --- a/ovsdb/ovsdbmonitor/OVELogger.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from OVEStandard import * - -class OVELogger(QtCore.QObject): - instance = None - def __init__(self): - QtCore.QObject.__init__(self) - self.contents = [] - self.loggers = [] - - @classmethod - def Inst(cls): - if cls.instance is None: - cls.instance = OVELogger() - return cls.instance - - def reset(self): - self.contents = [] - self.update() - - def logString(self, message): - self.contents += [str(message)] - if len(self.contents) > 500: - self.contents = ['+++ Log truncated', ''] + self.contents[50:] - self.update() - - def update(self): - self.emit(QtCore.SIGNAL("logUpdated()")) - -def OVELog(message): - OVELogger.Inst().logString(message) - diff --git a/ovsdb/ovsdbmonitor/OVEMainWindow.py b/ovsdb/ovsdbmonitor/OVEMainWindow.py deleted file mode 100644 index 8d3d8304a..000000000 --- a/ovsdb/ovsdbmonitor/OVEMainWindow.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from OVEStandard import * -from OVEConfig import * -from OVEFetch import * -from OVELogger import * -from OVEUtil import * - -from OVECommonWindow import * - -from Ui_MainWindow import * - -class OVEMainWindow(QtGui.QMainWindow, OVECommonWindow): - LOAD_KEY = 'MainWindow/window' - BASE_REF=100000 - - def __init__(self, app, loadIndex = None): - QtGui.QMainWindow.__init__(self) - self.ui = Ui_MainWindow() - OVECommonWindow.__init__(self, app, loadIndex) - - def xon_tabWidget_currentChanged(self, value): - self.deleteCurrentTable() - OVECommonWindow.xon_tabWidget_currentChanged(self, value) - - def updateTable(self): - if self.hostUuid == '': - self.setWindowTitle('OVS Database') - self.deleteCurrentTable() - self.statusBar().showMessage('No host selected. Choose File->Preferences to add a host') - else: - config = OVEConfig.Inst().hostFromUuid(self.hostUuid) - self.setWindowTitle('OVS Database - '+config.get('address', '')) - self.invalidateCurrentTable('Fetching data...') - tabName = self.ui.tabWidget.currentWidget().objectName() - try: - self.setFetchSkip() - self.currentRef += 1 - OVEFetch.Inst(self.hostUuid).getTable(self, tabName, self.currentRef) - except Exception, e: - OVELog("Error fetching data: "+str(e)) - self.invalidateCurrentTable(str(e)) - - def timerEvent(self, event): - OVECommonWindow.timerEvent(self, event) - - def customEvent(self, event): - OVECommonWindow.customEvent(self, event) - - def handleFetchEvent(self, ref, values): - tabName = self.ui.tabWidget.currentWidget().objectName() - self.structToTable(getattr(self.ui, str(tabName)+'Table'), values) - - def handleFetchFailEvent(self, ref, message): - self.invalidateCurrentTable(str(message)) - - def structToTable(self, table, values): - - table.setUpdatesEnabled(False) - table.setSortingEnabled(False) - - for result in values: - rowNum = 0 - table.setRowCount(len(result['rows'])) - for row in result['rows']: - table.setColumnCount(len(row)) - colNum=0 - for k in sorted(row.keys()): - v = row[k] - headerItem = QtGui.QTableWidgetItem(k) - table.setHorizontalHeaderItem(colNum, headerItem) - text = OVEUtil.paramToString(v) - item = QtGui.QTableWidgetItem(text) - longText = OVEUtil.paramToLongString(v) - item.setToolTip(longText) - - table.setItem(rowNum, colNum, item) - colNum+=1 - - rowNum+=1 - - for i in range(0, table.columnCount()): - table.resizeColumnToContents(i) - for i in range(0, table.rowCount()): - table.resizeRowToContents(i) - - # table.setSortingEnabled(True) - table.setUpdatesEnabled(True) - - message = 'Updated at '+str(QtCore.QTime.currentTime().toString()) - if table.rowCount() == 0: - message += ' - Table is empty' - self.statusBar().showMessage(message) - - def invalidateCurrentTable(self, message): - tabName = self.ui.tabWidget.currentWidget().objectName() - self.invalidateTable(getattr(self.ui, str(tabName)+'Table'), message) - - def invalidateTable(self, table, message): - table.setUpdatesEnabled(False) - table.setSortingEnabled(False) - - for rowNum in range(0, table.rowCount()): - for colNum in range(0, table.columnCount()): - item = table.takeItem(rowNum, colNum) - if item is not None: - item.setForeground(Qt.darkGray) - table.setItem(rowNum, colNum, item) - self.statusBar().showMessage(message) - # table.setSortingEnabled(True) - table.setUpdatesEnabled(True) - - def deleteCurrentTable(self): - tabName = self.ui.tabWidget.currentWidget().objectName() - self.deleteTable(getattr(self.ui, str(tabName)+'Table')) - - def deleteTable(self, table): - table.clear() - table.setRowCount(0) - table.setColumnCount(0) - - def saveSettings(self, index): - settings = OVECommonWindow.saveSettings(self, index) - - def loadSettings(self, index): - settings = OVECommonWindow.loadSettings(self, index) diff --git a/ovsdb/ovsdbmonitor/OVEStandard.py b/ovsdb/ovsdbmonitor/OVEStandard.py deleted file mode 100644 index c55a881c6..000000000 --- a/ovsdb/ovsdbmonitor/OVEStandard.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) 2011 Nicira, Inc. -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os, re, struct, sys, time, types, uuid -from copy import deepcopy -from pprint import pprint - -# Set globalForcePySide to True to use PySide instead of PyQt if both are installed -globalForcePySide = False - -try: - import ovs.json -except Exception, e: - print('+++ OVS JSON module is required\n') - raise - -try: - if globalForcePySide: - print('Forcing use of PySide') - raise Exception() - from PyQt4.QtCore import Qt, QVariant - from PyQt4 import QtCore, QtGui -except: - try: - from PySide.QtCore import Qt, QVariant - from PySide import QtCore, QtGui - except Exception, e: - print('+++ This application requires either PyQt4 or PySide\n') - raise - diff --git a/ovsdb/ovsdbmonitor/OVEUtil.py b/ovsdb/ovsdbmonitor/OVEUtil.py deleted file mode 100644 index d1b069264..000000000 --- a/ovsdb/ovsdbmonitor/OVEUtil.py +++ /dev/null @@ -1,135 +0,0 @@ -# Copyright (c) 2011 Nicira, Inc. -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from OVEStandard import * - -from OVEConfig import * -import re - -class OVEUtil: - UUID_RE = re.compile(r'([a-f0-9]{8}-[a-f0-9]{2})[a-f0-9]{2}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}') - - @classmethod - def paramToLongString(cls, param): - if isinstance(param, (types.ListType, types.TupleType)) and len(param) > 1: - text = str(param[1]) - else: - text = str(param) - - return text.replace(', ', ',\n') - - @classmethod - def paramToString(cls, param): - if isinstance(param, (types.ListType, types.TupleType)) and len(param) > 1: - text = str(param[1]) - else: - text = str(param) - if OVEConfig.Inst().truncateUuids: - text = cls.UUID_RE.sub('\\1...', text) - - return text.replace(', ', ',\n') - - @classmethod - def flowDecodeHeadings(self): - return [ - 'Type', - 'Proto', - 'Inport', - 'VLAN', - 'Source MAC', - 'Destination MAC', - 'Source IP', - 'Destination IP', - 'Src port', - 'Dest port', - 'Packet count', - 'Bytes', - 'Used', - 'Tos', - 'PCP', - 'Tunnel', - 'Actions', - ] - - @classmethod - def getFlowColumn(cls, name): - lowerName = name.lower() - for i, columnName in enumerate(cls.flowDecodeHeadings()): - if lowerName == columnName.lower(): - return i - return None - - ETHERTYPE_TRANS = { - '05ff':'ESX probe', - '0800':'IP', - '0806':'ARP', - '86dd':'IPv6', - '88cc':'LLDP' - } - - ETHERPROTO_TRANS = { - '1':'ICMP', - '6':'TCP', - '17':'UDP' - } - - # Parsing of ovs-dpctl dump-flows output should be localised in this method and flowDecodeHeadings - @classmethod - def decodeFlows(cls, srcLines): - retVal = [] - for line in srcLines.split('\n'): - if line != '': - fields = {} - for name, val in re.findall(r'([a-zA-Z0-9_+]+)\(([^)]+)\)', line): - if '=' in val: - for setting in val.split(','): - k,v = setting.split('=') - fields['%s.%s' % (name, k)] = v - else: - fields[name] = val - for setting in re.split(', ', line)[1:]: - if ':' in setting: - k,v = setting.split(':') - fields[k] = v - - tun_id = fields.get('tun_id', '') - in_port = int(fields.get('in_port', 0)) - eth_src = fields.get('eth.src', '') - eth_dst = fields.get('eth.dst', '') - vlan_vid = int(fields.get('vlan.vid', 0)) - vlan_pcp = int(fields.get('vlan.pcp', 0)) - eth_type = fields.get('eth_type', '') - ip_src = fields.get('ipv4.src', fields.get('ipv6.src', '')) - ip_dst = fields.get('ipv4.dst', fields.get('ipv6.dst', '')) - ip_proto = fields.get('ipv4.proto', fields.get('ipv6.proto', '')) - ip_tos = fields.get('ipv4.tos', fields.get('ipv6.tos', '')) - tp_src = fields.get('tcp.src', fields.get('udp.src', fields.get('arp.sip', fields.get('icmp.type', fields.get('icmpv6.type', ''))))) - tp_dst = fields.get('tcp.dst', fields.get('udp.dst', fields.get('arp.tip', fields.get('icmp.code', fields.get('icmpv6.code', ''))))) - - packets = fields.get('packets', '') - bytes = fields.get('bytes', '') - actions = fields.get('actions', '') - used = fields.get('used', '') - - # Order below needs to match that in flowDecodeHeadings - retVal.append((eth_type, ip_proto, in_port, vlan_vid, eth_src, eth_dst, ip_src, ip_dst, tp_src, tp_dst, packets, bytes, used, ip_tos, vlan_pcp, tun_id, actions)) - - return retVal - - COLOURS = [Qt.black, Qt.darkBlue, Qt.darkRed, Qt.darkGreen, Qt.darkMagenta, Qt.darkCyan, Qt.darkGray, Qt.darkYellow, Qt.blue, Qt.gray, Qt.magenta, Qt.red] - - @classmethod - def intToColour(cls, value): - return cls.COLOURS[value % len(cls.COLOURS)] diff --git a/ovsdb/ovsdbmonitor/Ui_ConfigWindow.py b/ovsdb/ovsdbmonitor/Ui_ConfigWindow.py deleted file mode 100644 index 461edc59d..000000000 --- a/ovsdb/ovsdbmonitor/Ui_ConfigWindow.py +++ /dev/null @@ -1,106 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'ConfigWindow.ui' -# -# Created: Fri May 7 17:20:33 2010 -# by: PyQt4 UI code generator 4.4.2 -# -# WARNING! All changes made in this file will be lost! - -try: - from OVEStandard import globalForcePySide - if globalForcePySide: raise Exception() - from PyQt4 import QtCore, QtGui -except: - from PySide import QtCore, QtGui - -class Ui_ConfigWindow(object): - def setupUi(self, ConfigWindow): - ConfigWindow.setObjectName("ConfigWindow") - ConfigWindow.resize(386,303) - ConfigWindow.setFocusPolicy(QtCore.Qt.TabFocus) - self.gridLayout = QtGui.QGridLayout(ConfigWindow) - self.gridLayout.setObjectName("gridLayout") - self.verticalLayout = QtGui.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") - self.tabWidget = QtGui.QTabWidget(ConfigWindow) - self.tabWidget.setObjectName("tabWidget") - self.hosts = QtGui.QWidget() - self.hosts.setObjectName("hosts") - self.layoutWidget = QtGui.QWidget(self.hosts) - self.layoutWidget.setGeometry(QtCore.QRect(10,10,341,194)) - self.layoutWidget.setObjectName("layoutWidget") - self.horizontalLayout_2 = QtGui.QHBoxLayout(self.layoutWidget) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.hostList = QtGui.QListWidget(self.layoutWidget) - self.hostList.setObjectName("hostList") - self.horizontalLayout_2.addWidget(self.hostList) - self.verticalLayout_2 = QtGui.QVBoxLayout() - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.hostAddButton = QtGui.QPushButton(self.layoutWidget) - self.hostAddButton.setObjectName("hostAddButton") - self.verticalLayout_2.addWidget(self.hostAddButton) - self.hostEditButton = QtGui.QPushButton(self.layoutWidget) - self.hostEditButton.setObjectName("hostEditButton") - self.verticalLayout_2.addWidget(self.hostEditButton) - self.hostDeleteButton = QtGui.QPushButton(self.layoutWidget) - self.hostDeleteButton.setObjectName("hostDeleteButton") - self.verticalLayout_2.addWidget(self.hostDeleteButton) - spacerItem = QtGui.QSpacerItem(20,40,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding) - self.verticalLayout_2.addItem(spacerItem) - self.horizontalLayout_2.addLayout(self.verticalLayout_2) - self.tabWidget.addTab(self.hosts,"") - self.logging = QtGui.QWidget() - self.logging.setObjectName("logging") - self.gridLayout_2 = QtGui.QGridLayout(self.logging) - self.gridLayout_2.setObjectName("gridLayout_2") - self.logTrafficCheckBox = QtGui.QCheckBox(self.logging) - self.logTrafficCheckBox.setObjectName("logTrafficCheckBox") - self.gridLayout_2.addWidget(self.logTrafficCheckBox,0,0,1,1) - spacerItem1 = QtGui.QSpacerItem(20,164,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding) - self.gridLayout_2.addItem(spacerItem1,1,0,1,1) - self.tabWidget.addTab(self.logging,"") - self.view = QtGui.QWidget() - self.view.setObjectName("view") - self.verticalLayout_3 = QtGui.QVBoxLayout(self.view) - self.verticalLayout_3.setObjectName("verticalLayout_3") - self.truncateUuidsCheckBox = QtGui.QCheckBox(self.view) - self.truncateUuidsCheckBox.setObjectName("truncateUuidsCheckBox") - self.verticalLayout_3.addWidget(self.truncateUuidsCheckBox) - spacerItem2 = QtGui.QSpacerItem(20,164,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding) - self.verticalLayout_3.addItem(spacerItem2) - self.tabWidget.addTab(self.view,"") - self.verticalLayout.addWidget(self.tabWidget) - self.horizontalLayout = QtGui.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - spacerItem3 = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem3) - self.buttonBox = QtGui.QDialogButtonBox(ConfigWindow) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Apply|QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName("buttonBox") - self.horizontalLayout.addWidget(self.buttonBox) - self.verticalLayout.addLayout(self.horizontalLayout) - self.gridLayout.addLayout(self.verticalLayout,0,0,1,1) - - self.retranslateUi(ConfigWindow) - self.tabWidget.setCurrentIndex(0) - QtCore.QMetaObject.connectSlotsByName(ConfigWindow) - ConfigWindow.setTabOrder(self.hostList,self.hostAddButton) - ConfigWindow.setTabOrder(self.hostAddButton,self.hostEditButton) - ConfigWindow.setTabOrder(self.hostEditButton,self.hostDeleteButton) - ConfigWindow.setTabOrder(self.hostDeleteButton,self.buttonBox) - ConfigWindow.setTabOrder(self.buttonBox,self.tabWidget) - - def retranslateUi(self, ConfigWindow): - ConfigWindow.setWindowTitle(QtGui.QApplication.translate("ConfigWindow", "OVSDB Monitor Configuration", None, QtGui.QApplication.UnicodeUTF8)) - self.hostAddButton.setText(QtGui.QApplication.translate("ConfigWindow", "Add", None, QtGui.QApplication.UnicodeUTF8)) - self.hostEditButton.setText(QtGui.QApplication.translate("ConfigWindow", "Edit", None, QtGui.QApplication.UnicodeUTF8)) - self.hostDeleteButton.setText(QtGui.QApplication.translate("ConfigWindow", "Delete", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.hosts), QtGui.QApplication.translate("ConfigWindow", "Hosts", None, QtGui.QApplication.UnicodeUTF8)) - self.logTrafficCheckBox.setToolTip(QtGui.QApplication.translate("ConfigWindow", "Whether to log traffic exchanges in the log window", None, QtGui.QApplication.UnicodeUTF8)) - self.logTrafficCheckBox.setText(QtGui.QApplication.translate("ConfigWindow", "Log traffic", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.logging), QtGui.QApplication.translate("ConfigWindow", "Logging", None, QtGui.QApplication.UnicodeUTF8)) - self.truncateUuidsCheckBox.setToolTip(QtGui.QApplication.translate("ConfigWindow", "Replaces UUIDs with a shorter string of the first few characters. The tooltip still contains the full value", None, QtGui.QApplication.UnicodeUTF8)) - self.truncateUuidsCheckBox.setText(QtGui.QApplication.translate("ConfigWindow", "Truncate UUIDs", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.view), QtGui.QApplication.translate("ConfigWindow", "View", None, QtGui.QApplication.UnicodeUTF8)) - diff --git a/ovsdb/ovsdbmonitor/Ui_FlowWindow.py b/ovsdb/ovsdbmonitor/Ui_FlowWindow.py deleted file mode 100644 index 351a0ca10..000000000 --- a/ovsdb/ovsdbmonitor/Ui_FlowWindow.py +++ /dev/null @@ -1,136 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'FlowWindow.ui' -# -# Created: Fri May 7 17:20:33 2010 -# by: PyQt4 UI code generator 4.4.2 -# -# WARNING! All changes made in this file will be lost! - -try: - from OVEStandard import globalForcePySide - if globalForcePySide: raise Exception() - from PyQt4 import QtCore, QtGui -except: - from PySide import QtCore, QtGui - -class Ui_FlowWindow(object): - def setupUi(self, FlowWindow): - FlowWindow.setObjectName("FlowWindow") - FlowWindow.resize(800,600) - self.centralwidget = QtGui.QWidget(FlowWindow) - self.centralwidget.setObjectName("centralwidget") - self.gridLayout = QtGui.QGridLayout(self.centralwidget) - self.gridLayout.setObjectName("gridLayout") - self.tabWidget = QtGui.QTabWidget(self.centralwidget) - self.tabWidget.setObjectName("tabWidget") - self.unset = QtGui.QWidget() - self.unset.setObjectName("unset") - self.gridLayout_10 = QtGui.QGridLayout(self.unset) - self.gridLayout_10.setObjectName("gridLayout_10") - self.tabWidget.addTab(self.unset,"") - self.gridLayout.addWidget(self.tabWidget,0,0,1,1) - self.horizontalLayout_2 = QtGui.QHBoxLayout() - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.ssgCheckBox = QtGui.QCheckBox(self.centralwidget) - self.ssgCheckBox.setObjectName("ssgCheckBox") - self.horizontalLayout_2.addWidget(self.ssgCheckBox) - self.ssgComboBox = QtGui.QComboBox(self.centralwidget) - self.ssgComboBox.setEditable(True) - self.ssgComboBox.setMaxVisibleItems(20) - self.ssgComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert) - self.ssgComboBox.setMinimumContentsLength(32) - self.ssgComboBox.setObjectName("ssgComboBox") - self.horizontalLayout_2.addWidget(self.ssgComboBox) - self.ssgSaveButton = QtGui.QPushButton(self.centralwidget) - self.ssgSaveButton.setObjectName("ssgSaveButton") - self.horizontalLayout_2.addWidget(self.ssgSaveButton) - self.ssgDeleteButton = QtGui.QPushButton(self.centralwidget) - self.ssgDeleteButton.setObjectName("ssgDeleteButton") - self.horizontalLayout_2.addWidget(self.ssgDeleteButton) - spacerItem = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum) - self.horizontalLayout_2.addItem(spacerItem) - self.gridLayout.addLayout(self.horizontalLayout_2,1,0,1,1) - self.horizontalLayout = QtGui.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.hostLabel = QtGui.QLabel(self.centralwidget) - self.hostLabel.setObjectName("hostLabel") - self.horizontalLayout.addWidget(self.hostLabel) - self.hostComboBox = QtGui.QComboBox(self.centralwidget) - self.hostComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) - self.hostComboBox.setObjectName("hostComboBox") - self.horizontalLayout.addWidget(self.hostComboBox) - self.intervalCheckBox = QtGui.QCheckBox(self.centralwidget) - self.intervalCheckBox.setObjectName("intervalCheckBox") - self.horizontalLayout.addWidget(self.intervalCheckBox) - self.intervalSpinBox = QtGui.QSpinBox(self.centralwidget) - self.intervalSpinBox.setMinimum(1) - self.intervalSpinBox.setMaximum(1000000) - self.intervalSpinBox.setObjectName("intervalSpinBox") - self.horizontalLayout.addWidget(self.intervalSpinBox) - spacerItem1 = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem1) - self.fetchPathsButton = QtGui.QPushButton(self.centralwidget) - self.fetchPathsButton.setObjectName("fetchPathsButton") - self.horizontalLayout.addWidget(self.fetchPathsButton) - self.fetchButton = QtGui.QPushButton(self.centralwidget) - self.fetchButton.setObjectName("fetchButton") - self.horizontalLayout.addWidget(self.fetchButton) - self.gridLayout.addLayout(self.horizontalLayout,3,0,1,1) - self.line = QtGui.QFrame(self.centralwidget) - self.line.setFrameShape(QtGui.QFrame.HLine) - self.line.setFrameShadow(QtGui.QFrame.Sunken) - self.line.setObjectName("line") - self.gridLayout.addWidget(self.line,2,0,1,1) - FlowWindow.setCentralWidget(self.centralwidget) - self.menubar = QtGui.QMenuBar(FlowWindow) - self.menubar.setGeometry(QtCore.QRect(0,0,800,28)) - self.menubar.setObjectName("menubar") - self.menuFile = QtGui.QMenu(self.menubar) - self.menuFile.setObjectName("menuFile") - FlowWindow.setMenuBar(self.menubar) - self.statusbar = QtGui.QStatusBar(FlowWindow) - self.statusbar.setObjectName("statusbar") - FlowWindow.setStatusBar(self.statusbar) - self.actionShow_Log = QtGui.QAction(FlowWindow) - self.actionShow_Log.setObjectName("actionShow_Log") - self.actionNew_DB_Window = QtGui.QAction(FlowWindow) - self.actionNew_DB_Window.setObjectName("actionNew_DB_Window") - self.actionPreferences = QtGui.QAction(FlowWindow) - self.actionPreferences.setObjectName("actionPreferences") - self.actionQuit = QtGui.QAction(FlowWindow) - self.actionQuit.setObjectName("actionQuit") - self.actionNew_Flow_Window = QtGui.QAction(FlowWindow) - self.actionNew_Flow_Window.setObjectName("actionNew_Flow_Window") - self.menuFile.addAction(self.actionNew_DB_Window) - self.menuFile.addAction(self.actionNew_Flow_Window) - self.menuFile.addAction(self.actionShow_Log) - self.menuFile.addAction(self.actionPreferences) - self.menuFile.addSeparator() - self.menuFile.addAction(self.actionQuit) - self.menubar.addAction(self.menuFile.menuAction()) - self.hostLabel.setBuddy(self.hostComboBox) - - self.retranslateUi(FlowWindow) - self.tabWidget.setCurrentIndex(0) - QtCore.QMetaObject.connectSlotsByName(FlowWindow) - - def retranslateUi(self, FlowWindow): - FlowWindow.setWindowTitle(QtGui.QApplication.translate("FlowWindow", "OVSDB Monitor", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.unset), QtGui.QApplication.translate("FlowWindow", "Awaiting update...", None, QtGui.QApplication.UnicodeUTF8)) - self.ssgCheckBox.setText(QtGui.QApplication.translate("FlowWindow", "Server-side grep", None, QtGui.QApplication.UnicodeUTF8)) - self.ssgSaveButton.setText(QtGui.QApplication.translate("FlowWindow", "Save", None, QtGui.QApplication.UnicodeUTF8)) - self.ssgDeleteButton.setText(QtGui.QApplication.translate("FlowWindow", "Delete", None, QtGui.QApplication.UnicodeUTF8)) - self.hostLabel.setText(QtGui.QApplication.translate("FlowWindow", "Host", None, QtGui.QApplication.UnicodeUTF8)) - self.intervalCheckBox.setText(QtGui.QApplication.translate("FlowWindow", "Auto-refetch every", None, QtGui.QApplication.UnicodeUTF8)) - self.intervalSpinBox.setSuffix(QtGui.QApplication.translate("FlowWindow", "s", None, QtGui.QApplication.UnicodeUTF8)) - self.fetchPathsButton.setToolTip(QtGui.QApplication.translate("FlowWindow", "Refetches the datapath names and rebuilds the window tabs to reflect them. Use when the network has been reconfigured, e.g. a bond has been created", None, QtGui.QApplication.UnicodeUTF8)) - self.fetchPathsButton.setText(QtGui.QApplication.translate("FlowWindow", "Refetch Datapath List", None, QtGui.QApplication.UnicodeUTF8)) - self.fetchButton.setText(QtGui.QApplication.translate("FlowWindow", "Refetch", None, QtGui.QApplication.UnicodeUTF8)) - self.menuFile.setTitle(QtGui.QApplication.translate("FlowWindow", "File", None, QtGui.QApplication.UnicodeUTF8)) - self.actionShow_Log.setText(QtGui.QApplication.translate("FlowWindow", "Show Log", None, QtGui.QApplication.UnicodeUTF8)) - self.actionNew_DB_Window.setText(QtGui.QApplication.translate("FlowWindow", "New DB Window", None, QtGui.QApplication.UnicodeUTF8)) - self.actionPreferences.setText(QtGui.QApplication.translate("FlowWindow", "Preferences", None, QtGui.QApplication.UnicodeUTF8)) - self.actionQuit.setText(QtGui.QApplication.translate("FlowWindow", "Quit", None, QtGui.QApplication.UnicodeUTF8)) - self.actionNew_Flow_Window.setText(QtGui.QApplication.translate("FlowWindow", "New Flow Window", None, QtGui.QApplication.UnicodeUTF8)) - diff --git a/ovsdb/ovsdbmonitor/Ui_HostWindow.py b/ovsdb/ovsdbmonitor/Ui_HostWindow.py deleted file mode 100644 index 3cab49dfb..000000000 --- a/ovsdb/ovsdbmonitor/Ui_HostWindow.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'HostWindow.ui' -# -# Created: Fri May 7 17:20:33 2010 -# by: PyQt4 UI code generator 4.4.2 -# -# WARNING! All changes made in this file will be lost! - -try: - from OVEStandard import globalForcePySide - if globalForcePySide: raise Exception() - from PyQt4 import QtCore, QtGui -except: - from PySide import QtCore, QtGui - -class Ui_HostWindow(object): - def setupUi(self, HostWindow): - HostWindow.setObjectName("HostWindow") - HostWindow.setWindowModality(QtCore.Qt.WindowModal) - HostWindow.resize(400,300) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(HostWindow.sizePolicy().hasHeightForWidth()) - HostWindow.setSizePolicy(sizePolicy) - self.gridLayout_2 = QtGui.QGridLayout(HostWindow) - self.gridLayout_2.setObjectName("gridLayout_2") - self.gridLayout = QtGui.QGridLayout() - self.gridLayout.setObjectName("gridLayout") - self.label = QtGui.QLabel(HostWindow) - self.label.setObjectName("label") - self.gridLayout.addWidget(self.label,0,0,1,1) - self.hostAddressEdit = QtGui.QLineEdit(HostWindow) - self.hostAddressEdit.setMinimumSize(QtCore.QSize(256,0)) - self.hostAddressEdit.setObjectName("hostAddressEdit") - self.gridLayout.addWidget(self.hostAddressEdit,0,1,1,1) - self.label_2 = QtGui.QLabel(HostWindow) - self.label_2.setObjectName("label_2") - self.gridLayout.addWidget(self.label_2,1,0,1,1) - self.hostPasswordEdit = QtGui.QLineEdit(HostWindow) - self.hostPasswordEdit.setMinimumSize(QtCore.QSize(256,0)) - self.hostPasswordEdit.setEchoMode(QtGui.QLineEdit.Password) - self.hostPasswordEdit.setObjectName("hostPasswordEdit") - self.gridLayout.addWidget(self.hostPasswordEdit,1,1,1,1) - self.label_3 = QtGui.QLabel(HostWindow) - self.label_3.setObjectName("label_3") - self.gridLayout.addWidget(self.label_3,2,0,1,1) - self.hostConnectTarget = QtGui.QLineEdit(HostWindow) - self.hostConnectTarget.setMinimumSize(QtCore.QSize(256,0)) - self.hostConnectTarget.setObjectName("hostConnectTarget") - self.gridLayout.addWidget(self.hostConnectTarget,2,1,1,1) - self.gridLayout_2.addLayout(self.gridLayout,0,0,1,1) - self.buttonBox = QtGui.QDialogButtonBox(HostWindow) - self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName("buttonBox") - self.gridLayout_2.addWidget(self.buttonBox,1,0,1,1) - self.label.setBuddy(self.hostAddressEdit) - self.label_2.setBuddy(self.hostPasswordEdit) - self.label_3.setBuddy(self.hostConnectTarget) - - self.retranslateUi(HostWindow) - QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("accepted()"),HostWindow.accept) - QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("rejected()"),HostWindow.reject) - QtCore.QMetaObject.connectSlotsByName(HostWindow) - HostWindow.setTabOrder(self.hostAddressEdit,self.hostPasswordEdit) - HostWindow.setTabOrder(self.hostPasswordEdit,self.buttonBox) - - def retranslateUi(self, HostWindow): - HostWindow.setWindowTitle(QtGui.QApplication.translate("HostWindow", "Host Properties", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("HostWindow", "Host name or IP", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setText(QtGui.QApplication.translate("HostWindow", "SSH Password", None, QtGui.QApplication.UnicodeUTF8)) - self.label_3.setText(QtGui.QApplication.translate("HostWindow", "Connect target", None, QtGui.QApplication.UnicodeUTF8)) - diff --git a/ovsdb/ovsdbmonitor/Ui_LogWindow.py b/ovsdb/ovsdbmonitor/Ui_LogWindow.py deleted file mode 100644 index 0ddd651e7..000000000 --- a/ovsdb/ovsdbmonitor/Ui_LogWindow.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'LogWindow.ui' -# -# Created: Fri May 7 17:20:33 2010 -# by: PyQt4 UI code generator 4.4.2 -# -# WARNING! All changes made in this file will be lost! - -try: - from OVEStandard import globalForcePySide - if globalForcePySide: raise Exception() - from PyQt4 import QtCore, QtGui -except: - from PySide import QtCore, QtGui - -class Ui_LogWindow(object): - def setupUi(self, LogWindow): - LogWindow.setObjectName("LogWindow") - LogWindow.resize(735,558) - self.gridLayout = QtGui.QGridLayout(LogWindow) - self.gridLayout.setObjectName("gridLayout") - self.verticalLayout = QtGui.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") - self.textBrowser = QtGui.QTextBrowser(LogWindow) - self.textBrowser.setObjectName("textBrowser") - self.verticalLayout.addWidget(self.textBrowser) - self.buttonBox = QtGui.QDialogButtonBox(LogWindow) - self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.Reset) - self.buttonBox.setObjectName("buttonBox") - self.verticalLayout.addWidget(self.buttonBox) - self.gridLayout.addLayout(self.verticalLayout,0,0,1,1) - - self.retranslateUi(LogWindow) - QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("accepted()"),LogWindow.accept) - QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("rejected()"),LogWindow.reject) - QtCore.QMetaObject.connectSlotsByName(LogWindow) - - def retranslateUi(self, LogWindow): - LogWindow.setWindowTitle(QtGui.QApplication.translate("LogWindow", "OVSDB Monitor Log", None, QtGui.QApplication.UnicodeUTF8)) - diff --git a/ovsdb/ovsdbmonitor/Ui_MainWindow.py b/ovsdb/ovsdbmonitor/Ui_MainWindow.py deleted file mode 100644 index ee5780582..000000000 --- a/ovsdb/ovsdbmonitor/Ui_MainWindow.py +++ /dev/null @@ -1,222 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file '../ovsdb/ovsdbmonitor/MainWindow.ui' -# -# Created: Mon May 17 16:23:47 2010 -# by: PyQt4 UI code generator 4.7.3 -# -# WARNING! All changes made in this file will be lost! - - -try: - from OVEStandard import globalForcePySide - if globalForcePySide: - raise Exception() - from PyQt4 import QtCore, QtGui -except: - from PySide import QtCore, QtGui - -class Ui_MainWindow(object): - def setupUi(self, MainWindow): - MainWindow.setObjectName("MainWindow") - MainWindow.resize(800, 600) - self.centralwidget = QtGui.QWidget(MainWindow) - self.centralwidget.setObjectName("centralwidget") - self.gridLayout = QtGui.QGridLayout(self.centralwidget) - self.gridLayout.setObjectName("gridLayout") - self.verticalLayout = QtGui.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") - self.tabWidget = QtGui.QTabWidget(self.centralwidget) - self.tabWidget.setObjectName("tabWidget") - self.Bridge = QtGui.QWidget() - self.Bridge.setObjectName("Bridge") - self.gridLayout_2 = QtGui.QGridLayout(self.Bridge) - self.gridLayout_2.setObjectName("gridLayout_2") - self.BridgeTable = QtGui.QTableWidget(self.Bridge) - self.BridgeTable.setObjectName("BridgeTable") - self.BridgeTable.setColumnCount(0) - self.BridgeTable.setRowCount(0) - self.gridLayout_2.addWidget(self.BridgeTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.Bridge, "") - self.Controller = QtGui.QWidget() - self.Controller.setObjectName("Controller") - self.gridLayout_3 = QtGui.QGridLayout(self.Controller) - self.gridLayout_3.setObjectName("gridLayout_3") - self.ControllerTable = QtGui.QTableWidget(self.Controller) - self.ControllerTable.setObjectName("ControllerTable") - self.ControllerTable.setColumnCount(0) - self.ControllerTable.setRowCount(0) - self.gridLayout_3.addWidget(self.ControllerTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.Controller, "") - self.Interface = QtGui.QWidget() - self.Interface.setObjectName("Interface") - self.gridLayout_4 = QtGui.QGridLayout(self.Interface) - self.gridLayout_4.setObjectName("gridLayout_4") - self.InterfaceTable = QtGui.QTableWidget(self.Interface) - self.InterfaceTable.setObjectName("InterfaceTable") - self.InterfaceTable.setColumnCount(0) - self.InterfaceTable.setRowCount(0) - self.gridLayout_4.addWidget(self.InterfaceTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.Interface, "") - self.Mirror = QtGui.QWidget() - self.Mirror.setObjectName("Mirror") - self.gridLayout_5 = QtGui.QGridLayout(self.Mirror) - self.gridLayout_5.setObjectName("gridLayout_5") - self.MirrorTable = QtGui.QTableWidget(self.Mirror) - self.MirrorTable.setObjectName("MirrorTable") - self.MirrorTable.setColumnCount(0) - self.MirrorTable.setRowCount(0) - self.gridLayout_5.addWidget(self.MirrorTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.Mirror, "") - self.NetFlow = QtGui.QWidget() - self.NetFlow.setObjectName("NetFlow") - self.gridLayout_6 = QtGui.QGridLayout(self.NetFlow) - self.gridLayout_6.setObjectName("gridLayout_6") - self.NetFlowTable = QtGui.QTableWidget(self.NetFlow) - self.NetFlowTable.setObjectName("NetFlowTable") - self.NetFlowTable.setColumnCount(0) - self.NetFlowTable.setRowCount(0) - self.gridLayout_6.addWidget(self.NetFlowTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.NetFlow, "") - self.Open_vSwitch = QtGui.QWidget() - self.Open_vSwitch.setObjectName("Open_vSwitch") - self.gridLayout_7 = QtGui.QGridLayout(self.Open_vSwitch) - self.gridLayout_7.setObjectName("gridLayout_7") - self.Open_vSwitchTable = QtGui.QTableWidget(self.Open_vSwitch) - self.Open_vSwitchTable.setObjectName("Open_vSwitchTable") - self.Open_vSwitchTable.setColumnCount(0) - self.Open_vSwitchTable.setRowCount(0) - self.gridLayout_7.addWidget(self.Open_vSwitchTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.Open_vSwitch, "") - self.Port = QtGui.QWidget() - self.Port.setObjectName("Port") - self.gridLayout_8 = QtGui.QGridLayout(self.Port) - self.gridLayout_8.setObjectName("gridLayout_8") - self.PortTable = QtGui.QTableWidget(self.Port) - self.PortTable.setObjectName("PortTable") - self.PortTable.setColumnCount(0) - self.PortTable.setRowCount(0) - self.gridLayout_8.addWidget(self.PortTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.Port, "") - self.QoS = QtGui.QWidget() - self.QoS.setObjectName("QoS") - self.gridLayout_10 = QtGui.QGridLayout(self.QoS) - self.gridLayout_10.setObjectName("gridLayout_10") - self.QoSTable = QtGui.QTableWidget(self.QoS) - self.QoSTable.setObjectName("QoSTable") - self.QoSTable.setColumnCount(0) - self.QoSTable.setRowCount(0) - self.gridLayout_10.addWidget(self.QoSTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.QoS, "") - self.Queue = QtGui.QWidget() - self.Queue.setObjectName("Queue") - self.gridLayout_11 = QtGui.QGridLayout(self.Queue) - self.gridLayout_11.setObjectName("gridLayout_11") - self.QueueTable = QtGui.QTableWidget(self.Queue) - self.QueueTable.setObjectName("QueueTable") - self.QueueTable.setColumnCount(0) - self.QueueTable.setRowCount(0) - self.gridLayout_11.addWidget(self.QueueTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.Queue, "") - self.sFlow = QtGui.QWidget() - self.sFlow.setObjectName("sFlow") - self.gridLayout_9 = QtGui.QGridLayout(self.sFlow) - self.gridLayout_9.setObjectName("gridLayout_9") - self.sFlowTable = QtGui.QTableWidget(self.sFlow) - self.sFlowTable.setObjectName("sFlowTable") - self.sFlowTable.setColumnCount(0) - self.sFlowTable.setRowCount(0) - self.gridLayout_9.addWidget(self.sFlowTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.sFlow, "") - self.SSL = QtGui.QWidget() - self.SSL.setObjectName("SSL") - self.gridLayout_101 = QtGui.QGridLayout(self.SSL) - self.gridLayout_101.setObjectName("gridLayout_101") - self.SSLTable = QtGui.QTableWidget(self.SSL) - self.SSLTable.setObjectName("SSLTable") - self.SSLTable.setColumnCount(0) - self.SSLTable.setRowCount(0) - self.gridLayout_101.addWidget(self.SSLTable, 0, 0, 1, 1) - self.tabWidget.addTab(self.SSL, "") - self.verticalLayout.addWidget(self.tabWidget) - self.horizontalLayout = QtGui.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.hostLabel = QtGui.QLabel(self.centralwidget) - self.hostLabel.setObjectName("hostLabel") - self.horizontalLayout.addWidget(self.hostLabel) - self.hostComboBox = QtGui.QComboBox(self.centralwidget) - self.hostComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) - self.hostComboBox.setObjectName("hostComboBox") - self.horizontalLayout.addWidget(self.hostComboBox) - self.intervalCheckBox = QtGui.QCheckBox(self.centralwidget) - self.intervalCheckBox.setObjectName("intervalCheckBox") - self.horizontalLayout.addWidget(self.intervalCheckBox) - self.intervalSpinBox = QtGui.QSpinBox(self.centralwidget) - self.intervalSpinBox.setMinimum(1) - self.intervalSpinBox.setMaximum(1000000) - self.intervalSpinBox.setObjectName("intervalSpinBox") - self.horizontalLayout.addWidget(self.intervalSpinBox) - spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem) - self.fetchButton = QtGui.QPushButton(self.centralwidget) - self.fetchButton.setObjectName("fetchButton") - self.horizontalLayout.addWidget(self.fetchButton) - self.verticalLayout.addLayout(self.horizontalLayout) - self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1) - MainWindow.setCentralWidget(self.centralwidget) - self.menubar = QtGui.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 28)) - self.menubar.setObjectName("menubar") - self.menuFile = QtGui.QMenu(self.menubar) - self.menuFile.setObjectName("menuFile") - MainWindow.setMenuBar(self.menubar) - self.statusbar = QtGui.QStatusBar(MainWindow) - self.statusbar.setObjectName("statusbar") - MainWindow.setStatusBar(self.statusbar) - self.actionShow_Log = QtGui.QAction(MainWindow) - self.actionShow_Log.setObjectName("actionShow_Log") - self.actionNew_DB_Window = QtGui.QAction(MainWindow) - self.actionNew_DB_Window.setObjectName("actionNew_DB_Window") - self.actionPreferences = QtGui.QAction(MainWindow) - self.actionPreferences.setObjectName("actionPreferences") - self.actionQuit = QtGui.QAction(MainWindow) - self.actionQuit.setObjectName("actionQuit") - self.actionNew_Flow_Window = QtGui.QAction(MainWindow) - self.actionNew_Flow_Window.setObjectName("actionNew_Flow_Window") - self.menuFile.addAction(self.actionNew_DB_Window) - self.menuFile.addAction(self.actionNew_Flow_Window) - self.menuFile.addAction(self.actionShow_Log) - self.menuFile.addAction(self.actionPreferences) - self.menuFile.addSeparator() - self.menuFile.addAction(self.actionQuit) - self.menubar.addAction(self.menuFile.menuAction()) - self.hostLabel.setBuddy(self.hostComboBox) - - self.retranslateUi(MainWindow) - self.tabWidget.setCurrentIndex(0) - QtCore.QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "OVSDB Monitor", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.Bridge), QtGui.QApplication.translate("MainWindow", "Bridge", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.Controller), QtGui.QApplication.translate("MainWindow", "Controller", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.Interface), QtGui.QApplication.translate("MainWindow", "Interface", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.Mirror), QtGui.QApplication.translate("MainWindow", "Mirror", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.NetFlow), QtGui.QApplication.translate("MainWindow", "NetFlow", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.Open_vSwitch), QtGui.QApplication.translate("MainWindow", "Open_vSwitch", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.Port), QtGui.QApplication.translate("MainWindow", "Port", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.QoS), QtGui.QApplication.translate("MainWindow", "QoS", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.Queue), QtGui.QApplication.translate("MainWindow", "Queue", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.sFlow), QtGui.QApplication.translate("MainWindow", "sFlow", None, QtGui.QApplication.UnicodeUTF8)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.SSL), QtGui.QApplication.translate("MainWindow", "SSL", None, QtGui.QApplication.UnicodeUTF8)) - self.hostLabel.setText(QtGui.QApplication.translate("MainWindow", "Host", None, QtGui.QApplication.UnicodeUTF8)) - self.intervalCheckBox.setText(QtGui.QApplication.translate("MainWindow", "Auto-refetch every", None, QtGui.QApplication.UnicodeUTF8)) - self.intervalSpinBox.setSuffix(QtGui.QApplication.translate("MainWindow", "s", None, QtGui.QApplication.UnicodeUTF8)) - self.fetchButton.setText(QtGui.QApplication.translate("MainWindow", "Refetch", None, QtGui.QApplication.UnicodeUTF8)) - self.menuFile.setTitle(QtGui.QApplication.translate("MainWindow", "File", None, QtGui.QApplication.UnicodeUTF8)) - self.actionShow_Log.setText(QtGui.QApplication.translate("MainWindow", "Show Log", None, QtGui.QApplication.UnicodeUTF8)) - self.actionNew_DB_Window.setText(QtGui.QApplication.translate("MainWindow", "New DB Window", None, QtGui.QApplication.UnicodeUTF8)) - self.actionPreferences.setText(QtGui.QApplication.translate("MainWindow", "Preferences", None, QtGui.QApplication.UnicodeUTF8)) - self.actionQuit.setText(QtGui.QApplication.translate("MainWindow", "Quit", None, QtGui.QApplication.UnicodeUTF8)) - self.actionNew_Flow_Window.setText(QtGui.QApplication.translate("MainWindow", "New Flow Window", None, QtGui.QApplication.UnicodeUTF8)) - diff --git a/ovsdb/ovsdbmonitor/automake.mk b/ovsdb/ovsdbmonitor/automake.mk deleted file mode 100644 index 14da10b5c..000000000 --- a/ovsdb/ovsdbmonitor/automake.mk +++ /dev/null @@ -1,62 +0,0 @@ -ovsdbmonitor_pyfiles = \ - ovsdb/ovsdbmonitor/OVEApp.py \ - ovsdb/ovsdbmonitor/OVECommonWindow.py \ - ovsdb/ovsdbmonitor/OVEConfig.py \ - ovsdb/ovsdbmonitor/OVEConfigWindow.py \ - ovsdb/ovsdbmonitor/OVEFetch.py \ - ovsdb/ovsdbmonitor/OVEFlowWindow.py \ - ovsdb/ovsdbmonitor/OVEHostWindow.py \ - ovsdb/ovsdbmonitor/OVELogWindow.py \ - ovsdb/ovsdbmonitor/OVELogger.py \ - ovsdb/ovsdbmonitor/OVEMainWindow.py \ - ovsdb/ovsdbmonitor/OVEStandard.py \ - ovsdb/ovsdbmonitor/OVEUtil.py \ - ovsdb/ovsdbmonitor/Ui_ConfigWindow.py \ - ovsdb/ovsdbmonitor/Ui_FlowWindow.py \ - ovsdb/ovsdbmonitor/Ui_HostWindow.py \ - ovsdb/ovsdbmonitor/Ui_LogWindow.py \ - ovsdb/ovsdbmonitor/Ui_MainWindow.py \ - ovsdb/ovsdbmonitor/qt4reactor.py -EXTRA_DIST += \ - $(ovsdbmonitor_pyfiles) \ - ovsdb/ovsdbmonitor/COPYING \ - ovsdb/ovsdbmonitor/ConfigWindow.ui \ - ovsdb/ovsdbmonitor/FlowWindow.ui \ - ovsdb/ovsdbmonitor/HostWindow.ui \ - ovsdb/ovsdbmonitor/LogWindow.ui \ - ovsdb/ovsdbmonitor/MainWindow.ui \ - ovsdb/ovsdbmonitor/ovsdbmonitor.in \ - ovsdb/ovsdbmonitor/ovsdbmonitor.desktop -MAN_ROOTS += ovsdb/ovsdbmonitor/ovsdbmonitor.1 - -ovsdbmonitordir = ${datadir}/ovsdbmonitor -desktopdir = ${datadir}/applications -if BUILD_OVSDBMONITOR -noinst_SCRIPTS += ovsdb/ovsdbmonitor/ovsdbmonitor -ovsdbmonitor_DATA = $(ovsdbmonitor_pyfiles) -desktop_DATA = ovsdb/ovsdbmonitor/ovsdbmonitor.desktop -install-exec-hook: - sed -e '/NOINSTALL/d' < ovsdb/ovsdbmonitor/ovsdbmonitor > ovsdb/ovsdbmonitor/ovsdbmonitor.tmp - chmod +x ovsdb/ovsdbmonitor/ovsdbmonitor.tmp - $(INSTALL_PROGRAM) ovsdb/ovsdbmonitor/ovsdbmonitor.tmp $(DESTDIR)$(bindir)/ovsdbmonitor - rm ovsdb/ovsdbmonitor/ovsdbmonitor.tmp -DISTCLEANFILES += \ - ovsdb/ovsdbmonitor/ovsdbmonitor \ - ovsdb/ovsdbmonitor/ovsdbmonitor.tmp -man_MANS += ovsdb/ovsdbmonitor/ovsdbmonitor.1 -endif - -UNINSTALL_LOCAL += ovsdbmonitor-uninstall-local -ovsdbmonitor-uninstall-local: - rm -f $(DESTDIR)$(bindir)/ovsdbmonitor - -SUFFIXES += .ui .py -.ui.py: - $(PYUIC4) $< | sed 's/from PyQt4 import QtCore, QtGui/\ -try:\ - from OVEStandard import globalForcePySide\ - if globalForcePySide:\ - raise Exception()\ - from PyQt4 import QtCore, QtGui\ -except:\ - from PySide import QtCore, QtGui/' > $@ diff --git a/ovsdb/ovsdbmonitor/ovsdbmonitor.1 b/ovsdb/ovsdbmonitor/ovsdbmonitor.1 deleted file mode 100644 index aa2b0aac4..000000000 --- a/ovsdb/ovsdbmonitor/ovsdbmonitor.1 +++ /dev/null @@ -1,20 +0,0 @@ -.\" -*- nroff -*- -.TH ovsdbmonitor 1 "May 2011" "Open vSwitch" "Open vSwitch Manual" -. -.SH NAME -ovsdbmonitor \- GUI tool for monitoring Open vSwitch installations -. -.SH SYNOPSIS -\fBovsdbmonitor\fR -. -.SH DESCRIPTION -The \fBovsdbmonitor\fR program is a Qt-based GUI tool for monitoring -and troubleshooting Open vSwitch. It presents GUI tables that -graphically represent an Open vSwitch kernel flow table (similar to -\fBovs\-dpctl dump\-flows\fR) and Open vSwitch database contents -(similar to \fBovs\-vsctl list \fItable\fR). -.SH "SEE ALSO" -. -\fBovsdb\-server\fR(1), -\fBovsdb\-client\fR(1), -and the OVSDB specification. diff --git a/ovsdb/ovsdbmonitor/ovsdbmonitor.desktop b/ovsdb/ovsdbmonitor/ovsdbmonitor.desktop deleted file mode 100644 index b0f8253e3..000000000 --- a/ovsdb/ovsdbmonitor/ovsdbmonitor.desktop +++ /dev/null @@ -1,7 +0,0 @@ -[Desktop Entry] -Name=Open vSwitch DB Monitor -Comment=Monitor and troubleshoot local or remote Open vSwitch instances -Exec=ovsdbmonitor -Terminal=false -Type=Application -Categories=System;Monitor; diff --git a/ovsdb/ovsdbmonitor/ovsdbmonitor.in b/ovsdb/ovsdbmonitor/ovsdbmonitor.in deleted file mode 100755 index e26130a27..000000000 --- a/ovsdb/ovsdbmonitor/ovsdbmonitor.in +++ /dev/null @@ -1,39 +0,0 @@ -#! @PYTHON@ -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Version 1.51 -# 2010-05-07 - -import sys -sys.path.insert(0, "@ovsdbmonitordir@") -sys.path.insert(0, "@abs_top_srcdir@/ovsdb/ovsdbmonitor") # NOINSTALL - -import sys, traceback -from pprint import pprint -from OVEApp import * - -app = OVEApp() -try: - retVal = app.enter() -except Exception, e: - print str(e) - try: - trace = traceback.format_tb(sys.exc_info()[2]) - except: - trace = ['Traceback not available'] - print("".join(trace)) - retVal = 1 - -sys.exit(retVal) diff --git a/ovsdb/ovsdbmonitor/qt4reactor.py b/ovsdb/ovsdbmonitor/qt4reactor.py deleted file mode 100644 index 1379da7f0..000000000 --- a/ovsdb/ovsdbmonitor/qt4reactor.py +++ /dev/null @@ -1,331 +0,0 @@ -# Copyright (c) 2001-2008 Twisted Matrix Laboratories. -# See LICENSE for details. - -# The referred licence file contains: -# -#Copyright (c) 2001-2010 -#Allen Short -#Andy Gayton -#Andrew Bennetts -#Antoine Pitrou -#Apple Computer, Inc. -#Benjamin Bruheim -#Bob Ippolito -#Canonical Limited -#Christopher Armstrong -#David Reid -#Donovan Preston -#Eric Mangold -#Eyal Lotem -#Itamar Shtull-Trauring -#James Knight -#Jason A. Mobarak -#Jean-Paul Calderone -#Jessica McKellar -#Jonathan Jacobs -#Jonathan Lange -#Jonathan D. Simms -#Jurgen Hermann -#Kevin Horn -#Kevin Turner -#Mary Gardiner -#Matthew Lefkowitz -#Massachusetts Institute of Technology -#Moshe Zadka -#Paul Swartz -#Pavel Pergamenshchik -#Ralph Meijer -#Sean Riley -#Software Freedom Conservancy -#Travis B. Hartwell -#Thijs Triemstra -#Thomas Herve -#Timothy Allen -# -#Permission is hereby granted, free of charge, to any person obtaining -#a copy of this software and associated documentation files (the -#"Software"), to deal in the Software without restriction, including -#without limitation the rights to use, copy, modify, merge, publish, -#distribute, sublicense, and/or sell copies of the Software, and to -#permit persons to whom the Software is furnished to do so, subject to -#the following conditions: -# -#The above copyright notice and this permission notice shall be -#included in all copies or substantial portions of the Software. -# -#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -#LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -#OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -#WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -""" -This module provides support for Twisted to be driven by the Qt mainloop. - -In order to use this support, simply do the following:: - | app = QApplication(sys.argv) # your code to init Qt - | import qt4reactor - | qt4reactor.install() - -alternatively: - - | from twisted.application import reactors - | reactors.installReactor('qt4') - -Then use twisted.internet APIs as usual. The other methods here are not -intended to be called directly. - -If you don't instantiate a QApplication or QCoreApplication prior to -installing the reactor, a QCoreApplication will be constructed -by the reactor. QCoreApplication does not require a GUI so trial testing -can occur normally. - -Twisted can be initialized after QApplication.exec_() with a call to -reactor.runReturn(). calling reactor.stop() will unhook twisted but -leave your Qt application running - -API Stability: stable - -Maintainer: U{Glenn H Tarbox, PhD} - -Previous maintainer: U{Itamar Shtull-Trauring} -Original port to QT4: U{Gabe Rudy} -Subsequent port by therve -""" - -__all__ = ['install'] - - -import sys, time - -try: - from zope.interface import implements -except: - print('+++ Python Zope interface module is required\n') - raise - - -try: - from OVEStandard import globalForcePySide - if globalForcePySide: raise Exception() - from PyQt4.QtCore import QSocketNotifier, QObject, SIGNAL, QTimer, QCoreApplication - from PyQt4.QtCore import QEventLoop -except: - from PySide.QtCore import QSocketNotifier, QObject, SIGNAL, QTimer, QCoreApplication - from PySide.QtCore import QEventLoop - -try: - from twisted.internet.interfaces import IReactorFDSet - from twisted.python import log - from twisted.internet.posixbase import PosixReactorBase -except: - print('+++ Python Twisted Conch module is required\n') - raise - -class TwistedSocketNotifier(QSocketNotifier): - """ - Connection between an fd event and reader/writer callbacks. - """ - - def __init__(self, reactor, watcher, type): - QSocketNotifier.__init__(self, watcher.fileno(), type) - self.reactor = reactor - self.watcher = watcher - self.fn = None - if type == QSocketNotifier.Read: - self.fn = self.read - elif type == QSocketNotifier.Write: - self.fn = self.write - QObject.connect(self, SIGNAL("activated(int)"), self.fn) - - - def shutdown(self): - QObject.disconnect(self, SIGNAL("activated(int)"), self.fn) - self.setEnabled(False) - self.fn = self.watcher = None - self.deleteLater() - - - def read(self, sock): - w = self.watcher - #self.setEnabled(False) # ??? do I need this? - def _read(): - why = None - try: - why = w.doRead() - except: - log.err() - why = sys.exc_info()[1] - if why: - self.reactor._disconnectSelectable(w, why, True) - elif self.watcher: - pass - #self.setEnabled(True) - log.callWithLogger(w, _read) - self.reactor.reactorInvocation() - - def write(self, sock): - w = self.watcher - self.setEnabled(False) - def _write(): - why = None - try: - why = w.doWrite() - except: - log.err() - why = sys.exc_info()[1] - if why: - self.reactor._disconnectSelectable(w, why, False) - elif self.watcher: - self.setEnabled(True) - log.callWithLogger(w, _write) - self.reactor.reactorInvocation() - -class fakeApplication(QEventLoop): - def __init__(self): - QEventLoop.__init__(self) - - def exec_(self): - QEventLoop.exec_(self) - -class QTReactor(PosixReactorBase): - """ - Qt based reactor. - """ - implements(IReactorFDSet) - - _timer = None - - def __init__(self): - self._reads = {} - self._writes = {} - self._timer=QTimer() - self._timer.setSingleShot(True) - if QCoreApplication.startingUp(): - self.qApp=QCoreApplication([]) - self._ownApp=True - else: - self.qApp = QCoreApplication.instance() - self._ownApp=False - self._blockApp = None - self._readWriteQ=[] - - """ some debugging instrumentation """ - self._doSomethingCount=0 - - PosixReactorBase.__init__(self) - - def addReader(self, reader): - if not reader in self._reads: - self._reads[reader] = TwistedSocketNotifier(self, reader, - QSocketNotifier.Read) - - - def addWriter(self, writer): - if not writer in self._writes: - self._writes[writer] = TwistedSocketNotifier(self, writer, - QSocketNotifier.Write) - - - def removeReader(self, reader): - if reader in self._reads: - #self._reads[reader].shutdown() - #del self._reads[reader] - self._reads.pop(reader).shutdown() - - def removeWriter(self, writer): - if writer in self._writes: - self._writes[writer].shutdown() - #del self._writes[writer] - self._writes.pop(writer) - - - def removeAll(self): - return self._removeAll(self._reads, self._writes) - - - def getReaders(self): - return self._reads.keys() - - - def getWriters(self): - return self._writes.keys() - - def callLater(self,howlong, *args, **kargs): - rval = super(QTReactor,self).callLater(howlong, *args, **kargs) - self.reactorInvocation() - return rval - - def crash(self): - super(QTReactor,self).crash() - - def iterate(self,delay=0.0): - t=self.running # not sure I entirely get the state of running - self.running=True - self._timer.stop() # in case its not (rare?) - try: - if delay == 0.0: - self.reactorInvokePrivate() - self._timer.stop() # supports multiple invocations - else: - endTime = delay + time.time() - self.reactorInvokePrivate() - while True: - t = endTime - time.time() - if t <= 0.0: return - self.qApp.processEvents(QEventLoop.AllEvents | - QEventLoop.WaitForMoreEvents,t*1010) - finally: - self.running=t - - def addReadWrite(self,t): - self._readWriteQ.append(t) - - def runReturn(self, installSignalHandlers=True): - QObject.connect(self._timer, SIGNAL("timeout()"), - self.reactorInvokePrivate) - self.startRunning(installSignalHandlers=installSignalHandlers) - self._timer.start(0) - - def run(self, installSignalHandlers=True): - try: - if self._ownApp: - self._blockApp=self.qApp - else: - self._blockApp = fakeApplication() - self.runReturn(installSignalHandlers) - self._blockApp.exec_() - finally: - self._timer.stop() # should already be stopped - - def reactorInvocation(self): - self._timer.setInterval(0) - - def reactorInvokePrivate(self): - if not self.running: - if self._blockApp is None: - # Andy's fix for Ctrl-C quit - self.qApp.quit() - else: - self._blockApp.quit() - self._doSomethingCount += 1 - self.runUntilCurrent() - t = self.timeout() - if t is None: t=0.1 - else: t = min(t,0.1) - self._timer.setInterval(int(t*1010)) - self.qApp.processEvents() # could change interval - self._timer.start() - - def doIteration(self): - assert False, "doiteration is invalid call" - -def install(): - """ - Configure the twisted mainloop to be run inside the qt mainloop. - """ - from twisted.internet import main - reactor = QTReactor() - main.installReactor(reactor) -- 2.45.2