ovs-bugtool: Restore RHEL support.
authorBen Pfaff <blp@nicira.com>
Thu, 30 Jun 2011 19:42:32 +0000 (12:42 -0700)
committerBen Pfaff <blp@nicira.com>
Tue, 12 Jul 2011 16:33:10 +0000 (09:33 -0700)
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.

debian/ovs-bugtool
debian/ovs-bugtool.8

index 65569649a043413e5517503cd74717b04e16fa23..4f0038e4ed04082496af3e7f9f5ef10fe62cfeca 100755 (executable)
@@ -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?
+
+    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,
+    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
index 28147e46014b7b1824f008de49415f797d82a974..6755d6adcf98732106cc34d9a21ace38930ab7e3 100644 (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.