Skip to content

Commit

Permalink
ovs-bugtool: Added --ovs option to get only ovs related information
Browse files Browse the repository at this point in the history
Option --ovs is added for ovs-bugtool command to collect
only OpenvSwitch relevant information. To perform
filtering in plugins, a new xml attribute filters="ovs" (optional)
would be required in element 'command','files','directory' in
openvswitch.xml. Value of 'filters' attribute will be compared
with filtering option in load_plugins to get all relevant operation
to collect information. If no "--ovs" option is passed then it will
behave as earlier.

Fixed an issue which occurs in scenario where option '--yestoall'
is not passed and user keeps entering "y" or "n" on prompt.

Plus, trailing whitespaces are fixed. White space before '=' and
after in function def and call is also fixed.

Signed-off-by: Arun Sharma <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
Arun Sharma authored and blp committed Jul 19, 2012
1 parent e878338 commit b592e72
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 30 deletions.
1 change: 1 addition & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
post-v1.8.0
------------------------
- ovs-bugtool: New --ovs option to report only OVS related information.
- New %t and %T log escapes to identify the subprogram within a
cooperating group of processes or threads that emitted a log message.
The default log patterns now include this information.
Expand Down
3 changes: 3 additions & 0 deletions utilities/bugtool/ovs-bugtool.8
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ system and places it in \fB/var/log/ovs-bugtool\fR.
.IP "\fB\-\-all\fR"
Use all available capabilities.
.
.IP "\fB\-\-ovs\fR"
Use only Open vSwitch relevant capabilities.
.
.IP "\fB\-\-capabilities\fR"
List \fBovs\-bugtool\fR capabilities.
.
Expand Down
85 changes: 65 additions & 20 deletions utilities/bugtool/ovs-bugtool.in
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ def output(x):
def output_ts(x):
output("[%s] %s" % (time.strftime("%x %X %Z"), x))

def cmd_output(cap, args, label = None, filter = None):
def cmd_output(cap, args, label=None, filter=None):
if cap in entries:
if not label:
if isinstance(args, list):
Expand Down Expand Up @@ -400,10 +400,14 @@ def collect_data():
run_procs(process_lists.values())


def main(argv = None):
def main(argv=None):
global ANSWER_YES_TO_ALL, SILENT_MODE
global entries, data, dbg, unlimited_data

# Filter flags
only_ovs_info = False
collect_all_info = True

# we need access to privileged files, exit if we are not running as root
if os.getuid() != 0:
print >>sys.stderr, "Error: ovs-bugtool must be run as root"
Expand All @@ -420,7 +424,7 @@ def main(argv = None):
(options, params) = getopt.gnu_getopt(
argv, 'sy', ['capabilities', 'silent', 'yestoall', 'entries=',
'output=', 'outfd=', 'outfile=', 'all', 'unlimited',
'debug'])
'debug', 'ovs'])
except getopt.GetoptError, opterr:
print >>sys.stderr, opterr
return 2
Expand Down Expand Up @@ -478,6 +482,10 @@ def main(argv = None):
dbg = True
ProcOutput.debug = True

if k == '--ovs':
only_ovs_info = True
collect_all_info = False

if len(params) != 1:
print >>sys.stderr, "Invalid additional arguments", str(params)
return 2
Expand Down Expand Up @@ -547,7 +555,7 @@ exclude those logs from the archive.
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'])
Expand All @@ -561,7 +569,7 @@ exclude those logs from the archive.
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:
if CAP_MULTIPATH in entries and collect_all_info:
dump_rdac_groups(CAP_MULTIPATH)

