Add support for the -f/--file option to allow parsing of data from an arbitrary file instead of /proc/self/mountstats. Signed-off-by: Scott Mayhew <smayhew@xxxxxxxxxx> --- tools/mountstats/mountstats.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py index 3419c7a..ddaa6c4 100644 --- a/tools/mountstats/mountstats.py +++ b/tools/mountstats/mountstats.py @@ -522,7 +522,7 @@ class DeviceData: self.__print_rpc_op_stats('WRITE', sample_time) sys.stdout.flush() -def parse_stats_file(filename): +def parse_stats_file(f): """pop the contents of a mountstats file into a dictionary, keyed by mount point. each value object is a list of the lines in the mountstats file corresponding to the mount @@ -531,7 +531,7 @@ def parse_stats_file(filename): ms_dict = dict() key = '' - f = open(filename) + f.seek(0) for line in f.readlines(): words = line.split() if len(words) == 0: @@ -545,14 +545,13 @@ def parse_stats_file(filename): else: new += [ line.strip() ] ms_dict[key] = new - f.close return ms_dict def mountstats_command(args): """Mountstats command """ - mountstats = parse_stats_file('/proc/self/mountstats') + mountstats = parse_stats_file(args.infile) for mp in args.mountpoints: if mp not in mountstats: @@ -579,6 +578,8 @@ def mountstats_command(args): stats.display_rpc_generic_stats() stats.display_rpc_op_stats() + args.infile.close() + def nfsstat_command(args): return @@ -597,7 +598,7 @@ def print_iostat_summary(old, new, devices, time): def iostat_command(args): """iostat-like command for NFS mount points """ - mountstats = parse_stats_file('/proc/self/mountstats') + mountstats = parse_stats_file(args.infile) devices = args.mountpoints # make certain devices contains only NFS mount points @@ -605,9 +606,12 @@ def iostat_command(args): check = [] for device in devices: stats = DeviceData() - stats.parse_stats(mountstats[device]) - if stats.is_nfs_mountpoint(): - check += [device] + try: + stats.parse_stats(mountstats[device]) + if stats.is_nfs_mountpoint(): + check += [device] + except KeyError: + continue devices = check else: for device, descr in mountstats.items(): @@ -633,7 +637,7 @@ def iostat_command(args): old_mountstats = mountstats time.sleep(args.interval) sample_time = args.interval - mountstats = parse_stats_file('/proc/self/mountstats') + mountstats = parse_stats_file(args.infile) count -= 1 else: while True: @@ -641,7 +645,9 @@ def iostat_command(args): old_mountstats = mountstats time.sleep(args.interval) sample_time = args.interval - mountstats = parse_stats_file('/proc/self/mountstats') + mountstats = parse_stats_file(args.infile) + + args.infile.close() class ICMAction(argparse.Action): """Custom action to deal with interval, count, and mountpoints. @@ -660,6 +666,8 @@ class ICMAction(argparse.Action): def _handle_one(self, namespace, value): try: intval = int(value) + if namespace.infile.name != '/proc/self/mountstats': + raise argparse.ArgumentError(self, "not allowed with argument -f/--file") self._handle_int(namespace, intval) except ValueError: namespace.mountpoints.append(value) @@ -675,6 +683,9 @@ class ICMAction(argparse.Action): def main(): parser = argparse.ArgumentParser(add_help=False) parser.add_argument('-v', '--version', action='version', version='%(prog)s ' + Mountstats_version) + parser.add_argument('-f', '--file', default=open('/proc/self/mountstats', 'r'), + type=argparse.FileType('r'), dest='infile', + help='Read stats from %(dest)s instead of /proc/self/mountstats') prog = os.path.basename(sys.argv[0]) -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html