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