tree_output(CAP_NETWORK_CONFIG, SYSCONFIG_NETWORK_SCRIPTS, IFCFG_RE)
Expand Down Expand Up @@ -650,15 +658,44 @@ exclude those logs from the archive.
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_NETWORK_CONFIG]
ovs_info_list = ['process-tree']
# We cannot use iteritems, since we modify 'data' as we pass through
for (k, v) in 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()
load_plugins(filter=filter)
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):
del data[k]
# We cannot use iteritems, since we modify 'data' as we pass through
for (k, v) in sorted(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')
Expand Down Expand Up @@ -773,7 +810,7 @@ def module_info(cap):


def multipathd_topology(cap):
pipe = Popen([MULTIPATHD, '-k'], bufsize=1, stdin=PIPE,
pipe = Popen([MULTIPATHD, '-k'], bufsize=1, stdin=PIPE,
stdout=PIPE, stderr=dev_null)
stdout, stderr = pipe.communicate('show topology')

Expand Down Expand Up @@ -837,21 +874,21 @@ def dump_rdac_groups(cap):
group, _ = line.split(None, 1)
cmd_output(cap, [MPPUTIL, '-g', group])

def load_plugins(just_capabilities = False):
def load_plugins(just_capabilities=False, filter=None):
def getText(nodelist):
rc = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc += node.data
return rc.encode()

def getBoolAttr(el, attr, default = False):
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 not caps.has_key(dir):
if not os.path.exists("%s/%s.xml" % (PLUGIN_DIR, dir)):
Expand Down Expand Up @@ -881,13 +918,20 @@ 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))
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')
file_output(dir, getText(el.childNodes).split(),
Expand All @@ -897,7 +941,8 @@ def load_plugins(just_capabilities = False):
if pattern == '': pattern = None
negate = getBoolAttr(el, 'negate')
newest_first = getBoolAttr(el, 'newest_first')
tree_output(dir, getText(el.childNodes), pattern and re.compile(pattern) or None,
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")
Expand Down Expand Up @@ -982,7 +1027,7 @@ def make_zip(subdir, output_file):
pass
finally:
zf.close()

output ('Writing archive %s successful.' % filename)
if SILENT_MODE:
print filename
Expand Down Expand Up @@ -1062,15 +1107,15 @@ def update_cap(cap, k, v):
caps[cap] = tuple(l)


def size_of_dir(d, pattern = None, negate = False):
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):
def size_of_all(files, pattern=None, negate=False):
return sum([size_of(f, pattern, negate) for f in files])


Expand Down Expand Up @@ -1252,7 +1297,7 @@ def pidof(name):


class StringIOmtime(StringIO.StringIO):
def __init__(self, buf = ''):
def __init__(self, buf=''):
StringIO.StringIO.__init__(self, buf)
self.mtime = time.time()

Expand Down
16 changes: 8 additions & 8 deletions utilities/bugtool/plugins/network-status/openvswitch.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@
-->

<collect>
<command label="tc-class-show">/usr/share/openvswitch/scripts/ovs-bugtool-tc-class-show</command>
<command label="ovs-vsctl-show">/usr/share/openvswitch/scripts/ovs-bugtool-vsctl-show</command>
<command label="dump-ovsdb">/usr/share/openvswitch/scripts/ovs-bugtool-ovsdb-dump</command>
<command label="ovs-appctl-lacp-show">/usr/share/openvswitch/scripts/ovs-bugtool-lacp-show</command>
<command label="ovs-appctl-cfm-show">/usr/share/openvswitch/scripts/ovs-bugtool-cfm-show</command>
<command label="ovs-appctl-coverage-show">/usr/share/openvswitch/scripts/ovs-bugtool-coverage-show</command>
<command label="ovs-appctl-bond-show">/usr/share/openvswitch/scripts/ovs-bugtool-bond-show</command>
<command label="ovs-appctl-memory-show">/usr/share/openvswitch/scripts/ovs-bugtool-memory-show</command>
<command label="tc-class-show" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-tc-class-show</command>
<command label="ovs-vsctl-show" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-vsctl-show</command>
<command label="dump-ovsdb" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-ovsdb-dump</command>
<command label="ovs-appctl-lacp-show" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-lacp-show</command>
<command label="ovs-appctl-cfm-show" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-cfm-show</command>
<command label="ovs-appctl-coverage-show" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-coverage-show</command>
<command label="ovs-appctl-bond-show" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-bond-show</command>
<command label="ovs-appctl-memory-show" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-memory-show</command>
</collect>
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,5 @@

<collect>
<command label="timezone">date --rfc-3339=seconds</command>
<command label="ovs-daemons-ver">/usr/share/openvswitch/scripts/ovs-bugtool-daemons-ver</command>
<command label="ovs-daemons-ver" filters="ovs">/usr/share/openvswitch/scripts/ovs-bugtool-daemons-ver</command>
</collect>
2 changes: 1 addition & 1 deletion utilities/bugtool/plugins/system-logs/openvswitch.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@
-->

<collect>
<directory label="ovsdb-backups" pattern=".*/conf.db.backup[0-9][^/]*$">/etc/openvswitch</directory>
<directory label="ovsdb-backups" filters="ovs" pattern=".*/conf.db.backup[0-9][^/]*$">/etc/openvswitch</directory>
</collect>

0 comments on commit b592e72

Please sign in to comment.