More universal utilities like sosreport provide much more detailed information about OVS configuration these days than the ovs-bugtool. And I haven't seen a bugtool report submitted in a very long time. At this point it's jst 2K lines of barely maintained code. Let's just remove it.
This is also the last bit of code under LGPL-2.1. Note: the license line in the Fedora spec is not fully correct, but not trying to fix it here. Only removing LGPL-2.1 that this change is getting rid of. Signed-off-by: Ilya Maximets <[email protected]> --- Documentation/ref/index.rst | 4 - NEWS | 1 + configure.ac | 1 - debian/copyright.in | 26 - debian/openvswitch-common.install | 4 - rhel/openvswitch-fedora.spec.in | 9 +- rhel/openvswitch.spec.in | 4 - utilities/automake.mk | 2 - utilities/bugtool/.gitignore | 2 - utilities/bugtool/automake.mk | 58 - utilities/bugtool/ovs-bugtool-daemons-ver | 25 - utilities/bugtool/ovs-bugtool-fdb-show | 24 - .../bugtool/ovs-bugtool-get-dpdk-nic-numa | 25 - utilities/bugtool/ovs-bugtool-get-port-stats | 15 - utilities/bugtool/ovs-bugtool-ovs-appctl-dpif | 26 - .../ovs-bugtool-ovs-bridge-datapath-type | 22 - .../ovs-bugtool-ovs-ofctl-loop-over-bridges | 33 - .../ovs-bugtool-ovs-vswitchd-threads-affinity | 25 - utilities/bugtool/ovs-bugtool-qos-configs | 29 - utilities/bugtool/ovs-bugtool-tc-class-show | 25 - utilities/bugtool/ovs-bugtool.8.in | 79 - utilities/bugtool/ovs-bugtool.in | 1412 ----------------- .../plugins/kernel-info/openvswitch.xml | 23 - .../plugins/network-status/openvswitch.xml | 47 - .../bugtool/plugins/system-configuration.xml | 21 - .../system-configuration/openvswitch.xml | 47 - .../plugins/system-logs/openvswitch.xml | 39 - utilities/checkpatch.py | 2 - 28 files changed, 3 insertions(+), 2027 deletions(-) delete mode 100644 utilities/bugtool/.gitignore delete mode 100644 utilities/bugtool/automake.mk delete mode 100755 utilities/bugtool/ovs-bugtool-daemons-ver delete mode 100755 utilities/bugtool/ovs-bugtool-fdb-show delete mode 100755 utilities/bugtool/ovs-bugtool-get-dpdk-nic-numa delete mode 100755 utilities/bugtool/ovs-bugtool-get-port-stats delete mode 100755 utilities/bugtool/ovs-bugtool-ovs-appctl-dpif delete mode 100755 utilities/bugtool/ovs-bugtool-ovs-bridge-datapath-type delete mode 100755 utilities/bugtool/ovs-bugtool-ovs-ofctl-loop-over-bridges delete mode 100755 utilities/bugtool/ovs-bugtool-ovs-vswitchd-threads-affinity delete mode 100755 utilities/bugtool/ovs-bugtool-qos-configs delete mode 100755 utilities/bugtool/ovs-bugtool-tc-class-show delete mode 100644 utilities/bugtool/ovs-bugtool.8.in delete mode 100755 utilities/bugtool/ovs-bugtool.in delete mode 100644 utilities/bugtool/plugins/kernel-info/openvswitch.xml delete mode 100644 utilities/bugtool/plugins/network-status/openvswitch.xml delete mode 100644 utilities/bugtool/plugins/system-configuration.xml delete mode 100644 utilities/bugtool/plugins/system-configuration/openvswitch.xml delete mode 100644 utilities/bugtool/plugins/system-logs/openvswitch.xml diff --git a/Documentation/ref/index.rst b/Documentation/ref/index.rst index 342c6a376..a6929f17f 100644 --- a/Documentation/ref/index.rst +++ b/Documentation/ref/index.rst @@ -55,10 +55,6 @@ The remainder are still in roff format can be found below: .. list-table:: - * - ovs-bugtool(8) - - `(pdf) <http://www.openvswitch.org/support/dist-docs/ovs-bugtool.8.pdf>`__ - - `(html) <http://www.openvswitch.org/support/dist-docs/ovs-bugtool.8.html>`__ - - `(plain text) <http://www.openvswitch.org/support/dist-docs/ovs-bugtool.8.txt>`__ * - ovsdb-client(1) - `(pdf) <http://www.openvswitch.org/support/dist-docs/ovsdb-client.1.pdf>`__ - `(html) <http://www.openvswitch.org/support/dist-docs/ovsdb-client.1.html>`__ diff --git a/NEWS b/NEWS index 779447c74..5fe0bc5b8 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,7 @@ Post-v3.7.0 performance testing. * ovs-vlan-test: It was designed to check for VLAN bugs in old Linux kernels that have long been fixed. + * ovs-bugtool: There are much better alternatives like sosreport. - Windows: * The previously deprecated Windows kernel datapath implementation is now fully removed as well as support for running or building userspace diff --git a/configure.ac b/configure.ac index f02c6f313..1b3dba501 100644 --- a/configure.ac +++ b/configure.ac @@ -212,7 +212,6 @@ AC_CONFIG_FILES(include/openvswitch/version.h) dnl This makes sure that include/openflow gets created in the build directory. AC_CONFIG_COMMANDS([include/openflow/openflow.h.stamp]) -AC_CONFIG_COMMANDS([utilities/bugtool/dummy], [:]) AC_CONFIG_COMMANDS([ipsec/dummy], [:]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES]) diff --git a/debian/copyright.in b/debian/copyright.in index 7c47909fa..61e93aa69 100644 --- a/debian/copyright.in +++ b/debian/copyright.in @@ -86,15 +86,6 @@ Copyright: (c) 2001 Daniel Hartmeier (c) 2015, 2016 Nicira, Inc. License: BSD-2-clause -Files: - utilities/bugtool/ovs-bugtool-* - utilities/bugtool/plugins/kernel-info/openvswitch.xml - utilities/bugtool/plugins/network-status/openvswitch.xml - utilities/bugtool/plugins/system-configuration.xml - utilities/bugtool/plugins/system-configuration/openvswitch.xml -Copyright: (c) 2011 Nicira, Inc. -License: LGPL-2.1 - Files: lib/sflow.h lib/sflow_agent.c @@ -659,23 +650,6 @@ License: BSD-2-clause OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -License: LGPL-2.1 - This library is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License. - . - This library is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - details. - . - You should have received a copy of the GNU Lesser General Public License along - with this library; if not, write to the Free Software Foundation, Inc., 51 - Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - . - On Debian systems, the complete text of the GNU Lesser General Public License - (LGPL) may be found in /usr/share/common-licenses/LGPL-2. - License: LGPL-2.1-with-exception On Debian systems, the complete text of the GNU Lesser General Public License version 2.1 can be found in diff --git a/debian/openvswitch-common.install b/debian/openvswitch-common.install index 43563b07f..85b5fffa6 100644 --- a/debian/openvswitch-common.install +++ b/debian/openvswitch-common.install @@ -6,7 +6,6 @@ usr/bin/ovs-ofctl usr/bin/ovs-pki usr/bin/ovsdb-client usr/bin/ovsdb-tool -usr/sbin/ovs-bugtool usr/sbin/ovsdb-server usr/share/man/man1/ovsdb-client.1 usr/share/man/man1/ovsdb-server.1 @@ -19,10 +18,7 @@ usr/share/man/man7/ovs-fields.7 usr/share/man/man7/ovsdb-server.7 usr/share/man/man7/ovsdb.7 usr/share/man/man8/ovs-appctl.8 -usr/share/man/man8/ovs-bugtool.8 usr/share/man/man8/ovs-flowviz.8 usr/share/man/man8/ovs-ofctl.8 usr/share/man/man8/ovs-pki.8 -usr/share/openvswitch/bugtool-plugins -usr/share/openvswitch/scripts/ovs-bugtool-* usr/share/openvswitch/scripts/ovs-lib diff --git a/rhel/openvswitch-fedora.spec.in b/rhel/openvswitch-fedora.spec.in index 810d8d600..c418caea8 100644 --- a/rhel/openvswitch-fedora.spec.in +++ b/rhel/openvswitch-fedora.spec.in @@ -48,9 +48,8 @@ Group: System Environment/Daemons URL: http://www.openvswitch.org/ Version: @VERSION@ -# Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the -# lib/sflow*.[ch] files are SISSL -License: ASL 2.0 and LGPLv2+ and SISSL +# Nearly all of openvswitch is ASL 2.0. The lib/sflow*.[ch] files are SISSL. +License: ASL 2.0 and SISSL Release: %{release_number}%{?dist} Source: http://openvswitch.org/releases/%{name}-%{version}.tar.gz @@ -464,8 +463,6 @@ fi %{_sysconfdir}/sysconfig/network-scripts/ifup-ovs %{_sysconfdir}/sysconfig/network-scripts/ifdown-ovs %endif -%{_datadir}/openvswitch/bugtool-plugins/ -%{_datadir}/openvswitch/scripts/ovs-bugtool-* %{_datadir}/openvswitch/scripts/ovs-check-dead-ifs %{_datadir}/openvswitch/scripts/ovs-lib %{_datadir}/openvswitch/scripts/ovs-save @@ -488,7 +485,6 @@ fi %{_bindir}/ovs-pki %{_bindir}/vtep-ctl %{_libdir}/lib*.so.* -%{_sbindir}/ovs-bugtool %{_sbindir}/ovs-vswitchd %{_sbindir}/ovsdb-server %{_mandir}/man1/ovsdb-client.1* @@ -505,7 +501,6 @@ fi %{_mandir}/man7/ovsdb-server.7* %{_mandir}/man8/vtep-ctl.8* %{_mandir}/man8/ovs-appctl.8* -%{_mandir}/man8/ovs-bugtool.8* %{_mandir}/man8/ovs-ctl.8* %{_mandir}/man8/ovs-dpctl.8* %{_mandir}/man8/ovs-dpctl-top.8* diff --git a/rhel/openvswitch.spec.in b/rhel/openvswitch.spec.in index 787a7ebaa..6f676e226 100644 --- a/rhel/openvswitch.spec.in +++ b/rhel/openvswitch.spec.in @@ -195,7 +195,6 @@ exit 0 /usr/bin/ovsdb-tool /usr/bin/vtep-ctl %{_libdir}/lib*.so.* -/usr/sbin/ovs-bugtool /usr/sbin/ovs-vswitchd /usr/sbin/ovsdb-server /usr/share/man/man1/ovs-pcap.1.gz @@ -213,7 +212,6 @@ exit 0 %{_mandir}/man7/ovsdb.7* %{_mandir}/man7/ovsdb-server.7* /usr/share/man/man8/ovs-appctl.8.gz -/usr/share/man/man8/ovs-bugtool.8.gz /usr/share/man/man8/ovs-ctl.8.gz /usr/share/man/man8/ovs-dpctl.8.gz /usr/share/man/man8/ovs-dpctl-top.8.gz @@ -225,9 +223,7 @@ exit 0 /usr/share/man/man8/ovs-vsctl.8.gz /usr/share/man/man8/ovs-vswitchd.8.gz /usr/share/man/man8/vtep-ctl.8.gz -/usr/share/openvswitch/bugtool-plugins/ /usr/share/openvswitch/python/ -/usr/share/openvswitch/scripts/ovs-bugtool-* /usr/share/openvswitch/scripts/ovs-check-dead-ifs /usr/share/openvswitch/scripts/ovs-ctl /usr/share/openvswitch/scripts/ovs-kmod-ctl diff --git a/utilities/automake.mk b/utilities/automake.mk index 59acafe01..840eaec94 100644 --- a/utilities/automake.mk +++ b/utilities/automake.mk @@ -144,5 +144,3 @@ FLAKE8_PYFILES += utilities/ovs-pcap.in \ utilities/usdt-scripts/kernel_delay.py \ utilities/usdt-scripts/upcall_monitor.py \ utilities/usdt-scripts/upcall_cost.py - -include utilities/bugtool/automake.mk diff --git a/utilities/bugtool/.gitignore b/utilities/bugtool/.gitignore deleted file mode 100644 index c242628a2..000000000 --- a/utilities/bugtool/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/ovs-bugtool -/ovs-bugtool.8 diff --git a/utilities/bugtool/automake.mk b/utilities/bugtool/automake.mk deleted file mode 100644 index 0a9b93088..000000000 --- a/utilities/bugtool/automake.mk +++ /dev/null @@ -1,58 +0,0 @@ -sbin_SCRIPTS += utilities/bugtool/ovs-bugtool -CLEANFILES += utilities/bugtool/ovs-bugtool - -man_MANS += utilities/bugtool/ovs-bugtool.8 -MAN_ROOTS += utilities/bugtool/ovs-bugtool.8.in -CLEANFILES += utilities/bugtool/ovs-bugtool.8 - -bugtool_plugins = \ - utilities/bugtool/plugins/kernel-info/openvswitch.xml \ - utilities/bugtool/plugins/network-status/openvswitch.xml \ - utilities/bugtool/plugins/system-configuration.xml \ - utilities/bugtool/plugins/system-logs/openvswitch.xml \ - utilities/bugtool/plugins/system-configuration/openvswitch.xml - -bugtool_scripts = \ - utilities/bugtool/ovs-bugtool-fdb-show \ - utilities/bugtool/ovs-bugtool-tc-class-show \ - utilities/bugtool/ovs-bugtool-daemons-ver \ - utilities/bugtool/ovs-bugtool-ovs-ofctl-loop-over-bridges \ - utilities/bugtool/ovs-bugtool-ovs-appctl-dpif \ - utilities/bugtool/ovs-bugtool-ovs-bridge-datapath-type \ - utilities/bugtool/ovs-bugtool-ovs-vswitchd-threads-affinity \ - utilities/bugtool/ovs-bugtool-qos-configs \ - utilities/bugtool/ovs-bugtool-get-dpdk-nic-numa \ - utilities/bugtool/ovs-bugtool-get-port-stats - -scripts_SCRIPTS += $(bugtool_scripts) - -FLAKE8_PYFILES += utilities/bugtool/ovs-bugtool.in - -bugtoolpluginsdir = $(pkgdatadir)/bugtool-plugins -INSTALL_DATA_LOCAL += bugtool-install-data-local -bugtool-install-data-local: - for plugin in $(bugtool_plugins); do \ - stem=`echo "$$plugin" | sed 's,utilities/bugtool/plugins/,,'`; \ - dir=`expr "$$stem" : '\(.*\)/[^/]*$$'`; \ - $(MKDIR_P) "$(DESTDIR)$(bugtoolpluginsdir)/$$dir"; \ - $(INSTALL_DATA) "$(srcdir)/$$plugin" "$(DESTDIR)$(bugtoolpluginsdir)/$$stem"; \ - done - -UNINSTALL_LOCAL += bugtool-uninstall-local -bugtool-uninstall-local: - for plugin in $(bugtool_plugins); do \ - stem=`echo "$$plugin" | sed 's,utilities/bugtool/plugins/,,'`; \ - rm -f "$(DESTDIR)$(bugtoolpluginsdir)/$$stem"; \ - done - for plugin in $(bugtool_plugins); do \ - stem=`echo "$$plugin" | sed 's,utilities/bugtool/plugins/,,'`; \ - dir=`expr "$$stem" : '\(.*\)/[^/]*$$'`; \ - if [ ! -z "$$dir" ]; then \ - rm -rf "$(DESTDIR)$(bugtoolpluginsdir)/$$dir"; \ - fi \ - done; exit 0 - -EXTRA_DIST += \ - $(bugtool_plugins) \ - $(bugtool_scripts) \ - utilities/bugtool/ovs-bugtool.in diff --git a/utilities/bugtool/ovs-bugtool-daemons-ver b/utilities/bugtool/ovs-bugtool-daemons-ver deleted file mode 100755 index 952ed65b4..000000000 --- a/utilities/bugtool/ovs-bugtool-daemons-ver +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/sh - -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General -# Public License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA -# -# Copyright (C) 2012 Nicira, Inc. - -for f in `cd /var/run/openvswitch/; ls *.pid 2>/dev/null` -do - if [ -n "${f%.pid}" ]; then - ovs-appctl -t "${f%.pid}" version 2>&1 - fi - echo -done diff --git a/utilities/bugtool/ovs-bugtool-fdb-show b/utilities/bugtool/ovs-bugtool-fdb-show deleted file mode 100755 index 79baba0e0..000000000 --- a/utilities/bugtool/ovs-bugtool-fdb-show +++ /dev/null @@ -1,24 +0,0 @@ -#! /bin/sh - -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General -# Public License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA -# -# Copyright (C) 2014 Nicira, Inc. - -for bridge in `ovs-vsctl -- --real list-br` -do - echo "ovs-appctl fdb/show ${bridge}" - ovs-appctl fdb/show "${bridge}" - echo "" -done diff --git a/utilities/bugtool/ovs-bugtool-get-dpdk-nic-numa b/utilities/bugtool/ovs-bugtool-get-dpdk-nic-numa deleted file mode 100755 index 8ac6bd9ea..000000000 --- a/utilities/bugtool/ovs-bugtool-get-dpdk-nic-numa +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/sh - -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General -# Public License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA -# -# Copyright (C) 2017 Ericsson AB - -for PCI_ADDRESS in $(lspci -D | cut -d' ' -f1) -do - if [ -n "$(find /sys/bus/pci/drivers | grep drivers.*$PCI_ADDRESS | grep -e uio_pci_generic -e igb_uio -e vfio-pci)" ] - then - grep -H "" $(find /sys/devices/ -path "*$PCI_ADDRESS*numa_node") - fi -done diff --git a/utilities/bugtool/ovs-bugtool-get-port-stats b/utilities/bugtool/ovs-bugtool-get-port-stats deleted file mode 100755 index 23e61034e..000000000 --- a/utilities/bugtool/ovs-bugtool-get-port-stats +++ /dev/null @@ -1,15 +0,0 @@ -#! /bin/bash - -#Iterate through each port of every bridge and print -#the port statistics - -for bridge in `ovs-vsctl -- --real list-br` -do - echo "${bridge} : " - echo " ${bridge} : `ovs-vsctl get interface ${bridge} statistics`" - for iface in `ovs-vsctl list-ifaces ${bridge}` - do - echo " ${iface} : `ovs-vsctl get interface ${iface} statistics`" - done - echo -e "\n" -done diff --git a/utilities/bugtool/ovs-bugtool-ovs-appctl-dpif b/utilities/bugtool/ovs-bugtool-ovs-appctl-dpif deleted file mode 100755 index 90d277538..000000000 --- a/utilities/bugtool/ovs-bugtool-ovs-appctl-dpif +++ /dev/null @@ -1,26 +0,0 @@ -#! /bin/sh - -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General -# Public License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA -# -# Copyright (C) 2013 Nicira, Inc. - -echo "ovs-appctl dpif/show" -ovs-appctl dpif/show -for bridge in `ovs-vsctl -- --real list-br` -do - echo "ovs-appctl dpif/dump-flows -m ${bridge}" - ovs-appctl dpif/dump-flows -m "$bridge" - echo "" -done diff --git a/utilities/bugtool/ovs-bugtool-ovs-bridge-datapath-type b/utilities/bugtool/ovs-bugtool-ovs-bridge-datapath-type deleted file mode 100755 index dfdcab0bd..000000000 --- a/utilities/bugtool/ovs-bugtool-ovs-bridge-datapath-type +++ /dev/null @@ -1,22 +0,0 @@ -#! /bin/sh - -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General -# Public License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA -# -# Copyright (C) 2017 Ericsson AB - -for br in `ovs-vsctl -- --real list-br` -do - echo bridge $br datapath_type=$(ovs-vsctl get bridge $br datapath_type) -done diff --git a/utilities/bugtool/ovs-bugtool-ovs-ofctl-loop-over-bridges b/utilities/bugtool/ovs-bugtool-ovs-ofctl-loop-over-bridges deleted file mode 100755 index e74f47474..000000000 --- a/utilities/bugtool/ovs-bugtool-ovs-ofctl-loop-over-bridges +++ /dev/null @@ -1,33 +0,0 @@ -#! /bin/bash - -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General -# Public License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA -# -# Copyright (C) 2017 Ericsson AB - -for bridge in `ovs-vsctl -- --real list-br` -do - PROTOCOLS="$(ovs-vsctl get Bridge "$bridge" protocols)" - if [ "$PROTOCOLS" = "[]" ] - then - echo "ovs-ofctl $1 ${bridge} $2" - eval ovs-ofctl $1 "${bridge}" $2 - else - LENGTHPRO="$(expr length "$PROTOCOLS")" - COMMAIND="$(expr index "$PROTOCOLS" ,)" - echo "ovs-ofctl $1 -O${PROTOCOLS:${COMMAIND}+2:${LENGTHPRO}-${COMMAIND}-4} ${bridge} $2" - eval ovs-ofctl $1 -O"${PROTOCOLS:${COMMAIND}+2:${LENGTHPRO}-${COMMAIND}-4}" "${bridge}" $2 - fi - echo "" -done diff --git a/utilities/bugtool/ovs-bugtool-ovs-vswitchd-threads-affinity b/utilities/bugtool/ovs-bugtool-ovs-vswitchd-threads-affinity deleted file mode 100755 index 2c8a57d46..000000000 --- a/utilities/bugtool/ovs-bugtool-ovs-vswitchd-threads-affinity +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/sh - -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General -# Public License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA -# -# Copyright (C) 2017 Ericsson AB - -for pid in $(pgrep ovs-vswitchd) -do - for i in $(ls /proc/$pid/task) - do - taskset -pc $i - done -done diff --git a/utilities/bugtool/ovs-bugtool-qos-configs b/utilities/bugtool/ovs-bugtool-qos-configs deleted file mode 100755 index a4a52fbc6..000000000 --- a/utilities/bugtool/ovs-bugtool-qos-configs +++ /dev/null @@ -1,29 +0,0 @@ -#! /bin/sh - -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General -# Public License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA -# -# Copyright (C) 2017 Ericsson AB - -for br in `ovs-vsctl -- --real list-br` -do - for iface in $(ovs-vsctl list-ifaces ${br}) - do - echo "Rate limiting configuration for ${iface} (of ${br}):" - ovs-vsctl list interface ${iface} | grep ingress - echo "Interface options:" - ovs-vsctl get Interface ${iface} options - echo "" - done -done diff --git a/utilities/bugtool/ovs-bugtool-tc-class-show b/utilities/bugtool/ovs-bugtool-tc-class-show deleted file mode 100755 index 904789f11..000000000 --- a/utilities/bugtool/ovs-bugtool-tc-class-show +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/sh - -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General -# Public License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA -# -# Copyright (C) 2011 Nicira, Inc. - -for iface in $(cd /sys/class/net && echo *); do - if [ -d /sys/class/net/$iface ]; then - echo Interface $iface: - # indent tc output so it's clear which interface it pertains to - /sbin/tc -s -d class show dev $iface | /bin/sed 's/^/ /' - fi -done diff --git a/utilities/bugtool/ovs-bugtool.8.in b/utilities/bugtool/ovs-bugtool.8.in deleted file mode 100644 index f9dd62f15..000000000 --- a/utilities/bugtool/ovs-bugtool.8.in +++ /dev/null @@ -1,79 +0,0 @@ -.\" -*- nroff -*- -.so lib/ovs.tmac -.TH ovs\-bugtool 8 "@VERSION@" "Open vSwitch" "Open vSwitch Manual" -.\" This program's name: -.ds PN ovs\-bugtool -. -.SH NAME -ovs\-bugtool \- Open vSwitch bug reporting utility -. -.SH SYNOPSIS -.B ovs\-bugtool -. -.SH DESCRIPTION -Generates a debug bundle with useful information about Open vSwitch on this -system and places it in \fB/var/log/ovs-bugtool\fR. -. -.SH "COLLECTION OPTIONS" -.PP -These options influence what categories of data \fBovs\-bugtool\fR -collects. -. -.IP "\fB\-\-entries=\fIlist\fR" -Collect the capabilities specified in the comma-separated \fIlist\fR. -.IP "\fB\-\-all\fR" -Collect all available capabilities. -.IP "\fB\-\-ovs\fR" -In addition to Open vSwitch configuration and status, -\fBovs\-bugtool\fR can collect a variety of relevant system -information. This option limits collection to Open vSwitch-specific -categories. -.IP "\fB\-\-log\-days=\fIdays\fR" -Include the logs with last modification time in the previous \fIdays\fR days -in the debug bundle. The number of log files included has a big impact on the -eventual bundle size. The default value is 20 days. -.IP "\fB\-y\fR" -.IQ "\fB\-\-yestoall\fR" -Answer yes to all prompts. -.IP "\fB\-\-capabilities\fR" -Writes the categories that \fBovs\-bugtool\fR can collect on stdout in -XML, then exits. -. -.SH "OUTPUT OPTIONS" -.PP -These options influence the format and destination of -\fBovs\-bugtool\fR output. -. -.IP "\fB\-\-output=\fIfiletype\fR" -Generates a debug bundle with the specified file type. Options include -\fBtar\fR, \fBtar.gz\fR, \fBtar.bz2\fR, and \fBzip\fR. -.IP "\fB\-\-outfile=\fIfile\fR" -Write output to \fIfile\fR. Mutually exclusive with \fB\-\-outfd\fR. -.IP "\fB\-\-outfd=\fIfd\fR" -Write output to file descriptor \fIfd\fR. This option must be used -with \fB\-\-output=tar\fR. -.IP "\fB\-\-unlimited\fR" -Do not exclude files which are too large. Also skip checking free disk space. -By default up to 90 percent of the free disk space can be used. -.IP "\fB\-\-debug\fR" -Print verbose debugging output. -. -.SH "OTHER OPTIONS" -. -.IP "\fB\-s\fR" -.IQ "\fB\-\-silent\fR" -Suppress most output to stdout. -.IP "\fB\-\-help\fR" -Print a summary of \fBovs\-bugtool\fR usage to stdout, then exit. -. -.SH EXAMPLES -.PP -Here's a collection of some commonly useful options: -.PP -\fBovs\-bugtool \-y \-s \-\-output=tar.gz \-\-outfile=/var/log/bugtool-report.tgz\fR -. -.SH BUGS -\fBovs\-bugtool\fR makes many assumptions about file locations and the -availability of system utilities. It has been tested on Debian and -Red Hat and derived distributions. On other distributions it is -likely to be less useful. diff --git a/utilities/bugtool/ovs-bugtool.in b/utilities/bugtool/ovs-bugtool.in deleted file mode 100755 index 856199875..000000000 --- a/utilities/bugtool/ovs-bugtool.in +++ /dev/null @@ -1,1412 +0,0 @@ -#! @PYTHON3@ - -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General Public -# License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# Copyright (c) 2005, 2007 XenSource Ltd. -# Copyright (c) 2010, 2011, 2012, 2013, 2015, 2016, 2017 Nicira, Inc. - -# -# To add new entries to the bugtool, you need to: -# -# Create a new capability. These declare the new entry to the GUI, including -# the expected size, time to collect, privacy implications, and whether the -# capability should be selected by default. One capability may refer to -# multiple files, assuming that they can be reasonably grouped together, and -# have the same privacy implications. You need: -# -# A new CAP_ constant. -# A cap() invocation to declare the capability. -# -# You then need to add calls to main() to collect the files. These will -# typically be calls to the helpers file_output(), tree_output(), cmd_output(), -# or func_output(). -# - -from io import BytesIO -import fcntl -import getopt -import hashlib -import os -import platform -import re -import sys -import tarfile -import time -import warnings -import zipfile -from select import select -from signal import SIGTERM -from subprocess import PIPE, Popen, check_output - -from xml.dom.minidom import getDOMImplementation, parse - -warnings.filterwarnings(action="ignore", category=DeprecationWarning) - -OS_RELEASE = platform.release() - -# -# Files & directories -# - -APT_SOURCES_LIST = "/etc/apt/sources.list" -APT_SOURCES_LIST_D = "/etc/apt/sources.list.d" -BUG_DIR = "/var/log/ovs-bugtool" -PLUGIN_DIR = "@pkgdatadir@/bugtool-plugins" -GRUB_CONFIG = '/boot/grub/menu.lst' -BOOT_KERNEL = '/boot/vmlinuz-' + OS_RELEASE -BOOT_INITRD = '/boot/initrd-' + OS_RELEASE + '.img' -PROC_PARTITIONS = '/proc/partitions' -FSTAB = '/etc/fstab' -PROC_MOUNTS = '/proc/mounts' -ISCSI_CONF = '/etc/iscsi/iscsid.conf' -ISCSI_INITIATOR = '/etc/iscsi/initiatorname.iscsi' -PROC_CPUINFO = '/proc/cpuinfo' -PROC_MEMINFO = '/proc/meminfo' -PROC_IOPORTS = '/proc/ioports' -PROC_INTERRUPTS = '/proc/interrupts' -PROC_SCSI = '/proc/scsi/scsi' -PROC_VERSION = '/proc/version' -PROC_MODULES = '/proc/modules' -PROC_DEVICES = '/proc/devices' -PROC_FILESYSTEMS = '/proc/filesystems' -PROC_CMDLINE = '/proc/cmdline' -PROC_CONFIG = '/proc/config.gz' -PROC_USB_DEV = '/proc/bus/usb/devices' -PROC_NET_BONDING_DIR = '/proc/net/bonding' -IFCFG_RE = re.compile(r'^.*/ifcfg-.*') -ROUTE_RE = re.compile(r'^.*/route-.*') -SYSCONFIG_HWCONF = '/etc/sysconfig/hwconf' -SYSCONFIG_NETWORK = '/etc/sysconfig/network' -SYSCONFIG_NETWORK_SCRIPTS = '/etc/sysconfig/network-scripts' -INTERFACES = '/etc/network/interfaces' -INTERFACESD = '/etc/network/interfaces.d' -PROC_NET_VLAN_DIR = '/proc/net/vlan' -PROC_NET_SOFTNET_STAT = '/proc/net/softnet_stat' -MODPROBE_CONF = '/etc/modprobe.conf' -MODPROBE_DIR = '/etc/modprobe.d' -RESOLV_CONF = '/etc/resolv.conf' -MPP_CONF = '/etc/mpp.conf' -MULTIPATH_CONF = '/etc/multipath.conf' -NSSWITCH_CONF = '/etc/nsswitch.conf' -NTP_CONF = '/etc/ntp.conf' -IPTABLES_CONFIG = '/etc/sysconfig/iptables-config' -HOSTS = '/etc/hosts' -HOSTS_ALLOW = '/etc/hosts.allow' -HOSTS_DENY = '/etc/hosts.deny' -DHCP_LEASE_DIR = ['/var/lib/dhclient', '/var/lib/dhcp3'] -OPENVSWITCH_LOG_DIR = '@LOGDIR@/' -OPENVSWITCH_DEFAULT_SWITCH = '/etc/default/openvswitch-switch' # Debian -OPENVSWITCH_SYSCONFIG_SWITCH = '/etc/sysconfig/openvswitch' # RHEL -OPENVSWITCH_CONF_DB = '@DBDIR@/conf.db' -OPENVSWITCH_COMPACT_DB = '@DBDIR@/bugtool-compact-conf.db' -OPENVSWITCH_VSWITCHD_PID = '@RUNDIR@/ovs-vswitchd.pid' -VAR_LOG_DIR = '/var/log/' -VAR_LOG_CORE_DIR = '/var/log/core' -YUM_LOG = '/var/log/yum.log' -YUM_REPOS_DIR = '/etc/yum.repos.d' - -# -# External programs -# - -os.environ['PATH'] = '/usr/local/sbin:/usr/local/bin:' \ - '/usr/sbin:/usr/bin:/sbin:/bin:@pkgdatadir@/scripts' -ARP = 'arp' -CAT = 'cat' -CHKCONFIG = 'chkconfig' -DATE = 'date' -DF = 'df' -DMESG = 'dmesg' -DMIDECODE = 'dmidecode' -DMSETUP = 'dmsetup' -DPKG_QUERY = 'dpkg-query' -ETHTOOL = 'ethtool' -FDISK = 'fdisk' -FIND = 'find' -IP = 'ip' -IPTABLES = 'iptables' -ISCSIADM = 'iscsiadm' -LOSETUP = 'losetup' -LS = 'ls' -LSPCI = 'lspci' -MODINFO = 'modinfo' -MPPUTIL = 'mppUtil' -MULTIPATHD = 'multipathd' -NETSTAT = 'netstat' -OVS_DPCTL = 'ovs-dpctl' -OVS_OFCTL = 'ovs-ofctl' -OVS_VSCTL = 'ovs-vsctl' -PS = 'ps' -ROUTE = 'route' -RPM = 'rpm' -SG_MAP = 'sg_map' -SHA256_SUM = 'sha256sum' -SYSCTL = 'sysctl' -TC = 'tc' -UPTIME = 'uptime' -ZCAT = 'zcat' - -# -# PII -- Personally identifiable information. Of particular concern are -# things that would identify customers, or their network topology. -# Passwords are never to be included in any bug report, regardless of any PII -# declaration. -# -# NO -- No PII will be in these entries. -# YES -- PII will likely or certainly be in these entries. -# MAYBE -- The user may wish to audit these entries for PII. -# IF_CUSTOMIZED -- If the files are unmodified, then they will contain no PII, -# but since we encourage customers to edit these files, PII may have been -# introduced by the customer. This is used in particular for the networking -# scripts in dom0. -# - -PII_NO = 'no' -PII_YES = 'yes' -PII_MAYBE = 'maybe' -PII_IF_CUSTOMIZED = 'if_customized' -KEY = 0 -PII = 1 -MIN_SIZE = 2 -MAX_SIZE = 3 -MIN_TIME = 4 -MAX_TIME = 5 -MIME = 6 -CHECKED = 7 -HIDDEN = 8 - -MIME_DATA = 'application/data' -MIME_TEXT = 'text/plain' - -INVENTORY_XML_ROOT = "system-status-inventory" -INVENTORY_XML_SUMMARY = 'system-summary' -INVENTORY_XML_ELEMENT = 'inventory-entry' -CAP_XML_ROOT = "system-status-capabilities" -CAP_XML_ELEMENT = 'capability' - - -CAP_BOOT_LOADER = 'boot-loader' -CAP_DISK_INFO = 'disk-info' -CAP_HARDWARE_INFO = 'hardware-info' -CAP_KERNEL_INFO = 'kernel-info' -CAP_LOSETUP_A = 'loopback-devices' -CAP_MULTIPATH = 'multipath' -CAP_NETWORK_CONFIG = 'network-config' -CAP_NETWORK_INFO = 'network-info' -CAP_NETWORK_STATUS = 'network-status' -CAP_OPENVSWITCH_LOGS = 'ovs-system-logs' -CAP_PROCESS_LIST = 'process-list' -CAP_SYSTEM_LOGS = 'system-logs' -CAP_SYSTEM_SERVICES = 'system-services' -CAP_YUM = 'yum' - -KB = 1024 -MB = 1024 * 1024 - -caps = {} -cap_sizes = {} -unlimited_data = False -dbg = False -# Default value for the number of days to collect logs. -log_days = 20 -log_last_mod_time = None -free_disk_space = None -# Default value for delay between repeated commands -command_delay = 10 - - -def cap(key, pii=PII_MAYBE, min_size=-1, max_size=-1, min_time=-1, - max_time=-1, mime=MIME_TEXT, checked=True, hidden=False): - caps[key] = (key, pii, min_size, max_size, min_time, max_time, mime, - checked, hidden) - cap_sizes[key] = 0 - - -cap(CAP_BOOT_LOADER, PII_NO, max_size=3 * KB, max_time=5) -cap(CAP_DISK_INFO, PII_MAYBE, max_size=50 * KB, max_time=20) -cap(CAP_HARDWARE_INFO, PII_MAYBE, max_size=2 * MB, max_time=20) -cap(CAP_KERNEL_INFO, PII_MAYBE, max_size=120 * KB, max_time=5) -cap(CAP_LOSETUP_A, PII_MAYBE, max_size=KB, max_time=5) -cap(CAP_MULTIPATH, PII_MAYBE, max_size=20 * KB, max_time=10) -cap(CAP_NETWORK_CONFIG, PII_IF_CUSTOMIZED, min_size=0, max_size=5 * MB) -cap(CAP_NETWORK_INFO, PII_YES, max_size=50 * MB, max_time=30) -cap(CAP_NETWORK_STATUS, PII_YES, max_size=-1, max_time=30) -cap(CAP_OPENVSWITCH_LOGS, PII_MAYBE, max_size=-1, max_time=5) -cap(CAP_PROCESS_LIST, PII_YES, max_size=30 * KB, max_time=20) -cap(CAP_SYSTEM_LOGS, PII_MAYBE, max_size=200 * MB, max_time=5) -cap(CAP_SYSTEM_SERVICES, PII_NO, max_size=5 * KB, max_time=20) -cap(CAP_YUM, PII_IF_CUSTOMIZED, max_size=10 * KB, max_time=30) - -ANSWER_YES_TO_ALL = False -SILENT_MODE = False -entries = None -data = {} -dev_null = open('/dev/null', 'r+') - - -def output(x): - global SILENT_MODE - if not SILENT_MODE: - print(x) - - -def output_ts(x): - output("[%s] %s" % (time.strftime("%x %X %Z"), x)) - - -def cmd_output(cap, args, label=None, filter=None, - binary=False, repeat_count=1): - if cap in entries: - if not label: - if isinstance(args, list): - a = [aa for aa in args] - a[0] = os.path.basename(a[0]) - label = ' '.join(a) - else: - label = args - data[label] = {'cap': cap, 'cmd_args': args, 'filter': filter, - 'binary': binary, 'repeat_count': repeat_count} - - -def file_output(cap, path_list, newest_first=False, last_mod_time=None): - """ - If newest_first is True, the list of files in path_list is sorted - by file modification time in descending order, else its sorted - in ascending order. - """ - if cap in entries: - path_entries = [] - for path in path_list: - try: - s = os.stat(path) - except OSError: - continue - if last_mod_time is None or s.st_mtime >= last_mod_time: - path_entries.append((path, s)) - - def mtime(arg): - (path, stat) = arg - return stat.st_mtime - - path_entries.sort(key=mtime, reverse=newest_first) - for p in path_entries: - if check_space(cap, p[0], p[1].st_size): - data[p] = {'cap': cap, 'filename': p[0]} - - -def tree_output(cap, path, pattern=None, negate=False, newest_first=False, - last_mod_time=None): - """ - Walks the directory tree rooted at path. Files in current dir are processed - before files in sub-dirs. - """ - if cap in entries: - if os.path.exists(path): - for root, dirs, files in os.walk(path): - fns = [fn for fn in [os.path.join(root, f) for f in files] - if os.path.isfile(fn) and matches(fn, pattern, negate)] - file_output(cap, fns, newest_first=newest_first, - last_mod_time=last_mod_time) - - -def prefix_output(cap, prefix, newest_first=False, last_mod_time=None): - """ - Output files with the same prefix. - """ - fns = [] - for root, dirs, files in os.walk(os.path.dirname(prefix)): - fns += [fn for fn in [os.path.join(root, f) for f in files] - if fn.startswith(prefix)] - file_output(cap, fns, newest_first=newest_first, - last_mod_time=last_mod_time) - - -def func_output(cap, label, func): - if cap in entries: - data[label] = {'cap': cap, 'func': func} - - -def collect_data(): - first_run = True - - while True: - process_lists = {} - - for (k, v) in data.items(): - cap = v['cap'] - if 'cmd_args' in v: - if 'output' not in v.keys(): - v['output'] = BytesIOmtime() - if v['repeat_count'] > 0: - if cap not in process_lists: - process_lists[cap] = [] - process_lists[cap].append( - ProcOutput(v['cmd_args'], caps[cap][MAX_TIME], - v['output'], v['filter'], v['binary'])) - v['repeat_count'] -= 1 - - if bool(process_lists): - if not first_run: - output_ts("Waiting %d sec between repeated commands" % - command_delay) - time.sleep(command_delay) - else: - first_run = False - run_procs(process_lists.values()) - else: - break - - for (k, v) in data.items(): - cap = v['cap'] - if 'filename' in v and v['filename'].startswith('/proc/'): - # proc files must be read into memory - try: - f = open(v['filename'], 'rb') - s = f.read() - f.close() - if check_space(cap, v['filename'], len(s)): - v['output'] = BytesIOmtime(s) - except: - pass - elif 'func' in v: - try: - s = v['func'](cap) - except Exception as e: - s = str(e).encode() - if check_space(cap, k, len(s)): - if isinstance(s, str): - v['output'] = BytesIOmtime(s.encode()) - else: - v['output'] = BytesIOmtime(s) - - -def main(argv=None): - global ANSWER_YES_TO_ALL, SILENT_MODE - global entries, data, dbg, unlimited_data, free_disk_space - global log_days, log_last_mod_time, command_delay - - # Filter flags - only_ovs_info = False - collect_all_info = True - - if '--help' in sys.argv: - print(""" -%(argv0)s: create status report bundles to assist in problem diagnosis -usage: %(argv0)s OPTIONS - -By default, %(argv0)s prompts for permission to collect each form of status -information and produces a .tar.gz file as output. - -The following options are available. - --help display this help message, then exit - -s, --silent suppress most output to stdout - -Options for categories of data to collect: - --entries=CAP_A,CAP_B,... set categories of data to collect - --all collect all categories - --ovs collect only directly OVS-related info - --log-days=DAYS collect DAYS worth of old logs - --delay=DELAY set delay between repeated command - -y, --yestoall suppress prompts to confirm collection - --capabilities print categories as XML on stdout, then exit - -Output options: - --output=FORMAT set output format to one of tar tar.bz2 tar.gz zip - --outfile=FILE write output to FILE - --outfd=FD write output to FD (requires --output=tar) - --unlimited ignore default limits on sizes of data collected - --debug print ovs-bugtool debug info on stdout\ -""" % {'argv0': sys.argv[0]}) - sys.exit(0) - - # we need access to privileged files, exit if we are not running as root - if os.getuid() != 0: - print("Error: ovs-bugtool must be run as root", file=sys.stderr) - return 1 - - output_file = None - output_type = 'tar.gz' - output_fd = -1 - - if argv is None: - argv = sys.argv - - try: - (options, params) = getopt.gnu_getopt( - argv, 'sy', ['capabilities', 'silent', 'yestoall', 'entries=', - 'output=', 'outfd=', 'outfile=', 'all', 'unlimited', - 'debug', 'ovs', 'log-days=', 'delay=']) - except getopt.GetoptError as opterr: - print(opterr, file=sys.stderr) - return 2 - - try: - load_plugins(True) - except: - pass - - entries = [e for e in caps.keys() if caps[e][CHECKED]] - - for (k, v) in options: - if k == '--capabilities': - update_capabilities() - print_capabilities() - return 0 - - if k == '--output': - if v in ['tar', 'tar.bz2', 'tar.gz', 'zip']: - output_type = v - else: - print("Invalid output format '%s'" % v, file=sys.stderr) - return 2 - - # "-s" or "--silent" means suppress output (except for the final - # output filename at the end) - if k in ['-s', '--silent']: - SILENT_MODE = True - - if k == '--entries' and v != '': - entries = v.split(',') - - # If the user runs the script with "-y" or "--yestoall" we don't ask - # all the really annoying questions. - if k in ['-y', '--yestoall']: - ANSWER_YES_TO_ALL = True - - if k == '--outfd': - output_fd = int(v) - try: - old = fcntl.fcntl(output_fd, fcntl.F_GETFD) - fcntl.fcntl(output_fd, fcntl.F_SETFD, old | fcntl.FD_CLOEXEC) - except: - print("Invalid output file descriptor", output_fd, - file=sys.stderr) - return 2 - - if k == '--outfile': - output_file = v - - elif k == '--all': - entries = caps.keys() - elif k == '--unlimited': - unlimited_data = True - elif k == '--debug': - dbg = True - ProcOutput.debug = True - - if k == '--ovs': - only_ovs_info = True - collect_all_info = False - - if k == '--log-days': - log_days = int(v) - - if k == '--delay': - command_delay = int(v) - - if len(params) != 1: - print("Invalid additional arguments", str(params), file=sys.stderr) - return 2 - - if output_fd != -1 and output_type != 'tar': - print("Option '--outfd' only valid with '--output=tar'", - file=sys.stderr) - return 2 - - if output_fd != -1 and output_file is not None: - print("Cannot set both '--outfd' and '--outfile'", file=sys.stderr) - return 2 - - if output_file is not None and not unlimited_data: - free_disk_space = get_free_disk_space(output_file) * 90 / 100 - - log_last_mod_time = int(time.time()) - log_days * 86400 - - if ANSWER_YES_TO_ALL: - output("Warning: '--yestoall' argument provided, will not prompt " - "for individual files.") - - output(''' -This application will collate dmesg output, details of the -hardware configuration of your machine, information about the build of -openvswitch that you are using, plus, if you allow it, various logs. - -The collated information will be saved as a .%s for archiving or -sending to a Technical Support Representative. - -The logs may contain private information, and if you are at all -worried about that, you should exit now, or you should explicitly -exclude those logs from the archive. - -''' % output_type) - - # assemble potential data - - file_output(CAP_BOOT_LOADER, [GRUB_CONFIG]) - cmd_output(CAP_BOOT_LOADER, [LS, '-lR', '/boot']) - cmd_output(CAP_BOOT_LOADER, [SHA256_SUM, BOOT_KERNEL, BOOT_INITRD], - label='vmlinuz-initrd.sha256sum') - - cmd_output(CAP_DISK_INFO, [FDISK, '-l']) - file_output(CAP_DISK_INFO, [PROC_PARTITIONS, PROC_MOUNTS]) - file_output(CAP_DISK_INFO, [FSTAB, ISCSI_CONF, ISCSI_INITIATOR]) - cmd_output(CAP_DISK_INFO, [DF, '-alT']) - cmd_output(CAP_DISK_INFO, [DF, '-alTi']) - if len(pidof('iscsid')) != 0: - cmd_output(CAP_DISK_INFO, [ISCSIADM, '-m', 'node']) - cmd_output(CAP_DISK_INFO, [LS, '-R', '/sys/class/scsi_host']) - cmd_output(CAP_DISK_INFO, [LS, '-R', '/sys/class/scsi_disk']) - cmd_output(CAP_DISK_INFO, [LS, '-R', '/sys/class/fc_transport']) - cmd_output(CAP_DISK_INFO, [SG_MAP, '-x']) - func_output(CAP_DISK_INFO, 'scsi-hosts', dump_scsi_hosts) - - file_output(CAP_HARDWARE_INFO, - [PROC_CPUINFO, PROC_MEMINFO, PROC_IOPORTS, PROC_INTERRUPTS]) - cmd_output(CAP_HARDWARE_INFO, [DMIDECODE]) - cmd_output(CAP_HARDWARE_INFO, [LSPCI, '-n']) - cmd_output(CAP_HARDWARE_INFO, [LSPCI, '-vv']) - file_output(CAP_HARDWARE_INFO, [PROC_USB_DEV, PROC_SCSI]) - file_output(CAP_HARDWARE_INFO, [SYSCONFIG_HWCONF]) - cmd_output(CAP_HARDWARE_INFO, [LS, '-lR', '/dev']) - - file_output(CAP_KERNEL_INFO, [PROC_VERSION, PROC_MODULES, - PROC_DEVICES, PROC_FILESYSTEMS, PROC_CMDLINE]) - cmd_output(CAP_KERNEL_INFO, [ZCAT, PROC_CONFIG], label='config') - cmd_output(CAP_KERNEL_INFO, [SYSCTL, '-A']) - file_output(CAP_KERNEL_INFO, [MODPROBE_CONF]) - tree_output(CAP_KERNEL_INFO, MODPROBE_DIR) - func_output(CAP_KERNEL_INFO, 'modinfo', module_info) - - cmd_output(CAP_LOSETUP_A, [LOSETUP, '-a']) - - file_output(CAP_MULTIPATH, [MULTIPATH_CONF, MPP_CONF]) - cmd_output(CAP_MULTIPATH, [DMSETUP, 'table']) - func_output(CAP_MULTIPATH, 'multipathd_topology', multipathd_topology) - cmd_output(CAP_MULTIPATH, [MPPUTIL, '-a']) - if CAP_MULTIPATH in entries and collect_all_info: - dump_rdac_groups(CAP_MULTIPATH) - - tree_output(CAP_NETWORK_CONFIG, SYSCONFIG_NETWORK_SCRIPTS, IFCFG_RE) - tree_output(CAP_NETWORK_CONFIG, SYSCONFIG_NETWORK_SCRIPTS, ROUTE_RE) - tree_output(CAP_NETWORK_CONFIG, INTERFACESD) - file_output(CAP_NETWORK_CONFIG, [SYSCONFIG_NETWORK, RESOLV_CONF, - NSSWITCH_CONF, HOSTS, INTERFACES]) - file_output(CAP_NETWORK_CONFIG, - [NTP_CONF, IPTABLES_CONFIG, HOSTS_ALLOW, HOSTS_DENY]) - file_output(CAP_NETWORK_CONFIG, [OPENVSWITCH_DEFAULT_SWITCH, - OPENVSWITCH_SYSCONFIG_SWITCH]) - - cmd_output(CAP_NETWORK_INFO, [IP, 'addr', 'show']) - cmd_output(CAP_NETWORK_INFO, [ROUTE, '-n']) - cmd_output(CAP_NETWORK_INFO, [ARP, '-n']) - cmd_output(CAP_NETWORK_INFO, [NETSTAT, '-an']) - for dir in DHCP_LEASE_DIR: - tree_output(CAP_NETWORK_INFO, dir) - for table in ['filter', 'nat', 'mangle', 'raw', 'security']: - cmd_output(CAP_NETWORK_INFO, [IPTABLES, '-t', table, '-nL']) - for p in os.listdir('/sys/class/net/'): - try: - f = open('/sys/class/net/%s/type' % p, 'r') - t = f.readline() - f.close() - if os.path.islink('/sys/class/net/%s/device' % p) and int(t) == 1: - # ARPHRD_ETHER - cmd_output(CAP_NETWORK_INFO, [ETHTOOL, '-S', p]) - if not p.startswith('vif') and not p.startswith('tap'): - cmd_output(CAP_NETWORK_INFO, [ETHTOOL, p]) - cmd_output(CAP_NETWORK_INFO, [ETHTOOL, '-k', p]) - cmd_output(CAP_NETWORK_INFO, [ETHTOOL, '-i', p]) - cmd_output(CAP_NETWORK_INFO, [ETHTOOL, '-c', p]) - cmd_output(CAP_NETWORK_INFO, [ETHTOOL, '-l', p]) - if int(t) == 1: - cmd_output(CAP_NETWORK_INFO, - [TC, '-s', '-d', 'class', 'show', 'dev', p]) - except: - pass - tree_output(CAP_NETWORK_INFO, PROC_NET_BONDING_DIR) - tree_output(CAP_NETWORK_INFO, PROC_NET_VLAN_DIR) - cmd_output(CAP_NETWORK_INFO, [TC, '-s', 'qdisc']) - file_output(CAP_NETWORK_INFO, [PROC_NET_SOFTNET_STAT]) - - collect_ovsdb() - if os.path.exists(OPENVSWITCH_VSWITCHD_PID): - cmd_output(CAP_NETWORK_STATUS, [OVS_DPCTL, 'show', '-s']) - for d in dp_list(): - cmd_output(CAP_NETWORK_STATUS, [OVS_DPCTL, 'dump-flows', '-m', - d.decode()]) - - cmd_output(CAP_PROCESS_LIST, [PS, 'wwwaxf', '-eo', - 'pid,tty,stat,time,nice,psr,pcpu,pmem,nwchan,wchan:25,args'], - label='process-tree') - func_output(CAP_PROCESS_LIST, 'fd_usage', fd_usage) - - system_logs = ([VAR_LOG_DIR + x for x in - ['crit.log', 'kern.log', 'daemon.log', 'user.log', - 'syslog', 'messages', 'secure', 'debug', 'dmesg', 'boot']]) - for log in system_logs: - prefix_output(CAP_SYSTEM_LOGS, log, last_mod_time=log_last_mod_time) - - ovs_logs = ([OPENVSWITCH_LOG_DIR + x for x in - ['ovs-vswitchd.log', 'ovsdb-server.log', 'ovs-ctl.log']]) - for log in ovs_logs: - prefix_output(CAP_OPENVSWITCH_LOGS, log, - last_mod_time=log_last_mod_time) - - cmd_output(CAP_SYSTEM_LOGS, [DMESG]) - - cmd_output(CAP_SYSTEM_SERVICES, [CHKCONFIG, '--list']) - - tree_output(CAP_SYSTEM_LOGS, VAR_LOG_CORE_DIR) - - file_output(CAP_YUM, [YUM_LOG]) - tree_output(CAP_YUM, YUM_REPOS_DIR) - cmd_output(CAP_YUM, [RPM, '-qa']) - file_output(CAP_YUM, [APT_SOURCES_LIST]) - tree_output(CAP_YUM, APT_SOURCES_LIST_D) - cmd_output(CAP_YUM, [DPKG_QUERY, '-W', - '-f=${Package} ${Version} ${Status}\n'], 'dpkg-packages') - - # Filter out ovs relevant information if --ovs option passed - # else collect all information - filters = set() - if only_ovs_info: - filters.add('ovs') - ovs_info_caps = [CAP_NETWORK_STATUS, CAP_SYSTEM_LOGS, - CAP_OPENVSWITCH_LOGS, CAP_NETWORK_CONFIG] - ovs_info_list = ['process-tree'] - # We cannot use items(), since we modify 'data' as we pass through - for (k, v) in list(data.items()): - cap = v['cap'] - if 'filename' in v: - info = k[0] - else: - info = k - if info not in ovs_info_list and cap not in ovs_info_caps: - del data[k] - - if filters: - filter = ",".join(filters) - else: - filter = None - - try: - load_plugins(filter=filter) - except: - pass - - # permit the user to filter out data - # We cannot use items(), since we modify 'data' as we pass through - for (k, v) in list(data.items()): - cap = v['cap'] - if 'filename' in v: - key = k[0] - else: - key = k - if not ANSWER_YES_TO_ALL and not yes("Include '%s'? [Y/n]: " % key): - del data[k] - - # collect selected data now - output_ts('Running commands to collect data') - collect_data() - - subdir = "bug-report-%s" % time.strftime("%Y%m%d%H%M%S") - - # include inventory - data['inventory.xml'] = {'cap': None, - 'output': BytesIOmtime(make_inventory(data, subdir))} - - # create archive - if output_fd == -1: - if output_file is None: - dirname = BUG_DIR - else: - dirname = os.path.dirname(output_file) - if dirname and not os.path.exists(dirname): - try: - os.makedirs(dirname) - except: - pass - - if output_fd == -1: - output_ts('Creating output file') - - if output_type.startswith('tar'): - make_tar(subdir, output_type, output_fd, output_file) - else: - make_zip(subdir, output_file) - - if dbg: - print("Category sizes (max, actual):\n", file=sys.stderr) - for c in caps.keys(): - print(" %s (%d, %d)" % (c, caps[c][MAX_SIZE], cap_sizes[c]), - file=sys.stderr) - - cleanup_ovsdb() - return 0 - - -def dump_scsi_hosts(cap): - output = '' - scsi_list = os.listdir('/sys/class/scsi_host') - scsi_list.sort() - - for h in scsi_list: - procname = '' - try: - f = open('/sys/class/scsi_host/%s/proc_name' % h) - procname = f.readline().strip("\n") - f.close() - except: - pass - modelname = None - try: - f = open('/sys/class/scsi_host/%s/model_name' % h) - modelname = f.readline().strip("\n") - f.close() - except: - pass - - output += "%s:\n" % h - output += " %s%s\n" \ - % (procname, modelname and (" -> %s" % modelname) or '') - - return output - - -def module_info(cap): - output = BytesIO() - modules = open(PROC_MODULES, 'r') - procs = [] - - for line in modules: - module = line.split()[0] - procs.append(ProcOutput([MODINFO, module], - caps[cap][MAX_TIME], output)) - modules.close() - - run_procs([procs]) - - return output.getvalue() - - -def multipathd_topology(cap): - pipe = Popen([MULTIPATHD, '-k'], bufsize=1, stdin=PIPE, - stdout=PIPE, stderr=dev_null) - stdout, stderr = pipe.communicate('show topology') - - return stdout - - -def dp_list(): - output = BytesIO() - procs = [ProcOutput([OVS_DPCTL, 'dump-dps'], - caps[CAP_NETWORK_STATUS][MAX_TIME], output)] - - run_procs([procs]) - - if not procs[0].timed_out: - return output.getvalue().splitlines() - return [] - - -def collect_ovsdb(): - if not os.path.isfile(OPENVSWITCH_CONF_DB): - return - - max_size = 10 * MB - - try: - if os.path.getsize(OPENVSWITCH_CONF_DB) > max_size: - if os.path.isfile(OPENVSWITCH_COMPACT_DB): - os.unlink(OPENVSWITCH_COMPACT_DB) - - output = BytesIO() - max_time = 5 - procs = [ProcOutput(['ovsdb-tool', 'compact', - OPENVSWITCH_CONF_DB, OPENVSWITCH_COMPACT_DB], - max_time, output)] - run_procs([procs]) - file_output(CAP_NETWORK_STATUS, [OPENVSWITCH_COMPACT_DB]) - else: - file_output(CAP_NETWORK_STATUS, [OPENVSWITCH_CONF_DB]) - except OSError: - return - - -def cleanup_ovsdb(): - try: - if os.path.isfile(OPENVSWITCH_COMPACT_DB): - os.unlink(OPENVSWITCH_COMPACT_DB) - except: - return - - -def fd_usage(cap): - output = '' - fd_dict = {} - for d in [p for p in os.listdir('/proc') if p.isdigit()]: - try: - fh = open('/proc/' + d + '/cmdline') - name = fh.readline() - num_fds = len(os.listdir(os.path.join('/proc/' + d + '/fd'))) - if num_fds > 0: - if num_fds not in fd_dict: - fd_dict[num_fds] = [] - fd_dict[num_fds].append(name.replace('\0', ' ').strip()) - finally: - fh.close() - keys = fd_dict.keys() - keys.sort(lambda a, b: int(b) - int(a)) - for k in keys: - output += "%s: %s\n" % (k, str(fd_dict[k])) - return output - - -def dump_rdac_groups(cap): - output = BytesIO() - procs = [ProcOutput([MPPUTIL, '-a'], caps[cap][MAX_TIME], output)] - - run_procs([procs]) - - if not procs[0].timed_out: - proc_line = 0 - for line in output.getvalue().splitlines(): - if line.startswith('ID'): - proc_line = 2 - elif line.startswith('----'): - proc_line -= 1 - elif proc_line > 0: - group, _ = line.split(None, 1) - cmd_output(cap, [MPPUTIL, '-g', group]) - - -def load_plugins(just_capabilities=False, filter=None): - global log_last_mod_time - - def getText(nodelist): - rc = "" - for node in nodelist: - if node.nodeType == node.TEXT_NODE: - rc += node.data - return rc - - def getBoolAttr(el, attr, default=False): - ret = default - val = el.getAttribute(attr).lower() - if val in ['true', 'false', 'yes', 'no']: - ret = val in ['true', 'yes'] - return ret - - for dir in [d for d in os.listdir(PLUGIN_DIR) - if os.path.isdir(os.path.join(PLUGIN_DIR, d))]: - if dir not in caps: - if not os.path.exists("%s/%s.xml" % (PLUGIN_DIR, dir)): - continue - xmldoc = parse("%s/%s.xml" % (PLUGIN_DIR, dir)) - assert xmldoc.documentElement.tagName == "capability" - - pii, min_size, max_size, min_time, max_time, mime = \ - PII_MAYBE, -1, -1, -1, -1, MIME_TEXT - - if xmldoc.documentElement.getAttribute("pii") in \ - [PII_NO, PII_YES, PII_MAYBE, PII_IF_CUSTOMIZED]: - pii = xmldoc.documentElement.getAttribute("pii") - if xmldoc.documentElement.getAttribute("min_size") != '': - min_size = int( - xmldoc.documentElement.getAttribute("min_size")) - if xmldoc.documentElement.getAttribute("max_size") != '': - max_size = int( - xmldoc.documentElement.getAttribute("max_size")) - if xmldoc.documentElement.getAttribute("min_time") != '': - min_time = int(xmldoc.documentElement.getAttribute("min_time")) - if xmldoc.documentElement.getAttribute("max_time") != '': - max_time = int(xmldoc.documentElement.getAttribute("max_time")) - if xmldoc.documentElement.getAttribute("mime") in \ - [MIME_DATA, MIME_TEXT]: - mime = xmldoc.documentElement.getAttribute("mime") - checked = getBoolAttr(xmldoc.documentElement, 'checked', True) - hidden = getBoolAttr(xmldoc.documentElement, 'hidden', False) - - cap(dir, pii, min_size, max_size, min_time, max_time, mime, - checked, hidden) - - if just_capabilities: - continue - - plugdir = os.path.join(PLUGIN_DIR, dir) - for file in [f for f in os.listdir(plugdir) if f.endswith('.xml')]: - xmldoc = parse(os.path.join(plugdir, file)) - assert xmldoc.documentElement.tagName == "collect" - - for el in xmldoc.documentElement.getElementsByTagName("*"): - filters_tmp = el.getAttribute("filters") - if filters_tmp == '': - filters = [] - else: - filters = filters_tmp.split(',') - if not (filter is None or filter in filters): - continue - if el.tagName == "files": - newest_first = getBoolAttr(el, 'newest_first') - if el.getAttribute("type") == "logs": - for fn in getText(el.childNodes).split(): - prefix_output(dir, fn, newest_first=newest_first, - last_mod_time=log_last_mod_time) - else: - file_output(dir, getText(el.childNodes).split(), - newest_first=newest_first) - elif el.tagName == "directory": - pattern = el.getAttribute("pattern") - if pattern == '': - pattern = None - negate = getBoolAttr(el, 'negate') - newest_first = getBoolAttr(el, 'newest_first') - if el.getAttribute("type") == "logs": - tree_output(dir, getText(el.childNodes), - pattern and re.compile(pattern) or None, - negate=negate, newest_first=newest_first, - last_mod_time=log_last_mod_time) - else: - tree_output(dir, getText(el.childNodes), - pattern and re.compile(pattern) or None, - negate=negate, newest_first=newest_first) - elif el.tagName == "command": - label = el.getAttribute("label") - if label == '': - label = None - binary = getBoolAttr(el, 'binary') - try: - repeat_count = int(el.getAttribute("repeat")) - if repeat_count > 1: - cmd_output(dir, - DATE + ';' + getText(el.childNodes), - label, binary=binary, - repeat_count=repeat_count) - else: - cmd_output(dir, getText(el.childNodes), - label, binary=binary, - repeat_count=repeat_count) - except: - cmd_output(dir, getText(el.childNodes), label, - binary=binary) - - -def make_tar(subdir, suffix, output_fd, output_file): - global SILENT_MODE, data - - mode = 'w' - if suffix == 'tar.bz2': - mode = 'w:bz2' - elif suffix == 'tar.gz': - mode = 'w:gz' - - if output_fd == -1: - if output_file is None: - filename = "%s/%s.%s" % (BUG_DIR, subdir, suffix) - else: - filename = output_file - old_umask = os.umask(0o077) - tf = tarfile.open(filename, mode) - os.umask(old_umask) - else: - tf = tarfile.open(None, 'w', os.fdopen(output_fd, 'a')) - - try: - for (k, v) in data.items(): - try: - tar_filename = os.path.join(subdir, construct_filename(k, v)) - ti = tarfile.TarInfo(tar_filename) - - ti.uname = 'root' - ti.gname = 'root' - - if 'output' in v: - ti.mtime = v['output'].mtime - ti.size = len(v['output'].getvalue()) - v['output'].seek(0) - tf.addfile(ti, v['output']) - elif 'filename' in v: - s = os.stat(v['filename']) - ti.mtime = s.st_mtime - ti.size = s.st_size - tf.addfile(ti, open(v['filename'], 'rb')) - except: - pass - finally: - tf.close() - - if output_fd == -1: - output('Writing tarball %s successful.' % filename) - if SILENT_MODE: - print(filename) - - -def make_zip(subdir, output_file): - global SILENT_MODE, data - - if output_file is None: - filename = "%s/%s.zip" % (BUG_DIR, subdir) - else: - filename = output_file - old_umask = os.umask(0o077) - zf = zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED) - os.umask(old_umask) - - try: - for (k, v) in data.items(): - try: - dest = os.path.join(subdir, construct_filename(k, v)) - - if 'output' in v: - zf.writestr(dest, v['output'].getvalue()) - else: - if os.stat(v['filename']).st_size < 50: - compress_type = zipfile.ZIP_STORED - else: - compress_type = zipfile.ZIP_DEFLATED - zf.write(v['filename'], dest, compress_type) - except: - pass - finally: - zf.close() - - output('Writing archive %s successful.' % filename) - if SILENT_MODE: - print(filename) - - -def make_inventory(inventory, subdir): - document = getDOMImplementation().createDocument( - None, INVENTORY_XML_ROOT, None) - - # create summary entry - s = document.createElement(INVENTORY_XML_SUMMARY) - user = os.getenv('SUDO_USER', os.getenv('USER')) - if user: - s.setAttribute('user', user) - s.setAttribute('date', time.strftime('%c')) - s.setAttribute('hostname', platform.node()) - s.setAttribute('uname', ' '.join(platform.uname())) - s.setAttribute('uptime', check_output(UPTIME).decode()) - document.getElementsByTagName(INVENTORY_XML_ROOT)[0].appendChild(s) - - map(lambda k_v: inventory_entry(document, subdir, k_v[0], k_v[1]), - inventory.items()) - return document.toprettyxml().encode() - - -def inventory_entry(document, subdir, k, v): - try: - el = document.createElement(INVENTORY_XML_ELEMENT) - el.setAttribute('capability', v['cap']) - el.setAttribute('filename', - os.path.join(subdir, construct_filename(k, v))) - el.setAttribute('sha256sum', sha256(v)) - document.getElementsByTagName(INVENTORY_XML_ROOT)[0].appendChild(el) - except: - pass - - -def sha256(d): - m = hashlib.sha256() - if 'filename' in d: - f = open(d['filename']) - data = f.read(1024) - while len(data) > 0: - m.update(data) - data = f.read(1024) - f.close() - elif 'output' in d: - m.update(d['output'].getvalue()) - return m.hexdigest() - - -def construct_filename(k, v): - if 'filename' in v: - if v['filename'][0] == '/': - return v['filename'][1:] - else: - return v['filename'] - s = k.replace(' ', '-') - s = s.replace('--', '-') - s = s.replace('/', '%') - if s.find('.') == -1: - s += '.out' - - return s - - -def update_capabilities(): - pass - - -def update_cap_size(cap, size): - update_cap(cap, MIN_SIZE, size) - update_cap(cap, MAX_SIZE, size) - update_cap(cap, CHECKED, size > 0) - - -def update_cap(cap, k, v): - global caps - temp = list(caps[cap]) - temp[k] = v - caps[cap] = tuple(temp) - - -def size_of_dir(d, pattern=None, negate=False): - if os.path.isdir(d): - return size_of_all([os.path.join(d, fn) for fn in os.listdir(d)], - pattern, negate) - else: - return 0 - - -def size_of_all(files, pattern=None, negate=False): - return sum([size_of(f, pattern, negate) for f in files]) - - -def matches(f, pattern, negate): - if negate: - return not matches(f, pattern, False) - else: - return pattern is None or pattern.match(f) - - -def size_of(f, pattern, negate): - if os.path.isfile(f) and matches(f, pattern, negate): - return os.stat(f)[6] - else: - return size_of_dir(f, pattern, negate) - - -def print_capabilities(): - document = getDOMImplementation().createDocument( - "ns", CAP_XML_ROOT, None) - map(lambda key: capability(document, key), - [k for k in caps.keys() if not caps[k][HIDDEN]]) - print(document.toprettyxml()) - - -def capability(document, key): - c = caps[key] - el = document.createElement(CAP_XML_ELEMENT) - el.setAttribute('key', c[KEY]) - el.setAttribute('pii', c[PII]) - el.setAttribute('min-size', str(c[MIN_SIZE])) - el.setAttribute('max-size', str(c[MAX_SIZE])) - el.setAttribute('min-time', str(c[MIN_TIME])) - el.setAttribute('max-time', str(c[MAX_TIME])) - el.setAttribute('content-type', c[MIME]) - el.setAttribute('default-checked', c[CHECKED] and 'yes' or 'no') - document.getElementsByTagName(CAP_XML_ROOT)[0].appendChild(el) - - -def prettyDict(d): - format = '%%-%ds: %%s' % max(map(len, [k for k, _ in d.items()])) - return '\n'.join([format % i for i in d.items()]) + '\n' - - -def yes(prompt): - yn = input(prompt) - - return len(yn) == 0 or yn.lower()[0] == 'y' - - -partition_re = re.compile(r'(.*[0-9]+$)|(^xvd)') - - -def disk_list(): - disks = [] - try: - f = open('/proc/partitions') - f.readline() - f.readline() - for line in f.readlines(): - (major, minor, blocks, name) = line.split() - if int(major) < 254 and not partition_re.match(name): - disks.append(name) - f.close() - except: - pass - return disks - - -class ProcOutput(object): - debug = False - - def __init__(self, command, max_time, inst=None, filter=None, - binary=False): - self.command = command - self.max_time = max_time - self.inst = inst - self.running = False - self.status = None - self.timed_out = False - self.failed = False - self.timeout = int(time.time()) + self.max_time - self.filter = filter - self.filter_state = {} - if binary: - self.bufsize = 1048576 # 1MB buffer - else: - self.bufsize = 1 # line buffered - - def __del__(self): - self.terminate() - - def cmdAsStr(self): - return isinstance(self.command, list) \ - and ' '.join(self.command) or self.command - - def run(self): - self.timed_out = False - try: - if ProcOutput.debug: - output_ts("Starting '%s'" % self.cmdAsStr()) - self.proc = Popen(self.command, bufsize=self.bufsize, - stdin=dev_null, stdout=PIPE, stderr=dev_null, - shell=isinstance(self.command, str)) - old = fcntl.fcntl(self.proc.stdout.fileno(), fcntl.F_GETFD) - fcntl.fcntl(self.proc.stdout.fileno(), - fcntl.F_SETFD, old | fcntl.FD_CLOEXEC) - self.running = True - self.failed = False - except: - output_ts("'%s' failed" % self.cmdAsStr()) - self.running = False - self.failed = True - - def terminate(self): - if self.running: - try: - self.proc.stdout.close() - os.kill(self.proc.pid, SIGTERM) - except: - pass - self.proc = None - self.running = False - self.status = SIGTERM - - def read_line(self): - assert self.running - if self.bufsize == 1: - line = self.proc.stdout.readline() - else: - line = self.proc.stdout.read(self.bufsize) - if line == b'': - # process exited - self.proc.stdout.close() - self.status = self.proc.wait() - self.proc = None - self.running = False - else: - if self.filter: - line = self.filter(line, self.filter_state) - if self.inst: - self.inst.write(line) - - -def run_procs(procs): - while True: - pipes = [] - active_procs = [] - - for pp in procs: - for p in pp: - if p.running: - active_procs.append(p) - pipes.append(p.proc.stdout) - break - elif p.status is None and not p.failed and not p.timed_out: - p.run() - if p.running: - active_procs.append(p) - pipes.append(p.proc.stdout) - break - - if len(pipes) == 0: - # all finished - break - - (i, o, x) = select(pipes, [], [], 1.0) - now = int(time.time()) - - # handle process output - for p in active_procs: - if p.proc.stdout in i: - p.read_line() - - # handle timeout - if p.running and now > p.timeout: - output_ts("'%s' timed out" % p.cmdAsStr()) - if p.inst: - p.inst.write("\n** timeout **\n".encode()) - p.timed_out = True - p.terminate() - - -def pidof(name): - pids = [] - - for d in [p for p in os.listdir('/proc') if p.isdigit()]: - try: - if os.path.basename(os.readlink('/proc/%s/exe' % d)) == name: - pids.append(int(d)) - except: - pass - - return pids - - -def check_space(cap, name, size): - global free_disk_space - if free_disk_space is not None and size > free_disk_space: - output("Omitting %s, out of disk space (requested: %u, allowed: %u)" % - (name, size, free_disk_space)) - return False - elif unlimited_data or caps[cap][MAX_SIZE] == -1 or \ - cap_sizes[cap] < caps[cap][MAX_SIZE]: - cap_sizes[cap] += size - if free_disk_space is not None: - free_disk_space -= size - return True - else: - output("Omitting %s, size constraint of %s exceeded" % (name, cap)) - return False - - -def get_free_disk_space(path): - path = os.path.abspath(path) - while not os.path.exists(path): - path = os.path.dirname(path) - s = os.statvfs(path) - return s.f_frsize * s.f_bfree - - -class BytesIOmtime(BytesIO): - def __init__(self, buf=b''): - BytesIO.__init__(self, buf) - self.mtime = time.time() - - def write(self, s): - BytesIO.write(self, s) - self.mtime = time.time() - - -if __name__ == "__main__": - try: - sys.exit(main()) - except KeyboardInterrupt: - print("\nInterrupted.") - sys.exit(3) diff --git a/utilities/bugtool/plugins/kernel-info/openvswitch.xml b/utilities/bugtool/plugins/kernel-info/openvswitch.xml deleted file mode 100644 index 34110c4c3..000000000 --- a/utilities/bugtool/plugins/kernel-info/openvswitch.xml +++ /dev/null @@ -1,23 +0,0 @@ -<!-- - This library is free software; you can redistribute it and/or modify - it under the terms of version 2.1 of the GNU Lesser General Public - License as published by the Free Software Foundation. - - This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - USA. - - Copyright (C) 2011 Nicira, Inc. ---> - -<collect> - <files> - /proc/slabinfo - </files> -</collect> diff --git a/utilities/bugtool/plugins/network-status/openvswitch.xml b/utilities/bugtool/plugins/network-status/openvswitch.xml deleted file mode 100644 index 56e091feb..000000000 --- a/utilities/bugtool/plugins/network-status/openvswitch.xml +++ /dev/null @@ -1,47 +0,0 @@ -<!-- - This library is free software; you can redistribute it and/or modify - it under the terms of version 2.1 of the GNU Lesser General Public - License as published by the Free Software Foundation. - - This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - USA. - - Copyright (C) 2011, 2012 Nicira, Inc. ---> - -<collect> - <command label="tc-class-show" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-tc-class-show</command> - <command label="ovs-vsctl-show" filters="ovs">ovs-vsctl show</command> - <command label="get_other_config" filters="ovs">ovs-vsctl --no-wait get Open_vSwitch . other_config</command> - <command label="dump-ovsdb" filters="ovs">ovsdb-client -f csv dump unix:/var/run/openvswitch/db.sock Open_vSwitch</command> - <command label="ovs-appctl-fdb-show" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-fdb-show</command> - <command label="ovs-appctl-lacp-show" filters="ovs">ovs-appctl lacp/show</command> - <command label="ovs-appctl-cfm-show" filters="ovs">ovs-appctl cfm/show</command> - <command label="ovs-appctl-bfd-show" filters="ovs">ovs-appctl bfd/show</command> - <command label="ovs-appctl-conntrack-dump" filters="ovs">ovs-appctl dpctl/dump-conntrack</command> - <command label="ovs-appctl-coverage-show" filters="ovs">ovs-appctl coverage/show</command> - <command label="ovs-appctl-bond-show" filters="ovs">ovs-appctl bond/show</command> - <command label="ovs-appctl-memory-show" filters="ovs">ovs-appctl memory/show</command> - <command label="ovs-appctl-dpif" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-ovs-appctl-dpif</command> - <command label="ovs-appctl-list-dbs" filters="ovs">ovs-appctl -t ovsdb-server ovsdb-server/list-dbs</command> - <command label="ovs-appctl-dpctl-dump-flows-netdev" filters="ovs" repeat="2">ovs-appctl dpctl/dump-flows netdev@ovs-netdev</command> - <command label="ovs-appctl-dpctl-dump-flows-netdev-m" filters="ovs" repeat="2">ovs-appctl dpctl/dump-flows -m netdev@ovs-netdev</command> - <command label="ovs-appctl-dpctl-dump-flows-system" filters="ovs" repeat="2">ovs-appctl dpctl/dump-flows system@ovs-system</command> - <command label="ovs-appctl-dpctl-show-s" filters="ovs" repeat="2">ovs-appctl dpctl/show -s</command> - <command label="ovs-ofctl-show" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-ovs-ofctl-loop-over-bridges "show"</command> - <command label="ovs-ofctl-dump-flows" filters="ovs" repeat="2">/usr/share/openvswitch/scripts/ovs-bugtool-ovs-ofctl-loop-over-bridges "dump-flows"</command> - <command label="ovs-ofctl-dump-ports" filters="ovs" repeat="2">/usr/share/openvswitch/scripts/ovs-bugtool-ovs-ofctl-loop-over-bridges "dump-ports"</command> - <command label="ovs-ofctl-dump-groups" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-ovs-ofctl-loop-over-bridges "dump-groups"</command> - <command label="ovs-ofctl-dump-group-stats" filters="ovs" repeat="2">/usr/share/openvswitch/scripts/ovs-bugtool-ovs-ofctl-loop-over-bridges "dump-group-stats"</command> - <command label="ovs-ofctl-dump-tlv-map" filters="ovs" repeat="2">/usr/share/openvswitch/scripts/ovs-bugtool-ovs-ofctl-loop-over-bridges "dump-tlv-map"</command> - <command label="get_dpdk_nic_numa" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-get-dpdk-nic-numa</command> - <command label="get_device_stats" filters="ovs">ip -s -s link show</command> - <command label="get_port_stats" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-get-port-stats</command> -</collect> diff --git a/utilities/bugtool/plugins/system-configuration.xml b/utilities/bugtool/plugins/system-configuration.xml deleted file mode 100644 index a59a6981d..000000000 --- a/utilities/bugtool/plugins/system-configuration.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE bugtool SYSTEM "/usr/share/xen-bugtool/bugtool.xsd"> -<!-- - This library is free software; you can redistribute it and/or modify - it under the terms of version 2.1 of the GNU Lesser General Public - License as published by the Free Software Foundation. - - This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - USA. - - Copyright (C) 2011 Nicira, Inc. ---> -<capability pii="no" min_size="-1" max_size="1000000" min_time="-1" max_time="60" mime="text/plain" checked="true" hidden="true"> -</capability> diff --git a/utilities/bugtool/plugins/system-configuration/openvswitch.xml b/utilities/bugtool/plugins/system-configuration/openvswitch.xml deleted file mode 100644 index 27911111d..000000000 --- a/utilities/bugtool/plugins/system-configuration/openvswitch.xml +++ /dev/null @@ -1,47 +0,0 @@ -<!-- - This library is free software; you can redistribute it and/or modify - it under the terms of version 2.1 of the GNU Lesser General Public - License as published by the Free Software Foundation. - - This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - USA. - - Copyright (C) 2011 Nicira, Inc. ---> - -<collect> - <command label="timezone">date --rfc-3339=seconds</command> - <command label="ovs-daemons-ver" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-daemons-ver</command> - <command label="dpif-show" filters="ovs">ovs-appctl dpif/show</command> - <command label="installed_openvswitch_debs" filters="ovs">dpkg -l | grep openvswitch</command> - <command label="installed_dpdk_debs" filters="ovs">dpkg -l | grep dpdk</command> - <command label="hugepages" filters="ovs">grep -H "" /sys/kernel/mm/hugepages/hugepages*/*</command> - <command label="hugepages_numa" filters="ovs">grep -H "" /sys/devices/system/node/node*/hugepages/hugepages*/*</command> - <command label="ovs_vswitchd_cmdline" filters="ovs">ps -C ovs-vswitchd -f</command> - <command label="ovsdb_server_cmdline" filters="ovs">ps -C ovsdb-server -f</command> - <command label="ovs_vswitchd_threads" filters="ovs">ps H -C ovs-vswitchd -o 'pid tid cmd comm'</command> - <command label="ovs_rundir_ls-la" filters="ovs">ls -la /var/run/openvswitch/</command> - <command label="open_files_lsof-U" filters="ovs">lsof -U</command> - <command label="ovs_version" filters="ovs">ovs-vsctl --version</command> - <command label="virsh_list" filters="ovs">virsh list --all</command> - <command label="pmd-rxq-show" filters="ovs">ovs-appctl dpif-netdev/pmd-rxq-show</command> - <command label="lscpu" filters="ovs">lscpu</command> - <command label="ovs_vswitchd_threads_affinity" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-ovs-vswitchd-threads-affinity</command> - <command label="ovs_bridge_datapath_type" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-ovs-bridge-datapath-type</command> - <command label="qos_configs" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-qos-configs</command> - <files filters="ovs"> - /etc/default/openvswitch-switch - /etc/default/qemu-kvm - /etc/init/openvswitch-switch.conf - /etc/init/ovs-delay.conf - /etc/init.d/openvswitch-switch - /usr/share/openvswitch/scripts/ovs-ctl - </files> -</collect> diff --git a/utilities/bugtool/plugins/system-logs/openvswitch.xml b/utilities/bugtool/plugins/system-logs/openvswitch.xml deleted file mode 100644 index 0f17add75..000000000 --- a/utilities/bugtool/plugins/system-logs/openvswitch.xml +++ /dev/null @@ -1,39 +0,0 @@ -<!-- - This library is free software; you can redistribute it and/or modify - it under the terms of version 2.1 of the GNU Lesser General Public - License as published by the Free Software Foundation. - - This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - USA. - - Copyright (C) 2011, 2012 Nicira, Inc. ---> - -<collect> - <directory label="ovsdb-backups" filters="ovs" pattern=".*/conf.db.backup[0-9][^/]*$">/etc/openvswitch</directory> - <directory label="ovsdb-backups2" filters="ovs" pattern=".*/conf.db.backup[0-9][^/]*$">/var/lib/openvswitch</directory> - <command label="system_memory_status" filters="ovs">df -h</command> - <command label="check_number_of_pmds" filters="ovs">ovs-appctl dpif-netdev/pmd-perf-show | grep pmd</command> - <command label="ovs-appctl-vlog-list" filters="ovs">ovs-appctl vlog/list</command> - <command label="journalctl" filters="ovs">journalctl</command> - <command label="user_limits" filters="ovs">ulimit -a</command> - <files filters="ovs"> - /var/log/syslog - /var/log/daemon.log - /var/log/upstart/libvirt-bin.log - /var/log/upstart/ndevalarm.log - /var/log/upstart/nova-compute.log - /var/log/upstart/neutron-plugin-openvswitch-agent.log - /var/log/upstart/openvswitch-switch.log - /var/log/messages* - /var/log/secure - /var/log/dmesg* - </files> -</collect> diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py index 113c37109..3edd8192a 100755 --- a/utilities/checkpatch.py +++ b/utilities/checkpatch.py @@ -1070,8 +1070,6 @@ def ovs_checkpatch_parse(text, filename, author=None, committer=None): # for a common style. if current_file.startswith('include/sparse'): continue - if current_file.startswith('utilities/bugtool'): - continue run_checks(current_file, cmp_line, lineno) run_file_checks(text) -- 2.54.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
