2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-17 14:28:02 +00:00

ovs-bugtool: Restore RHEL support.

ovs-bugtool was originally xen-bugtool from Citrix XenServer.  We modified
it for OVS by tailoring it to work better on Debian, updating file
locations and removing features that were specific to XenServer or that
work with packages not installed by default on Debian.

This commit reverts many of those changes.  This commit:

  - Adds back code that works with RHEL features not installed by default
    on Debian (but not XenServer-specific features, since xen-bugtool works
    nicely on XenServer).

  - Switches from hard-coded paths for utilities to searching the
    superuser's typical $PATH (because RHEL and Debian disagree on the
    location for some utilities).

  - In a few cases merges lists, e.g. now it looks for logs under the names
    used in both Debian and RHEL.

  - Fixes a few spurious differences between ovs-bugtool and xen-bugtool,
    e.g. in white space.
This commit is contained in:
Ben Pfaff
2011-06-30 12:42:32 -07:00
parent 1b3a91b5a3
commit 899d3c2d24
2 changed files with 172 additions and 70 deletions

208
debian/ovs-bugtool vendored
View File

@@ -75,6 +75,10 @@ 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'
LVM_CACHE = '/etc/lvm/cache/.cache'
LVM_CONFIG = '/etc/lvm/lvm.conf'
PROC_CPUINFO = '/proc/cpuinfo'
PROC_MEMINFO = '/proc/meminfo'
PROC_IOPORTS = '/proc/ioports'
@@ -87,17 +91,30 @@ PROC_FILESYSTEMS = '/proc/filesystems'
PROC_CMDLINE = '/proc/cmdline'
PROC_CONFIG = '/proc/config.gz'
PROC_USB_DEV = '/proc/bus/usb/devices'
PROC_XEN_BALLOON = '/proc/xen/balloon'
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'
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/dhcp3'
DHCP_LEASE_DIR = ['/var/lib/dhclient', '/var/lib/dhcp3']
OPENVSWITCH_LOG_DIR = '/var/log/openvswitch'
OPENVSWITCH_DEFAULT_SWITCH = '/etc/default/openvswitch-switch'
OPENVSWITCH_DEFAULT_SWITCH = '/etc/default/openvswitch-switch' # Debian
OPENVSWITCH_SYSCONFIG_SWITCH = '/etc/sysconfig/openvswitch' # RHEL
OPENVSWITCH_DEFAULT_CONTROLLER = '/etc/default/openvswitch-controller'
OPENVSWITCH_CONF_DB = '/etc/openvswitch/conf.db'
OPENVSWITCH_VSWITCHD_PID = '/var/run/openvswitch/ovs-vswitchd.pid'
@@ -108,42 +125,56 @@ X11_LOGS_DIR = VAR_LOG_DIR
X11_LOGS_RE = re.compile(r'.*/Xorg\..*$')
X11_AUTH_DIR = '/root/'
X11_AUTH_RE = re.compile(r'.*/\.((Xauthority)|(serverauth\.[0-9]*))$')
YUM_LOG = '/var/log/yum.log'
YUM_REPOS_DIR = '/etc/yum.repos.d'
PAM_DIR = '/etc/pam.d'
KRB5_CONF = '/etc/krb5.conf'
#
# External programs
#
ARP = '/usr/sbin/arp'
CAT = '/bin/cat'
DF = '/bin/df'
DMESG = '/bin/dmesg'
DMIDECODE = '/usr/sbin/dmidecode'
FDISK = '/sbin/fdisk'
FIND = '/usr/bin/find'
IFCONFIG = '/sbin/ifconfig'
IPTABLES = '/sbin/iptables'
LOSETUP = '/sbin/losetup'
LS = '/bin/ls'
LSPCI = '/usr/bin/lspci'
MD5SUM = '/usr/bin/md5sum'
MODINFO = '/sbin/modinfo'
NETSTAT = '/bin/netstat'
OVS_DPCTL = '/usr/sbin/ovs-dpctl'
OVS_OFCTL = '/usr/sbin/ovs-ofctl'
OVS_VSCTL = '/usr/sbin/ovs-vsctl'
OVS_APPCTL = '/usr/sbin/ovs-appctl'
PS = '/bin/ps'
ROUTE = '/sbin/route'
SYSCTL = '/sbin/sysctl'
TC = '/sbin/tc'
UPTIME = '/usr/bin/uptime'
ZCAT = '/bin/zcat'
ETHTOOL = '/sbin/ethtool'
# ETHTOOL recently moved from /usr/sbin to /sbin in debian
if not os.path.isfile(ETHTOOL):
ETHTOOL = '/usr/sbin/ethtool'
os.environ['PATH'] = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
ARP = 'arp'
BRCTL = 'brctl'
CAT = 'cat'
CHKCONFIG = 'chkconfig'
DF = 'df'
DMESG = 'dmesg'
DMIDECODE = 'dmidecode'
DMSETUP = 'dmsetup'
ETHTOOL = 'ethtool'
FDISK = 'fdisk'
FIND = 'find'
HDPARM = 'hdparm'
IFCONFIG = 'ifconfig'
IPTABLES = 'iptables'
ISCSIADM = 'iscsiadm'
LOSETUP = 'losetup'
LS = 'ls'
LSPCI = 'lspci'
LVDISPLAY = 'lvdisplay'
LVS = 'lvs'
MD5SUM = 'md5sum'
MODINFO = 'modinfo'
MPPUTIL = 'mppUtil'
MULTIPATHD = 'multipathd'
NETSTAT = 'netstat'
OVS_DPCTL = 'ovs-dpctl'
OVS_OFCTL = 'ovs-ofctl'
OVS_VSCTL = 'ovs-vsctl'
OVS_APPCTL = 'ovs-appctl'
PS = 'ps'
PVS = 'pvs'
ROUTE = 'route'
RPM = 'rpm'
SG_MAP = 'sg_map'
SYSCTL = 'sysctl'
TC = 'tc'
UPTIME = 'uptime'
VGS = 'vgs'
VGSCAN = 'vgscan'
ZCAT = 'zcat'
#
# PII -- Personally identifiable information. Of particular concern are
@@ -190,11 +221,11 @@ CAP_COLLECTD_LOGS = 'collectd-logs'
CAP_DISK_INFO = 'disk-info'
CAP_FIRSTBOOT = 'firstboot'
CAP_HARDWARE_INFO = 'hardware-info'
CAP_HDPARM_T = 'hdparm-t'
CAP_HIGH_AVAILABILITY = 'high-availability'
CAP_HOST_CRASHDUMP_DUMPS = 'host-crashdump-dumps'
CAP_HOST_CRASHDUMP_LOGS = 'host-crashdump-logs'
CAP_KERNEL_INFO = 'kernel-info'
CAP_LOSETUP_A = 'loopback-devices'
CAP_MULTIPATH = 'multipath'
CAP_NETWORK_CONFIG = 'network-config'
CAP_NETWORK_STATUS = 'network-status'
CAP_OEM = 'oem'
@@ -207,6 +238,7 @@ CAP_VNCTERM = 'vncterm'
CAP_WLB = 'wlb'
CAP_X11_LOGS = 'X11'
CAP_X11_AUTH = 'X11-auth'
CAP_YUM = 'yum'
KB = 1024
MB = 1024 * 1024
@@ -228,22 +260,24 @@ cap(CAP_BOOT_LOADER, PII_NO, max_size=3*KB,
max_time=5)
cap(CAP_COLLECTD_LOGS, PII_MAYBE, max_size=50*MB,
max_time=5)
cap(CAP_DISK_INFO, PII_MAYBE, max_size=25*KB,
cap(CAP_DISK_INFO, PII_MAYBE, max_size=50*KB,
max_time=20)
cap(CAP_FIRSTBOOT, PII_YES, min_size=60*KB, max_size=80*KB)
cap(CAP_HARDWARE_INFO, PII_MAYBE, max_size=30*KB,
max_time=20)
cap(CAP_HDPARM_T, PII_NO, min_size=0, max_size=5*KB,
min_time=20, max_time=90, checked=False, hidden=True)
cap(CAP_HIGH_AVAILABILITY, PII_MAYBE, max_size=5*MB)
cap(CAP_HOST_CRASHDUMP_DUMPS,PII_YES, checked = False)
cap(CAP_HOST_CRASHDUMP_LOGS, PII_NO)
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=20*KB)
cap(CAP_NETWORK_STATUS, PII_YES, max_size=19*KB,
min_size=0, max_size=40*KB)
cap(CAP_NETWORK_STATUS, PII_YES, max_size=50*KB,
max_time=30)
cap(CAP_PAM, PII_NO, max_size=30*KB)
cap(CAP_PAM, PII_NO, max_size=50*KB)
cap(CAP_PERSISTENT_STATS, PII_MAYBE, max_size=50*MB,
max_time=60)
cap(CAP_PROCESS_LIST, PII_YES, max_size=30*KB,
@@ -257,6 +291,8 @@ cap(CAP_WLB, PII_NO, max_size=3*MB,
max_time=20)
cap(CAP_X11_LOGS, PII_NO, max_size=100*KB)
cap(CAP_X11_AUTH, PII_NO, max_size=100*KB)
cap(CAP_YUM, PII_IF_CUSTOMIZED, max_size=10*KB,
max_time=30)
ANSWER_YES_TO_ALL = False
SILENT_MODE = False
@@ -468,41 +504,67 @@ exclude those logs from the archive.
tree_output(CAP_COLLECTD_LOGS, COLLECTD_LOGS_DIR)
cmd_output(CAP_DISK_INFO, [FDISK, '-l'])
file_output(CAP_DISK_INFO, [PROC_PARTITIONS, PROC_MOUNTS])
file_output(CAP_DISK_INFO, [FSTAB])
file_output(CAP_DISK_INFO, [FSTAB, ISCSI_CONF, ISCSI_INITIATOR])
cmd_output(CAP_DISK_INFO, [DF, '-alT'])
cmd_output(CAP_DISK_INFO, [DF, '-alTi'])
for d in disk_list():
cmd_output(CAP_DISK_INFO, [HDPARM, '-I', '/dev/%s' % d])
if len(pidof('iscsid')) != 0:
cmd_output(CAP_DISK_INFO, [ISCSIADM, '-m', 'node'])
cmd_output(CAP_DISK_INFO, [VGSCAN])
cmd_output(CAP_DISK_INFO, [PVS])
cmd_output(CAP_DISK_INFO, [VGS])
cmd_output(CAP_DISK_INFO, [LVS])
file_output(CAP_DISK_INFO, [LVM_CACHE, LVM_CONFIG])
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)
cmd_output(CAP_DISK_INFO, [LVDISPLAY, '--map'])
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'])
# FIXME IDE?
file_output(CAP_KERNEL_INFO, [PROC_VERSION, PROC_MODULES, PROC_DEVICES,
for d in disk_list():
cmd_output(CAP_HDPARM_T, [HDPARM, '-tT', '/dev/%s' % d])
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_NETWORK_CONFIG, [RESOLV_CONF, NSSWITCH_CONF, HOSTS])
file_output(CAP_NETWORK_CONFIG, [NTP_CONF, HOSTS_ALLOW, HOSTS_DENY])
file_output(CAP_NETWORK_CONFIG, [OPENVSWITCH_DEFAULT_SWITCH,
OPENVSWITCH_DEFAULT_CONTROLLER, OPENVSWITCH_CONF_DB])
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:
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)
file_output(CAP_NETWORK_CONFIG, [SYSCONFIG_NETWORK, RESOLV_CONF, NSSWITCH_CONF, HOSTS])
file_output(CAP_NETWORK_CONFIG, [NTP_CONF, IPTABLES_CONFIG, HOSTS_ALLOW, HOSTS_DENY])
file_output(CAP_NETWORK_CONFIG, [OPENVSWITCH_CONF_DB])
cmd_output(CAP_NETWORK_STATUS, [IFCONFIG, '-a'])
cmd_output(CAP_NETWORK_STATUS, [ROUTE, '-n'])
cmd_output(CAP_NETWORK_STATUS, [ARP, '-n'])
cmd_output(CAP_NETWORK_STATUS, [NETSTAT, '-an'])
tree_output(CAP_NETWORK_STATUS, DHCP_LEASE_DIR)
for dir in DHCP_LEASE_DIR:
tree_output(CAP_NETWORK_STATUS, dir)
cmd_output(CAP_NETWORK_STATUS, [BRCTL, 'show'])
cmd_output(CAP_NETWORK_STATUS, [IPTABLES, '-nL'])
for p in os.listdir('/sys/class/net/'):
try:
@@ -520,6 +582,8 @@ exclude those logs from the archive.
[TC, '-s', '-d', 'class', 'show', 'dev', p])
except:
pass
tree_output(CAP_NETWORK_STATUS, PROC_NET_BONDING_DIR)
tree_output(CAP_NETWORK_STATUS, PROC_NET_VLAN_DIR)
cmd_output(CAP_NETWORK_STATUS, [TC, '-s', 'qdisc'])
file_output(CAP_NETWORK_STATUS, [PROC_NET_SOFTNET_STAT])
tree_output(CAP_NETWORK_STATUS, OPENVSWITCH_LOG_DIR)
@@ -541,33 +605,40 @@ exclude those logs from the archive.
pass
tree_output(CAP_PAM, PAM_DIR)
file_output(CAP_PAM, [KRB5_CONF])
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)
file_output(CAP_SYSTEM_LOGS,
[ VAR_LOG_DIR + x for x in
[ 'kern.log', 'daemon.log', 'user.log', 'syslog', 'messages',
'debug', 'dmesg', 'boot'] +
[ 'crit.log', 'kern.log', 'daemon.log', 'user.log', 'syslog',
'messages', 'secure', 'debug', 'dmesg', 'boot'] +
[ f % n for n in range(1, 20) \
for f in ['kern.log.%d', 'kern.log.%d.gz',
for f in ['crit.log.%d', 'crit.log.%d.gz',
'kern.log.%d', 'kern.log.%d.gz',
'daemon.log.%d', 'daemon.log.%d.gz',
'user.log.%d', 'user.log.%d.gz',
'messages.%d', 'messages.%d.gz']]])
'messages.%d', 'messages.%d.gz',
'syslog.%d', 'syslog.%d.gz']]])
if not os.path.exists('/var/log/dmesg') and not os.path.exists('/var/log/boot'):
cmd_output(CAP_SYSTEM_LOGS, [DMESG])
cmd_output(CAP_SYSTEM_SERVICES, [CHKCONFIG, '--list'])
tree_output(CAP_X11_LOGS, X11_LOGS_DIR, X11_LOGS_RE)
tree_output(CAP_X11_AUTH, X11_AUTH_DIR, X11_AUTH_RE)
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'])
try:
load_plugins()
except:
pass
# permit the user to filter out data
for k in sorted(data.keys()):
if not ANSWER_YES_TO_ALL and not yes("Include '%s'? [Y/n]: " % k):
@@ -684,6 +755,14 @@ def module_info(cap):
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 = StringIO.StringIO()
procs = [ProcOutput([OVS_DPCTL, 'dump-dps'], caps[CAP_NETWORK_STATUS][MAX_TIME], output)]
@@ -725,6 +804,23 @@ def fd_usage(cap):
output += "%s: %s\n" % (k, str(fd_dict[k]))
return output
def dump_rdac_groups(cap):
output = StringIO.StringIO()
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):
def getText(nodelist):
rc = ""
@@ -739,7 +835,7 @@ def load_plugins(just_capabilities = False):
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 not caps.has_key(dir):
if not os.path.exists("%s/%s.xml" % (PLUGIN_DIR, dir)):
@@ -769,7 +865,7 @@ def load_plugins(just_capabilities = False):
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))
@@ -862,7 +958,7 @@ def make_zip(subdir, output_file):
pass
finally:
zf.close()
output ('Writing archive %s successful.' % filename)
if SILENT_MODE:
print filename

