pvl/rrd/rrds.py
changeset 438 d45fc43c6073
parent 437 5100b359906c
child 439 6a8ea0d363c1
--- a/pvl/rrd/rrds.py	Tue Feb 24 12:47:09 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,239 +0,0 @@
-"""
-    RRD file on filesystem.
-"""
-
-import os, os.path, errno
-
-import logging; log = logging.getLogger('pvl.rrd.rrds')
-
-class RRDDatabase (object) :
-    """
-        A filesystem directory containing .rrd files.
-    """
-
-    def __init__ (self, path, graph_type, cache=None) :
-        """
-            path        - path to rrd dirs
-            graph_type  - pvl.rrd.graph.InterfaceGraph type
-            cache       - optional RRDCache
-        """
-
-        if not path :
-            raise ValueError("RRDDatabase: no path given")
-
-        log.info("%s: graph_type=%s, cache=%s", path, graph_type, cache)
-        
-        self.graph_type = graph_type
-        self._path = path
-        self.cache = cache
-
-    def path (self, *nodes) :
-        """
-            Lookup and full filesystem path to the given relative RRD/dir path.
-
-            Raises ValueError if invalid path.
-        """
-        
-        # relative dir (no leading slash) -> absolute path
-        path = os.path.normpath(os.path.join(self._path, *nodes))
-
-        log.debug("%s: %s -> %s", self, nodes, path)
-
-        # check inside base path
-        if not path.startswith(self._path.rstrip('/')) :
-            # mask
-            raise ValueError("%s: Invalid path: %s" % (self, nodes))
-
-        # ok
-        return path
-
-    def tree (self, node=None) :
-        """
-            Lookup and return XXX:RRDTree for given node, or root tree.
-
-            Raises ValueError if invalid path, or no such tree.
-        """
-        
-        # lookup fs path
-        if node :
-            path = self.path(node)
-        else :
-            path = self.path()
-
-        # found?
-        if not os.path.isdir(path) :
-            raise ValueError("%s: Invalid tree: %s: %s" % (self, node, path))
-        
-        if node :
-            return node
-        else :
-            return '' # equivalent
-
-    def rrd (self, node, tree=None) :
-        """
-            Lookup and return RRD for given node.
-        """
-
-        if tree :
-            node = os.path.join(tree, node)
-        
-        path = self.path(node) + '.rrd'
-
-        if not os.path.isfile(path) :
-            raise ValueError("%: Invalid rrd: %s: %s" % (self, node, path))
-
-        return RRD(self, node, self.graph_type)
-
-    def list (self, tree=None) :
-        """
-            List (trees, rrds) under given tree.
-        """
-
-        dirs = []
-        rrds = []
-
-        path = self.path(tree)
-        
-        for name in os.listdir(path) :
-            if name.startswith('.') :
-                continue
-            
-            path = self.path(tree, name)
-
-            basename, extname = os.path.splitext(name)
-            
-            log.debug("%s: %s: %s: %s", self, tree, name, path)
-
-            if os.path.isdir(path) :
-                dirs.append(name)
-
-            elif extname == '.rrd' :
-                # without the .rrd
-                rrds.append(basename)
-
-        # return sorted lists
-        return sorted(dirs), sorted(rrds)
-    
-    def graph (self, rrd, style, interval, cache=True) :
-        """
-            Cached RRD.graph(), returning outfile.
-
-            Uses self.cache if cache, otherwise graphs to tempfile.
-        """
-        
-        path = rrd.path()
-        
-        if self.cache and cache :
-            # path in cache
-            out = self.cache.path(style, interval, str(rrd))
-
-            # hit/miss?
-            cache = self.cache.lookup(path, out)
-
-        else :
-            # tempfile
-            out = None
-            cache = None
-
-        log.debug("%s: %s: %s", self, rrd, out)
-        
-        if cache :
-            # from cache
-            outfile = open(out)
-
-        else :
-            # to cache/tempfile
-            dimensions, lines, outfile = rrd.graph(style, interval).graph(out)
-
-        return outfile
-
-    def __str__ (self) :
-        return self._path
-
-class RRD (object) :
-    """
-        An .rrd file on the filesystem, graphed using pvl.rrd.graph.Interface.
-    """
-
-    def __init__ (self, db, rrd, graph_type) :
-        self.db = db
-        self.rrd = rrd
-        self.graph_type = graph_type
-
-    def path (self) :
-        return self.db.path(self.rrd) + '.rrd'
-
-    def graph (self, style, interval) :
-        """
-            Build Graph given rrd using given style/interval.
-        """
-        
-        path = self.path()
-
-        title = str(self) # " / ".join(rrd.split('/'))
-        return self.graph_type.build(title, path, style, interval)
-
-    def __str__ (self) :
-        return self.rrd
-
-class RRDCache (object) :
-    """
-        Cache graph output in the filesystem.
-    """
-
-    def __init__ (self, path) :
-        log.info("%s", path)
-
-        self._path = path
-
-    def path (self, *key) :
-        """
-            Return cache path for key.
-        """
-
-        return os.path.join(self._path, *key) + '.png'
-
-    def _stat (self, path) :
-        """
-            os.stat or None.
-        """
-
-        try :
-            return os.stat(path)
-
-        except OSError as ex :
-            if ex.errno == errno.ENOENT :
-                return None
-            else :
-                raise
-
-    def lookup (self, source, path) :
-        """
-            Return hit from cache.
-        """
-
-        # create
-        dir = os.path.dirname(path)
-        if not os.path.isdir(dir) :
-            log.warn("makedirs %s", dir)
-            os.makedirs(dir)
-        
-        # stats's
-        src = self._stat(source)
-        dst = self._stat(path)
-
-        if dst and src.st_mtime < dst.st_mtime :
-            log.debug("%s: %s: %s: hit", self, source, path)
-
-            return True
-
-        elif not dst:
-            log.debug("%s: %s: %s: miss", self, source, path)
-            return False
-        
-        else :
-            log.debug("%s: %s: %s: update", self, source, path)
-            return None
-
-    def __str__ (self) :
-        return self._path