Package Products :: Package ZenRRD :: Module zenrrdcached_util |
[hide private]
[frames] | no frames]

# Source Code for Module Products.ZenRRD.zenrrdcached_util

      1  #!/usr/bin/env python
      2  ##############################################################################
      3  #
      4  # Copyright (C) Zenoss, Inc. 2012, all rights reserved.
      5  #
      6  # This content is made available according to terms specified in
      7  # License.zenoss under the directory where your Zenoss product is installed.
      8  #
      9  ##############################################################################
     10
     11
     12  import subprocess
     13  import socket
     14  import sys
     15  import os
     16  import optparse
     17  import tempfile
     18
     19  """
     20  This utility will create a unix socket connection to rrdcached. It
     21  can be used to send commands to the rrdcached daemon managed by
     22  zenrrdcached.
     23  """
     24
     25
     26 -def flushDevice(device):
     27      path = "%s/perf/Devices/%s" % (os.environ['ZENHOME'], device)
     28      if not os.path.isdir(path):
     29          # No RRD files for the specified device
     30          return
     31      with tempfile.NamedTemporaryFile('r+w') as t:
     32          p = subprocess.Popen(["find", path, "-name", "*.rrd"],
     33                               stdout=subprocess.PIPE)
     34          stdout, err = p.communicate()
     35
     36          for rrds in stdout.splitlines():
     37              if rrds:
     38                  t.write("FLUSH ")
     39                  t.write(rrds.replace(" ", "\\ "))
     40                  t.write("\n")
     41          t.flush()
     42          t.seek(0)
     43          p = subprocess.Popen([os.path.abspath(__file__), '-'], stdin=t)
     44          p.wait()
     45
     46
     47 -def commandLoop(cmds=None):
     48      s = None
     49      sockfile = None
     50      try:
     51          zenhome = os.environ['ZENHOME']
     52
     53          s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
     54          s.connect(zenhome + "/var/rrdcached.sock")
     55          sockfile = s.makefile('rw', 1024)
     56          if sys.stdin.isatty():
     57              prompt = "rrdcached> "
     58          else:
     59              prompt = ""
     60
     61          in_batch = False
     62          while True:
     63              if cmds is not None:
     64                  cmd = cmds.pop(0)
     65              else:
     66                  try:
     67                      cmd = raw_input(prompt)
     68                      upper_cmd = cmd.rstrip().upper()
     69                      if upper_cmd in ('\Q', 'QUIT', 'EXIT', 'BYE', ':Q'):
     70                          break
     71                  except EOFError:
     72                      break
     73
     74              if cmd:
     75                  sockfile.write(cmd + "\n")
     76                  sockfile.flush()
     77                  # Read response which consists of '<status_code> <message>'.
     78                  # If <status_code> is > 0, then it signals the number of lines
     79                  # which follow in the response. If it is negative, there was an
     80                  # error.
     81                  if in_batch and cmd == ".":
     82                      in_batch = False
     83
     84                  if not in_batch:
     85                      data = sockfile.readline().rstrip()
     86                      numlines, message = data.split(None, 1)
     87                      numlines = int(numlines)
     88                      print data
     89                      for i in range(numlines):
     90                          print sockfile.readline(),
     91                  if cmd.upper() == "BATCH":
     92                      in_batch = True
     93
     94              if cmds is not None and len(cmds) == 0:
     95                  break
     96
     97      finally:
     98          if sockfile:
     99              sockfile.write("QUIT\n")
    100              sockfile.flush()
    101              sockfile.readline()
    102              sockfile.close()
    103          if s:
    104              s.close()
    105          # reset the terminal in case things go south
    106          with open(os.devnull, 'rw') as devnull:
    107              subprocess.call('stty sane', shell=True, stdout=devnull,
    108                              stderr=devnull)
    109
    110  if __name__ == "__main__":
    111      usage = """usage: %prog COMMAND
    112
    113   -                  Interactively send commands to rrdcached.
    114   flush DEVICE_ID    Flush all the RRD files for the given device.
    115   stats              Print zenrrdcached STATS."""
    116      parser = optparse.OptionParser(usage=usage)
    117      options, args = parser.parse_args()
    118
    119      if len(args) == 0:
    120          parser.print_usage()
    121      elif args[0] == "-":
    122          commandLoop()
    123      elif args[0].lower() == "flush":
    124          if len(args) < 2:
    125              parser.print_usage()
    126          for d in args[1:]:
    127              flushDevice(d)
    128      elif args[0].lower() == 'stats':
    129          commandLoop(['STATS'])
    130      else:
    131          parser.print_usage()
    132