stats-ip 2.56 KB
Newer Older
1
#!/bin/bash /usr/scripts/python.sh
Xavier Lagorce's avatar
Xavier Lagorce committed
2
# -*- coding: utf-8 -*-
3

4 5 6 7 8 9
import ldap
import sys
from lc_ldap.shortcuts import lc_ldap_admin
from gestion.config import rid_primaires, NETs
from gestion.ridtools import Rid

10 11
# Plugin pour visualiser l'utilisation des plages ip

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
TMP_FILE = "/var/lib/munin/tmp/stats-ip"

def count_segment(dbc, first, last):
    """Compte nb de rid entre first et last (inclu) dans la base ldap"""
    return len(
        dbc.search_ext_s('ou=data,dc=crans,dc=org',
           scope=ldap.SCOPE_SUBTREE,
           filterstr='(&(rid>=%d)(rid<=%d))' % (first, last),
           attrsonly=0, attrlist=['rid'],
        ))

def count_rid(dbc, plages):
    """Compte le nombre de rid d'une liste de plages, dans la base ldap"""
    return sum(count_segment(dbc, first, last) for (first, last) in plages)

def total_rid(plages):
    """Total théorique du nombre de rid, dans une liste de plages, sans les
    éventuels .0 et .255 (si ipv4 dispo)"""
    tot = 0
    for (first, last) in plages:
        tot += last - first + 1
        
        # En vrai, il faut retirer les rids d'IPs en .255 ou .0,
        # si ipv4 publique (bit 15 pas à 1) ou privée dispos (bit 14 pas à 0).
        if first >> 14 != 0b10:
            for xxx in [0, 255]:
                # On calcule l'indice de la première et dernière IP en .xxx
                # dans l'intervalle [first, last], à coup de division entière
                jlast = (last-xxx)/256  # arrondi inf
                jfirst = -((-first+xxx)/256) #arrondi sup
                # Et donc on retire le nombre d'ip finissant en .xxx dans
                # l'intervale
                tot -= jlast - jfirst + 1
45

46
    return tot
47

48
try:
49
    arg = sys.argv[1]
50
except:
51 52
    arg = ''

53 54 55
rids = {name: rid_primaires[name] for name in rid_primaires if name in NETs and
    name != 'multicast'}

56 57 58
if arg == "config" :
    print 'host_name adresses-ip'
    print 'graph_title Statistiques adresses IP'
59
    print 'graph_args --base 1000 --lower-limit 0 --upper-limit 100'
60 61
    print 'graph_category network'
    print "graph_vlabel % d'utilisation"
62
    for subnet in rids:
63 64 65 66 67
        nom = subnet.replace('-', '')
        print "%s.label %s" % (nom, subnet)
        print "%s.warning 92" % nom
        print "%s.critical 98" % nom

68
elif arg == "fichier" :
69 70
    db_conn = lc_ldap_admin()
    out = file(TMP_FILE, "w")
71

72 73 74
    for subnet in rids:
        plages = rids[subnet]
        pourcentage = int((count_rid(db_conn, plages)*100)/total_rid(plages))
75

76
        nom = subnet.replace('-', '')
77 78
        out.write("%s.value %d\n" %  (nom, pourcentage))
else:
79
    print file(TMP_FILE).read()