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

Daniel STAN's avatar
Daniel STAN committed
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

Daniel STAN's avatar
Daniel STAN committed
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

Daniel STAN's avatar
Daniel STAN committed
46
    return tot
47

Daniel STAN's avatar
Daniel STAN committed
48
try:
49
    arg = sys.argv[1]
Daniel STAN's avatar
Daniel STAN committed
50
except:
51 52
    arg = ''

Daniel STAN's avatar
Daniel STAN committed
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"
Daniel STAN's avatar
Daniel STAN committed
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" :
Daniel STAN's avatar
Daniel STAN committed
69 70
    db_conn = lc_ldap_admin()
    out = file(TMP_FILE, "w")
71

Daniel STAN's avatar
Daniel STAN committed
72 73 74
    for subnet in rids:
        plages = rids[subnet]
        pourcentage = int((count_rid(db_conn, plages)*100)/total_rid(plages))
Antoine Durand-Gasselin's avatar
Antoine Durand-Gasselin committed
75

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