Commit dfcda070 authored by Pierre-Elliott Bécue's avatar Pierre-Elliott Bécue

On modifie un peu le plugin de dim pour handle les bonnes choses, on ajoute un...

On modifie un peu le plugin de dim pour handle les bonnes choses, on ajoute un tool python, et on met mac_prises dans le dépot.

Ignore-this: a97c9dd382aae257e5d64b3fc14d0469

darcs-hash:20121211191448-b6762-f8705ea02bdfe778cd81d98ee52f2fa2533d68e0.gz
parent fbc7f2c0
......@@ -90,7 +90,7 @@ def set_mail_invalide(adherent, mail, a_verifier, a_imprimer):
'-', 'mail_invalide', "Mail invalide"])
adherent.save()
else:
print "Chambre de %s : %s, impossible de générer la fiche." % (adherent.Nom().encode('utf-8'), adherent.chbre())
print u"Chambre de %s : %s, impossible de générer la fiche." % (adherent.Nom().encode('utf-8'), adherent.chbre())
a_verifier.append(mail)
if __name__ == "__main__":
......
This diff is collapsed.
......@@ -105,7 +105,7 @@ class Python(Bcfg2.Server.Plugin.Plugin,Bcfg2.Server.Plugin.Generator):
def __init__(self, core, datastore):
Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore)
# Les entrées pour bcfg2
self.Entries['ConfigFile'] = {}
self.Entries['Python'] = {}
# Correspondance entrée ConfigFile -> code
self.codes = {}
# Dico ID de requête GAM -> Dossier surveillé
......@@ -165,6 +165,7 @@ class Python(Bcfg2.Server.Plugin.Plugin,Bcfg2.Server.Plugin.Generator):
if event.filename[0] == '/' \
or event.filename.endswith(".COMPILED") \
or event.filename.endswith("~") \
or event.filename.endswith(".swp") \
or event.filename.startswith(".#"):
return
......@@ -195,13 +196,14 @@ class Python(Bcfg2.Server.Plugin.Plugin,Bcfg2.Server.Plugin.Generator):
if action in ['exists', 'created']:
debug("adding config file: %s" % identifier, 'green')
self.codes[identifier] = load_file(path, logger)
self.Entries['ConfigFile'][identifier] = self.BuildEntry
print "Python plugin : creating %s entry due to action %s" % (identifier, action)
self.Entries['Python'][identifier] = self.BuildEntry
elif action == 'changed':
self.codes[identifier] = load_file(path, logger)
elif action == 'deleted':
debug("deleting config file: %s" % identifier, 'red')
del self.codes[identifier]
del self.Entries['ConfigFile'][identifier]
del self.Entries['Python'][identifier]
elif posixpath.isdir(path):
if action in ['exists', 'created']:
......@@ -209,7 +211,7 @@ class Python(Bcfg2.Server.Plugin.Plugin,Bcfg2.Server.Plugin.Generator):
else:
logger.info('Ignoring file %s' % path)
def AddDirectoryMonitor(self, path):
'''Surveille un dossier avec FAM'''
if path not in self.handles.values():
......
......@@ -145,7 +145,12 @@ def compileSource(source, filename="", logger = None):
newsource.write("))\n")
newsource.write(source[start:])
if logger:
logger.info(newsource.getvalue())
try:
logger.info(newsource.getvalue())
except:
print "Le logger de BCFG2 c'est de la merde, il refuse le non ascii."
print "Voici ce que j'ai essayé de logguer."
print newsource.getvalue()
return compile(newsource.getvalue(), filename, "exec")
def generate(code, environment=None, logger = None):
......@@ -162,8 +167,9 @@ def generate(code, environment=None, logger = None):
except Done, _:
pass
except Exception, exn:
print code
sys.stdout = save_stdout
raise exn
raise
sys.stdout = save_stdout
return environment.stream.getvalue()
......
#!/usr/bin/env python
# -*- coding: utf8 -*-
#
#
# PEB - 01/04/2012
#
import os, sys, re
from commands import getstatusoutput
sys.path.append('/usr/scripts/gestion')
import annuaires_pg
# nécessite apparemment que l'objet conn soit bien créé lors de l'exec
# de annuaires_pg, il faut être root (ou dans je ne sais quel groupe)
# pour que l'authentification de l'user crans avec psycopg2 se fasse
# (plante lamentablement quand j'essaye avec mon compte sur vo, sous
# ipython. Mais si je sudo ipython, ça marche...
def is_really_crans(chbre):
def liste_prises_macs(switch):
u'''
Fonction générant un dictionnaire (macs) contenant pour chaque prise une
liste des macs qui y sont actives.
'''
liste_bats = ['a', 'b', 'c', 'g', 'h', 'i', 'j', 'm', 'p']
split = switch.replace('.adm.crans.org', '').split('-')
bat, num_switch = split[0][-1], int(split[1][0])
if bat not in liste_bats:
print 'Le bâtiment '+bat+' ne figure pas dans la liste des bâtiments.'
data = walk(switch, 'STATISTICS-MIB::hpSwitchPortFdbAddress')
liste_chbres = []
macs = {}
for i in data:
if i == '':
continue
else:
port = int(i.replace('STATISTICS-MIB::hpSwitchPortFdbAddress.', '').split('.')[0])
mac = data[i].replace(' ', '').lower().replace('"', '')
if not re.match('([0-9a-f]{2}){6}', mac):
mac = mac.encode('hex').lower()
mac = "%s:%s:%s:%s:%s:%s" % (mac[0:2], mac[2:4], mac[4:6], mac[6:8], mac[8:10], mac[10:12])
uplink = annuaires_pg.uplink_prises[bat]
prise = num_switch*100+port
if prise in uplink:
continue
chbre = chbre_prises(bat, prise)
if chbre in liste_chbres:
macs[chbre].append(mac+'\n')
else:
macs[chbre] = []
macs[chbre].append(mac+'\n')
liste_chbres.append(chbre)
return macs
def walk(host, oid):
u'''
Hack sale remplaçant la fonction walk contenue dans hptools, qui
splitte suivant des espaces, ce qui engendre des failles.
Ici, snmpwalk -Ox (au lieu de -Oq) fait qu'on récupère bien des macs,
et on splitte suivant le keyword Hex-STRING, qui n'est pas redondant, lui.
'''
received = __exec('snmpwalk -Ox -v 1 -c public %s %s' % (host, oid)).split('\n')
result = {}
for ligne in received:
pport, pmac = ligne.split('Hex-STRING: ')
result[pport] = pmac
return result
def __exec(cmd):
u'''
Hack sale pour pas loader inutilement hptools.py
Exécute une commande et retourne son status et son output.
'''
status, response = getstatusoutput(cmd)
if status:
response = response.replace('snmpget: ','')
print 'Erreur : '+response+' : '+cmd
return response
if __name__ == '__main__':
switchs = sys.argv[1:]
for switch in switchs:
macs = liste_prises_macs(switch)
split = switch.replace('.adm.crans.org', '').split('-')
bat, num_switch = split[0][-1], int(split[1][0])
if not os.path.isdir("bat%s/%d"%(bat, num_switch)):
os.makedirs("bat%s/%d"%(bat, num_switch))
for chbre in macs:
with open('bat%s/%d/%s%03d.macs'%(bat, num_switch, bat, prise), 'w') as f:
f.writelines(sorted(macs[prise]))
#!/bin/sh
set -ex
GIT_DIR=/usr/scripts/surveillance/mac_prises/output/
SCRIPT=/usr/scripts/surveillance/mac_prises/mac_prise.py
# Nombre de changements de mac sur une prise avant mail
WARNING=2
MAILTO=nobody@crans.org
if ! [ -d $GIT_DIR ]; then
echo -n "Création du répertoire \`$GIT_DIR'..."
mkdir $GIT_DIR
echo " Fait."
fi
cd $GIT_DIR
if ! [ -d $GIT_DIR/.git ]; then
git init
fi
# Récupération de la liste des switchs
SWITCHS=$(/usr/bin/host -l adm.crans.org | /usr/bin/awk '/^bat[abcghijpm]-/{print $1}')
# Nettoyage du contenu du répertoire, avec ignore-unmatch pour éviter le plantage en
# cas de répertoire vide.
/usr/bin/git rm -r -q --ignore-unmatch ./*
# Lancement du listage des macs en parallèle
/usr/bin/parallel -j 1000 python $SCRIPT -- $SWITCHS
# Ajout de tous les fichiers (à faire avant le diff, pour que les nouveaux fichiers soient pris en compte)
/usr/bin/git add *
# Récupération de statistiques
# numstat renvoie le nombre de lignes ajoutées, le nombre de lignes supprimées et le nom du fichier
# on ajoute les deux premières variables et on classe par nombre de modifs
/usr/bin/git diff --cached --numstat | /usr/bin/awk '{print $1+$2 " " $3}' | sort -rn | ( while read num file; do
if [ $num -ge $WARNING ]; then
echo $file
else
break
fi
done ) | xargs /usr/bin/git diff --cached | mail -a 'From: "Eye in the sky" <root@crans.org>' -s "Surveillance macs/prises" $MAILTO
/usr/bin/git commit -m "Updated mac list" > /dev/null
# Garbage collection toutes les 10 minutes
if [ $(expr $(date +%M) % 10) -eq 0 ]; then
/usr/bin/git gc --aggressive -q
fi
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment