All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lans Carstensen <Lans.Carstensen-hCDZnVt6e3JSwrhanM7KvQ@public.gmane.org>
To: linux-nfs@vger.kernel.org
Subject: [PATCH 3/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s
Date: Mon, 14 Sep 2009 21:57:44 -0700	[thread overview]
Message-ID: <4AAF1EC8.7060001@dreamworks.com> (raw)

Introduce optparse for managing command usage/help and the statistics 
options. This change helps more cleanly add new options such as --sort 
while preserving the iostat-like interval, count, and mount point 
positional arguments.

Signed-off-by: Lans Carstensen <Lans.Carstensen-hCDZnVt6e3JSwrhanM7KvQ@public.gmane.org>
---
  tools/nfs-iostat/nfs-iostat.py |  112 
++++++++++++++++++++-------------------
  1 files changed, 57 insertions(+), 55 deletions(-)

diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
index b3f335a..fc2cac8 100755
--- a/tools/nfs-iostat/nfs-iostat.py
+++ b/tools/nfs-iostat/nfs-iostat.py
@@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
MA 02111-1307 USA
  """

  import sys, os, time
+from optparse import OptionParser, OptionGroup

  Iostats_version = '0.2'

@@ -395,33 +396,6 @@ class DeviceData:
  # Functions
  #

-def print_iostat_help(name):
-    print 'usage: %s [ <interval> [ <count> ] ] [ <options> ] [ <mount 
point> ] ' % name
-    print
-    print ' Version %s' % Iostats_version
-    print
-    print ' Sample iostat-like program to display NFS client per-mount 
statistics.'
-    print
-    print ' The <interval> parameter specifies the amount of time in 
seconds between'
-    print ' each report.  The first report contains statistics for the 
time since each'
-    print ' file system was mounted.  Each subsequent report contains 
statistics'
-    print ' collected during the interval since the previous report.'
-    print
-    print ' If the <count> parameter is specified, the value of <count> 
determines the'
-    print ' number of reports generated at <interval> seconds apart. 
If the interval'
-    print ' parameter is specified without the <count> parameter, the 
command generates'
-    print ' reports continuously.'
-    print
-    print ' Options include "--attr", which displays statistics related 
to the attribute'
-    print ' cache, "--dir", which displays statistics related to 
directory operations,'
-    print ' and "--page", which displays statistics related to the page 
cache.'
-    print ' By default, if no option is specified, statistics related 
to file I/O are'
-    print ' displayed.'
-    print
-    print ' If one or more <mount point> names are specified, 
statistics for only these'
-    print ' mount points will be displayed.  Otherwise, all NFS mount 
points on the'
-    print ' client are listed.'
-
  def parse_stats_file(filename):
      """pop the contents of a mountstats file into a dictionary,
      keyed by mount point.  each value object is a list of the
@@ -491,30 +465,50 @@ def iostat_command(name):
      mountstats = parse_stats_file('/proc/self/mountstats')
      devices = []
      origdevices = []
-    which = 0
      interval_seen = False
      count_seen = False

-    for arg in sys.argv:
-        if arg in ['-h', '--help', 'help', 'usage']:
-            print_iostat_help(name)
-            return
-
-        if arg in ['-v', '--version', 'version']:
-            print '%s version %s' % (name, Iostats_version)
-            return
-
-        if arg in ['-a', '--attr']:
-            which = 1
-            continue
-
-        if arg in ['-d', '--dir']:
-            which = 2
-            continue
-
-        if arg in ['-p', '--page']:
-            which = 3
-            continue
+    mydescription= """
+Sample iostat-like program to display NFS client per-mount'
+statistics.  The <interval> parameter specifies the amount of time in 
seconds
+between each report.  The first report contains statistics for the time 
since
+each file system was mounted.  Each subsequent report contains statistics
+collected during the interval since the previous report.  If the <count>
+parameter is specified, the value of <count> determines the number of 
reports
+generated at <interval> seconds apart.  If the interval parameter is 
specified
+without the <count> parameter, the command generates reports continuously.
+If one or more <mount point> names are specified, statistics for only these
+mount points will be displayed.  Otherwise, all NFS mount points on the
+client are listed.
+"""
+    parser = OptionParser(
+        usage="usage: %prog [ <interval> [ <count> ] ] [ <options> ] [ 
<mount point> ]",
+        description=mydescription,
+        version='version %s' % Iostats_version)
+    parser.set_defaults(which=0)
+
+    statgroup = OptionGroup(parser, "Statistics Options",
+                               'File I/O is displayed unless one of the 
following is specified:')
+    statgroup.add_option('-a', '--attr',
+                            action="store_const",
+                            dest="which",
+                            const=1,
+                            help='displays statistics related to the 
attribute cache')
+    statgroup.add_option('-d', '--dir',
+                            action="store_const",
+                            dest="which",
+                            const=2,
+                            help='displays statistics related to 
directory operations')
+    statgroup.add_option('-p', '--page',
+                            action="store_const",
+                            dest="which",
+                            const=3,
+                            help='displays statistics related to the 
page cache')
+    parser.add_option_group(statgroup)
+
+    (options, args) = parser.parse_args(sys.argv)
+
+    for arg in args:

          if arg == sys.argv[0]:
              continue
@@ -522,18 +516,26 @@ def iostat_command(name):
          if arg in mountstats:
              origdevices += [arg]
          elif not interval_seen:
-            interval = int(arg)
+            try:
+                interval = int(arg)
+            except:
+                print 'Illegal <interval> value %s' % arg
+                return
              if interval > 0:
                  interval_seen = True
              else:
-                print 'Illegal <interval> value'
+                print 'Illegal <interval> value %s' % arg
                  return
          elif not count_seen:
-            count = int(arg)
+            try:
+                count = int(arg)
+            except:
+                print 'Ilegal <count> value %s' % arg
+                return
              if count > 0:
                  count_seen = True
              else:
-                print 'Illegal <count> value'
+                print 'Illegal <count> value %s' % arg
                  return

      # make certain devices contains only NFS mount points
@@ -547,12 +549,12 @@ def iostat_command(name):
      sample_time = 0.0

      if not interval_seen:
-        print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which)
+        print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, options.which)
          return

      if count_seen:
          while count != 0:
-            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which)
+            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, options.which)
              old_mountstats = mountstats
              time.sleep(interval)
              sample_time = interval
@@ -566,7 +568,7 @@ def iostat_command(name):
              count -= 1
      else:
          while True:
-            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which)
+            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, options.which)
              old_mountstats = mountstats
              time.sleep(interval)
              sample_time = interval
-- 
1.5.5.6



             reply	other threads:[~2009-09-15  5:00 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-15  4:57 Lans Carstensen [this message]
  -- strict thread matches above, loose matches on Subject: below --
2009-08-26  4:59 [PATCH 3/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s Lans Carstensen
2009-08-26 14:30 ` Chuck Lever
2009-08-26 21:12 ` Chuck Lever
2009-08-26 23:57   ` Lans Carstensen
2009-08-27 14:09     ` Chuck Lever

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4AAF1EC8.7060001@dreamworks.com \
    --to=lans.carstensen-hcdznvt6e3jswrhanm7kvq@public.gmane.org \
    --cc=linux-nfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.