--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mrtg.py Sun Dec 06 02:25:15 2009 +0200
@@ -0,0 +1,116 @@
+"""
+ Definitions for MRTG
+"""
+
+class Target (object) :
+ """
+ A monitoring target
+ """
+
+ def __init__ (self, name, target_def, max_bytes, title, comment=None) :
+ """
+ Store values corresponding to the MRTG configuration statements:
+ name - the unique identifier for this target
+ target_def - the Target[] definition, see target_def()
+ max_bytes - maximum number of bytes/s accepted for this interface, used to determine % load
+ title - human-readable title
+ comment - optional comment field
+ """
+
+ self.name = name
+ self.target_def = target_def
+ self.max_bytes = max_bytes
+ self.title = title
+ self.comment = comment
+
+ def statement (self, name, value) :
+ """
+ Yield the line for a single stanza:
+ Stanza[identifier]: value
+ """
+
+ return "%s[%s]: %s" % (name, self.name, value)
+
+ def generate (self) :
+ """
+ Return a series of lines for this target
+ """
+
+ if self.comment :
+ yield "# %s" % (self.comment, )
+
+ yield self.statement('Target', self.target_def)
+ yield self.statement('MaxBytes', self.max_bytes)
+ yield self.statement('Title', self.title)
+
+class Host (object) :
+ """
+ A SNMP target
+ """
+
+ def __init__ (self, name, hostname, snmp_community) :
+ """
+ Store values corresponding to the MRTG Target stanza bits:
+ name - short name
+ hostname - the snmp target
+ snmp_community - the SNMP community to use
+ """
+
+ self.name = name
+ self.hostname = hostname
+ self.snmp_community = snmp_community
+
+ def port (self, port_name, mbps, port=None, descr=None, port_title=None) :
+ """
+ Create and return a Target describing the given port/interface on this host.
+ """
+
+ # figure out which ifref to use
+ ifid = iftitle = None
+
+ for prefix, tprefix, value in (
+ ('', "#", port),
+ ('\\', "", descr),
+ ) :
+ if value :
+ # ok, use this
+ ifid = prefix + str(value)
+
+ if port_title :
+ iftitle = port_title
+
+ else :
+ iftitle = tprefix + str(value)
+
+ break
+
+ if not ifid :
+ raise ValueError("No interface identifier given")
+
+ # compose
+ name = "%s_%s" % (self.hostname, port_name)
+ target = "%s:%s@%s" % (ifid, self.snmp_community, self.hostname)
+ max_bytes = mbps * 1000 * 1000 / 8
+ title = "Traffic @ %s %s -> %s" % (self.name, iftitle, port_name)
+
+ # build and return Target
+ return Target(name, target, max_bytes, title)
+
+def write_cfg (path, targets) :
+ """
+ Write out the given targets to the given file
+ """
+
+ fh = open(path, 'w')
+
+ # generate() each target
+ for target in targets :
+ for line in target.generate() :
+ # output line
+ fh.write(line + '\n')
+
+ # separate by empty line
+ fh.write('\n')
+
+ fh.close()
+