mrtg.py
author Tero Marttila <terom@fixme.fi>
Tue, 25 Jan 2011 01:19:40 +0200
changeset 31 cd9ca8068b09
parent 9 32553ab44472
permissions -rw-r--r--
doc: clean up pmacct.conf
3
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Definitions for MRTG
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
class Target (object) :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
    """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
        A monitoring target
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
    """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    def __init__ (self, name, target_def, max_bytes, title, comment=None) :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
            Store values corresponding to the MRTG configuration statements:
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
                name        - the unique identifier for this target
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
                target_def  - the Target[] definition, see target_def()
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
                max_bytes   - maximum number of bytes/s accepted for this interface, used to determine % load
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
                title       - human-readable title
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
                comment     - optional comment field
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
        """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        self.name = name
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        self.target_def = target_def
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
        self.max_bytes = max_bytes
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        self.title = title
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
        self.comment = comment
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
5
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    26
    def rrd_name (self) :
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    27
        """
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    28
            Return the relative path to the .rrd file for this target
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    29
        """
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    30
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    31
        return "%s.rrd" % (self.name, )
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    32
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    33
    def img_name (self) :
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    34
        """
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    35
            Return the relative path to the .png image for this target
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    36
        """
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    37
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    38
        return "%s.png" % (self.name, )
e716718482c3 hack hack hack some HTML output
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    39
3
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    def statement (self, name, value) :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
            Yield the line for a single stanza:
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
                Stanza[identifier]: value
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        return "%s[%s]: %s" % (name, self.name, value)
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    def generate (self) :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
            Return a series of lines for this target
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        if self.comment :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
            yield "# %s" % (self.comment, )
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
        yield self.statement('Target', self.target_def)
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
        yield self.statement('MaxBytes', self.max_bytes)
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        yield self.statement('Title', self.title)
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
class Host (object) :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        A SNMP target
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    def __init__ (self, name, hostname, snmp_community) :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
            Store values corresponding to the MRTG Target stanza bits:
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
                name            - short name
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
                hostname        - the snmp target
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
                snmp_community  - the SNMP community to use
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        self.name = name
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        self.hostname = hostname
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
        self.snmp_community = snmp_community
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
9
32553ab44472 fixfix descr
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    77
    def port (self, port_name, mbps, port=None, desc=None, port_title=None) :
3
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
        """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
            Create and return a Target describing the given port/interface on this host.
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
        """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        # figure out which ifref to use
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        ifid = iftitle = None
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        for prefix, tprefix, value in (
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
                ('',    "#",    port),
9
32553ab44472 fixfix descr
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    87
                ('\\',  "",     desc),
3
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        ) :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
            if value :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
                # ok, use this
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
                ifid = prefix + str(value)
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
                if port_title :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
                    iftitle = port_title
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
                else :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
                    iftitle = tprefix + str(value)
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
                break
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
        
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        if not ifid :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
            raise ValueError("No interface identifier given")
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        # compose
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
        name = "%s_%s" % (self.hostname, port_name)
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        target = "%s:%s@%s" % (ifid, self.snmp_community, self.hostname)
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
        max_bytes = mbps * 1000 * 1000 / 8
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
        title = "Traffic @ %s %s -> %s" % (self.name, iftitle, port_name)
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
        # build and return Target
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
        return Target(name, target, max_bytes, title)
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
def write_cfg (path, targets) :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
    """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
        Write out the given targets to the given file
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
    """
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    fh = open(path, 'w')
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    # generate() each target
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
    for target in targets :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
        for line in target.generate() :
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
            # output line
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
            fh.write(line + '\n')
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
         
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
        # separate by empty line
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        fh.write('\n')
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
    
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
    fh.close()
2fefcb99df6e mrtg config target generator
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130