<NME> grapher.py
<BEF> ADDFILE
<MSG> Some work about statistics plugin. It is almost finished (for a basic version)

<DFF> @@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+
+import os
+import time
+import datetime
+import rrdtool
+from mailng.lib import getoption
+
+default_avg_template = {
+    'width'  : '540',
+    'height' : '100',
+    'title'  : 'average message flow per minute',
+    'vertlabel' : 'msgs/min',
+    'cf' : 'AVERAGE',
+    'vars' : {
+        'sent' : { "type" : "AREA", "color" : "#00FF00", "legend" : "sent messages" },
+        'recv' : { "type" : "AREA", "color" : "#0000FF", "legend" : "received messages" },
+#         'bounced' : { "color" : "#FFFF00", "legend" : "bounced messages" },
+#         'reject' : { "color" : "#FF0000", "legend" : "rejected messages" },
+        }
+}
+
+class Grapher(object):
+    def __init__(self):
+        self.rrd_rootdir = getoption("RRD_ROOTDIR", "/tmp")
+        self.img_rootdir = getoption("IMG_ROOTDIR", "/tmp")
+
+    def process(self, target, suffix, start, end, tpl=default_avg_template):
+        rrdfile = "%s/%s.rrd" % (self.rrd_rootdir, target)
+        if not os.path.exists(rrdfile):
+            return
+        ext = "png"
+        path = "%s/%s_%s_%s.%s" % (self.img_rootdir, target, tpl['cf'], suffix, ext)
+        start = str(start)
+        end = str(end)
+        defs = []
+        lines = []
+        for v, d in tpl["vars"].iteritems():
+            defs += ['DEF:%s=%s:%s:%s' % (v, rrdfile, v, tpl['cf']),
+                     'CDEF:%spm=%s,60,*' % (v, v)]
+            type = d.has_key("type") and d["type"] or "LINE"
+            lines += ["%s:%spm%s:%s" % (type, v, d["color"], d["legend"])]
+        params = defs + lines
+        rrdtool.graph(path,
+                      "--imgformat", "PNG",
+                      "--width", tpl["width"],
+                      "--height", tpl["height"],
+                      "--start", start,
+                      "--end", end,
+                      "--vertical-label", tpl["vertlabel"],
+                      "--title", tpl["title"],
+                      "--lower-limit", "0",
+                      "--slope-mode",
+                      *params)
+
+    def make_defaults(self, target):
+        #now = int(time.time())
+        #start = now - (now % 86400)
+        #end = start + 86400
+        end = "now"
+        self.process(target, "day", "-1day", end)
+
+        #today = datetime.date.today()
+        #day = today.day - today.weekday()
+        #weekbegin = datetime.date(today.year, today.month, day)
+        #start = weekbegin.strftime("%Y%m%d")
+        #end = "+1week"
+        self.process(target, "week", "-1week", end)
+
+#         monthbegin = datetime.date(today.year, today.month, 1)
+#         start = monthbegin.strftime("%Y%m%d")
+#         end = "+1month"
+        self.process(target, "month", "-1month", end)
+        self.process(target, "year", "-1year", end)
+        
+        

Some work about statistics plugin. It is almost finished (for a basic version)