79 lines
2.6 KiB
Bash
Executable file
79 lines
2.6 KiB
Bash
Executable file
#!/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()
|