X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=utilities%2Fbugtool%2Fovs-bugtool.in;h=baa0af783f1627de1a6f9d8d07766b77c0ee412f;hb=4e0abe6e1a3bc49b11870a90dc5ebffa003e00a0;hp=aa5b960db5710a853a4871e49fc20bd8e4ab06fa;hpb=00c7bf8b1309e1f974c1255acd99954bf5cb4530;p=sliver-openvswitch.git diff --git a/utilities/bugtool/ovs-bugtool.in b/utilities/bugtool/ovs-bugtool.in index aa5b960db..baa0af783 100755 --- a/utilities/bugtool/ovs-bugtool.in +++ b/utilities/bugtool/ovs-bugtool.in @@ -113,6 +113,7 @@ 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 = '@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' @@ -204,8 +205,9 @@ 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_OPENVSWITCH_LOGS = 'ovs-system-logs' CAP_PROCESS_LIST = 'process-list' CAP_SYSTEM_LOGS = 'system-logs' CAP_SYSTEM_SERVICES = 'system-services' @@ -220,6 +222,7 @@ unlimited_data = False dbg = False # Default value for the number of rotated logs. log_days = 20 +free_disk_space = None 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): @@ -232,7 +235,7 @@ 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=30*KB, +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) @@ -240,8 +243,10 @@ 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=40*KB) -cap(CAP_NETWORK_STATUS, PII_YES, max_size=50*MB, + 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) @@ -280,6 +285,7 @@ def cmd_output(cap, args, label=None, filter=None, binary=False): data[label] = {'cap': cap, 'cmd_args': args, 'filter': filter, 'binary': binary} + def file_output(cap, path_list, newest_first=False): """ If newest_first is True, the list of files in path_list is sorted @@ -298,12 +304,9 @@ def file_output(cap, path_list, newest_first=False): mtime = lambda(path, stat): stat.st_mtime path_entries.sort(key=mtime, reverse=newest_first) for p in path_entries: - if unlimited_data or caps[cap][MAX_SIZE] == -1 or \ - cap_sizes[cap] < caps[cap][MAX_SIZE]: + if check_space(cap, p[0], p[1].st_size): data[p] = {'cap': cap, 'filename': p[0]} - cap_sizes[cap] += p[1].st_size - else: - output("Omitting %s, size constraint of %s exceeded" % (p[0], cap)) + def tree_output(cap, path, pattern=None, negate=False, newest_first=False): """ @@ -350,12 +353,8 @@ def collect_data(): f = open(v['filename'], 'r') s = f.read() f.close() - if unlimited_data or caps[cap][MAX_SIZE] == -1 or \ - cap_sizes[cap] < caps[cap][MAX_SIZE]: + if check_space(cap, v['filename'], len(s)): v['output'] = StringIOmtime(s) - cap_sizes[cap] += len(s) - else: - output("Omitting %s, size constraint of %s exceeded" % (v['filename'], cap)) except: pass elif v.has_key('func'): @@ -363,19 +362,15 @@ def collect_data(): s = v['func'](cap) except Exception, e: s = str(e) - if unlimited_data or caps[cap][MAX_SIZE] == -1 or \ - cap_sizes[cap] < caps[cap][MAX_SIZE]: + if check_space(cap, k, len(s)): v['output'] = StringIOmtime(s) - cap_sizes[cap] += len(s) - else: - output("Omitting %s, size constraint of %s exceeded" % (k, cap)) run_procs(process_lists.values()) def main(argv=None): global ANSWER_YES_TO_ALL, SILENT_MODE - global entries, data, dbg, unlimited_data, log_days + global entries, data, dbg, unlimited_data, log_days, free_disk_space # Filter flags only_ovs_info = False @@ -462,6 +457,7 @@ def main(argv=None): if k == '--log-days': log_days = int(v) + if len(params) != 1: print >>sys.stderr, "Invalid additional arguments", str(params) return 2 @@ -474,6 +470,9 @@ def main(argv=None): print >>sys.stderr, "Cannot set both '--outfd' and '--outfile'" return 2 + if output_file is not None and not unlimited_data: + free_disk_space = get_free_disk_space(output_file) * 90 / 100 + if ANSWER_YES_TO_ALL: output("Warning: '--yestoall' argument provided, will not prompt for individual files.") @@ -540,16 +539,17 @@ exclude those logs from the archive. 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]) + file_output(CAP_NETWORK_CONFIG, [OPENVSWITCH_DEFAULT_SWITCH, + OPENVSWITCH_SYSCONFIG_SWITCH, OPENVSWITCH_DEFAULT_CONTROLLER]) - 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']) + cmd_output(CAP_NETWORK_INFO, [IFCONFIG, '-a']) + 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_STATUS, dir) + tree_output(CAP_NETWORK_INFO, dir) for table in ['filter', 'nat', 'mangle', 'raw', 'security']: - cmd_output(CAP_NETWORK_STATUS, [IPTABLES, '-t', table, '-nL']) + 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') @@ -557,21 +557,23 @@ exclude those logs from the archive. f.close() if os.path.islink('/sys/class/net/%s/device' % p) and int(t) == 1: # ARPHRD_ETHER - cmd_output(CAP_NETWORK_STATUS, [ETHTOOL, '-S', p]) + cmd_output(CAP_NETWORK_INFO, [ETHTOOL, '-S', p]) if not p.startswith('vif') and not p.startswith('tap'): - cmd_output(CAP_NETWORK_STATUS, [ETHTOOL, p]) - cmd_output(CAP_NETWORK_STATUS, [ETHTOOL, '-k', p]) - cmd_output(CAP_NETWORK_STATUS, [ETHTOOL, '-i', p]) - cmd_output(CAP_NETWORK_STATUS, [ETHTOOL, '-c', p]) + 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]) if int(t) == 1: - cmd_output(CAP_NETWORK_STATUS, + cmd_output(CAP_NETWORK_INFO, [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_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(): @@ -676,6 +678,8 @@ exclude those logs from the archive. for c in caps.keys(): print >>sys.stderr, " %s (%d, %d)" % (c, caps[c][MAX_SIZE], cap_sizes[c]) + + cleanup_ovsdb() return 0 def dump_scsi_hosts(cap): @@ -736,6 +740,36 @@ def dp_list(): 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 = StringIO.StringIO() + 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, e: + 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 = {} @@ -1209,6 +1243,31 @@ def pidof(name): 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 StringIOmtime(StringIO.StringIO): def __init__(self, buf=''): StringIO.StringIO.__init__(self, buf)