audimat 3.58 KB
Newer Older
1
#! /usr/bin/env python
Xavier Lagorce's avatar
Xavier Lagorce committed
2
# -*- coding: utf-8 -*-
3 4

"""
Xavier Lagorce's avatar
Xavier Lagorce committed
5
Système de monitoring des abonnés au différents flux multicast
6

Xavier Lagorce's avatar
Xavier Lagorce committed
7
Frédéric Pauget, Nicolas Salles, Etienne Chové
8 9 10 11 12
"""

import sys, os
sys.path.append('/usr/scripts/gestion')
from hptools import hpswitch
13
from annuaires_pg import all_switchs, uplink_prises
14 15

####################################################################
Xavier Lagorce's avatar
Xavier Lagorce committed
16
## Définition des chaines à audimater
17 18 19 20 21 22
####################################################################

# On construit un dictionnaire au format "ip" : "nom_de_la_chaine"


# On log les chaines qui font des annonces sap
Xavier Lagorce's avatar
Xavier Lagorce committed
23
#   on essaie de télécharger le fichier sap.txt
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#   si on y arrive pas on continue avec l'ancien

chaines = {}

try :
    os.system("/usr/bin/wget http://television.crans.org/sap.txt -O /tmp/sap.txt -q 2> /dev/null")
except :
    pass

# lecture du fichier
diffusion = open ('/tmp/sap.txt','r')
for l in diffusion.readlines() :
    chaines[l.rstrip().split(":")[1]] = l.split(":")[0].replace('.','_').replace('-','_')[0:18]

####################################################################
## Configuration pour munin
####################################################################

if 'autoconf' in sys.argv :
    print "yes" # Surement y rajouter le up du backbone, ...
    sys.exit(0)

if 'config' in sys.argv :
    print "host_name backbone"
    print "graph_title AudimatTV";
    print "graph_args --base 1000";
    print "graph_vlabel nb clients/chaines";
    inc = 0
52
    chaines = chaines.values()
53 54 55
    chaines.sort()
    for nom in chaines :
        if not nom : continue
56
        nom1 = nom.replace(' ','_').replace("'", '')
57 58 59 60 61 62 63 64 65 66
        print "%s.label %s" % (nom1, nom)
        if inc == 0 :
            print "%s.draw AREA" % nom1
        else:
            print "%s.draw STACK" % nom1
        inc = 1
    print "total.label Total"
    sys.exit(0)

####################################################################
Xavier Lagorce's avatar
Xavier Lagorce committed
67
## Mesure de l'audimat, lancé par cron à cause du timeout de munin
68 69 70 71
####################################################################

if 'generate' in sys.argv :
    stats = {} # { IP :  [ prises ] }
72

73
    for switch in all_switchs() :
Xavier Lagorce's avatar
Xavier Lagorce committed
74
        # on vérifie que le switch est pingable
75 76
        if os.system('ping -c 3 %s > /dev/null 2> /dev/null' % switch ) :
            continue
77

78 79 80 81 82 83 84 85
        sw = hpswitch(switch)
        switch=switch.split('.')[0]
        if switch[-1].isalpha() :
            bat = switch[-1].lower()
            sw_num = 0
        else :
            bat = switch[-3].lower()
            sw_num = int(switch[-1])
86

87 88
        #if bat not in uplink_prises:
        #    continue
89 90 91 92 93 94
        for ip, liste in sw.multicast().items() :
            stats.setdefault(ip,[])
            for port in liste :
                num_port = 100 * sw_num + int(port)
                if num_port not in uplink_prises[bat].keys() :
                    stats[ip].append('%s%03i' % (bat, num_port) )
95

96 97
    total = 0

98
    f = open('/var/lib/munin/tmp/audimat','w')
99

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
    for ip, nom in chaines.items() :
        if not nom : continue
        nb_clients = len(stats.get(ip,[]))
        total += nb_clients
        if 'prises' in sys.argv :
            f.write( "%s (%i) : %s\n" % (nom, nb_clients, ', '.join(stats.get(ip,[])).upper() ) )
        else :
            f.write( "%s.value %i\n" % ( nom.replace(' ','_'), nb_clients ) )

    f.write("total.value %i" % total )
    sys.exit(0)

####################################################################
## Retour des audimats pour munin
####################################################################

try :
117
    print file("/var/lib/munin/tmp/audimat").read()
118 119
except :
    pass