#!/bin/bash /usr/scripts/python.sh # -*- coding: utf-8 -*- import ldap import sys from lc_ldap.shortcuts import lc_ldap_admin from gestion.config import rid_primaires, NETs from gestion.ridtools import Rid # Plugin pour visualiser l'utilisation des plages ip 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 return tot try: arg = sys.argv[1] except: arg = '' rids = {name: rid_primaires[name] for name in rid_primaires if name in NETs and name != 'multicast'} if arg == "config" : print 'host_name adresses-ip' print 'graph_title Statistiques adresses IP' print 'graph_args --base 1000 --lower-limit 0 --upper-limit 100' print 'graph_category network' print "graph_vlabel % d'utilisation" for subnet in rids: nom = subnet.replace('-', '') print "%s.label %s" % (nom, subnet) print "%s.warning 92" % nom print "%s.critical 98" % nom elif arg == "fichier" : db_conn = lc_ldap_admin() out = file(TMP_FILE, "w") for subnet in rids: plages = rids[subnet] pourcentage = int((count_rid(db_conn, plages)*100)/total_rid(plages)) nom = subnet.replace('-', '') out.write("%s.value %d\n" % (nom, pourcentage)) else: print file(TMP_FILE).read()