34
debian/ovs-bugtool.8 vendored
View File

@@ -4,43 +4,49 @@
. ns
. IP "\\$1"
..
.TH ovs\-bugtool 8 "September 2010" "Open vSwitch" "Open vSwitch Manual"
.TH ovs\-bugtool 8 "June 2011" "Open vSwitch" "Open vSwitch Manual"
.\" This program's name:
.ds PN ovs\-bugtool
.
.SH NAME
ovs\-bugtool \- Open vSwitch
ovs\-bugtool \- Open vSwitch bug reporting utility
.
.SH SYNOPSIS
.B ovs\-bugtool
.
.SH DESCRIPTION
Generate a debug bundle with useful information about Open vSwitch on this
system. The bundle is placed in /var/log/openvswitch.
system and places it in \fB/var/log/ovs-bugtool\fR.
.
.SH OPTIONS
.
.IP "\fB\-\-all\fR"
use all available capabilities.
Use all available capabilities.
.
.IP "\fB\-\-capabilities\fR"
list \fBovs\-bugtool\fR capabilities.
List \fBovs\-bugtool\fR capabilities.
.
.IP "\fB\-\-debug\fR"
print verbose debugging output.
Print verbose debugging output.
.
.IP "\fB\-\-entries=\fIlist\fR\fR"
use the capabilities specified in a comma separated list.
.IP "\fB\-\-entries=\fIlist\fR"
Use the capabilities specified in a comma-separated list.
.
.IP "\fB\-\-output=\fIfiletype\fR\fR"
generate a debug bundle with the specified file type. Options include \fBtar\fR,
\fBtar.bz2\fR, and \fBzip\fR.
.IP "\fB\-\-output=\fIfiletype\fR"
Generate a debug bundle with the specified file type. Options include
\fBtar\fR, \fBtar.gz\fR, \fBtar.bz2\fR, and \fBzip\fR.
.
.IP "\fB\-\-silent\fR"
suppress output.
Suppress output.
.
.IP "\fB\-\-unlimited\fR"
do not exclude files which are too large.
Do not exclude files which are too large.
.
.IP "\fB\-\-yestoall\fR"
answer yes to all prompts.
Answer yes to all prompts.
.
.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.