scripts/gestion/gen_confs/supervison.py
pauget caf1bb803e Rcriture de generate pour la migration.
Mise en place du firewall sur toutes les machines

darcs-hash:20050611170224-41617-068d285a581f2c65799ca3fbe33a57a3075b9d03.gz
2005-06-11 19:02:24 +02:00

333 lines
11 KiB
Python
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# Licence : GPLv2
import sys, smtplib, commands
sys.path.append('/usr/scripts/gestion')
from ldap_crans import smtpserv, crans, crans_ldap, machine, adherent, club
from whos import machine_details, adher_details, club_details
from gen_confs import gen_config
from affich_tools import cprint, OK, anim
class mail :
"""
Envoie un mail à toutes les personnes de la liste 'To', avec les
informations détaillées des objets contenus dans 'objets'
(instances des classes adherent, machine ou club) """
From = 'root@crans.org'
To = [ 'roots@crans.org' ]
Subject = "Surveillance modifications de la base LDAP"
mail_template = """From: %(From)s
To: %(To)s
Subject: %(Subject)s
%(Text)s"""
# Avec les caract-Aères d'échappement qui vont bien pour la couleur ?-b
couleur = False
def __init__(self,recherches) :
self.recherches = recherches
def reconfigure(self) :
""" Envoi le mail """
cprint('Mail de notification de modifications','gras')
a = anim('\tRecherches dans la base',len(self.recherches))
db = crans_ldap()
details = []
vus = []
for rech in self.recherches :
for results in db.search(rech).values() :
for res in results :
if res.dn in vus : continue
vus.append(res.dn)
if res.__class__ == machine :
details.append(machine_details(res))
elif res.__class__ == adherent :
details.append(adher_details(res))
elif res.__class__ == club :
details.append(club_details(res))
a.cycle()
texte = '\n\n- - - - = = = = # # # # # # = = = = - - - -\n\n'.join(details)
a.reinit()
if not details :
print "rien"
return
print OK
anim('\tEnvoi mail')
if not self.couleur :
import sre
texte = sre.sub('\x1b\[1;([0-9]|[0-9][0-9])m','',texte)
conn=smtplib.SMTP(smtpserv)
conn.sendmail(self.From, self.To , \
self.mail_template % { 'From' : self.From,
'To' : ','.join(self.To),
'Subject' : self.Subject,
'Text' : texte.encode('iso8859-15') } )
conn.quit()
print OK
class autostatus(gen_config) :
# CONFIGURATION #
#################
# fichier de l'autostatus
CONFFILE = '/etc/autostatus/hosts'
# machines crans à ne pas mettre dans l'autostatus
exclude = ["non-configure.wifi.crans.org"]
# matrice du fichier d'autostatus
matrice = """
# Format : name address depend,list contact description
# routeurs vers l'extérieur #
#############################
%%HTML: <TR><td colspan=3 class="table"><font size="+1"><B>Routeurs, dans l'ordre où ils sont entre le crans et l'extérieur :</font></b></TR>
%(route)s
# serveurs du crans #
#####################
%%HTML: <TR> <TD class=table colSpan=3><p></TD></TR>
%%HTML: <TR><td colspan=3 class="table"><font size="+1"><B>Serveurs :</font></b></TR>
%(serveurs)s
# ferme #
#########
%%HTML: <TR> <TD class=table colSpan=3><p></TD></TR>
%%HTML: <TR><td colspan=3 class="table"><font size="+1"><B>La ferme, diffusion de la télé :</font></b></TR>
%(ferme)s
# switchs #
###########
%%HTML: <TR> <TD class=table colSpan=3><p></TD></TR>
%%HTML: <TR><td colspan=3 class="table"><font size="+1"><B>Switchs :</font></b></TR>
%(switchs)s
# bornes wifi #
###############
%%HTML: <TR> <TD class=table colSpan=3><p></TD></TR>
%%HTML: <TR><td colspan=3 class="table"><font size="+1"><B>Bornes wifi :</font></b></TR>
%(bornes)s
# Sites web et Services #
#########################
%%HTML: <TR> <TD class=table colSpan=3><p></TD></TR>
%%HTML: <TR><td colspan=3 class="table"><font size="+1"><B>Sites web et Services HORS de l'ENS:</font></b></TR>
%%HTML: <TR><td colspan=3 class="table"><font size="2">(21:FTP ; 80:HTTP ; 119:news ; 5190:port du protocole ICQ)</TR>
%(exterieur)s
"""
# quelque descriptions de routeurs triés par IP (pour la route vers l'extérieur)
infos_routeurs = {}
infos_routeurs [ '138.231.136.4' ] = ['Komaz', 'Routeur principal du CRANS']
infos_routeurs [ '138.231.135.5' ] = ['IRTS', 'Routeur de l\'ENS assurant la liaison CRANS<->ENS']
infos_routeurs [ '138.231.132.1' ] = ['gateway', 'Routeur de l\'ENS']
infos_routeurs [ '138.231.176.1' ] = ['Pioneer', 'Routeur principal de l\'ENS']
infos_routeurs [ '193.49.65.1' ] = ['RenaterCachan1' , 'Routeur Renater' ]
infos_routeurs [ '193.51.181.186' ] = ['RenaterCachan2', 'Routeur Renater']
infos_routeurs [ '193.51.180.166' ] = ['RenaterJussieu1', 'Routeur Renater']
infos_routeurs [ '193.51.180.158' ] = ['RenaterJussieu2', 'Routeur Renater']
# services extérieurs (triés par clé de dictionnaire)
# format [ nom, ip, port(0=ping), description ]
services_exterieurs = {}
services_exterieurs ['Jussieu'] = [ 'Jussieu', '195.83.118.1', 21, 'Le serveur <a href="ftp://ftp.lip6.fr">FTP</a> de Jussieu. (France)', 'nobody']
services_exterieurs ['Free'] = [ 'Free', '213.228.0.141', 21, 'Le serveur <a href="ftp://ftp.free.fr">FTP</a> de free. (France)', 'nobody' ]
services_exterieurs ['Voila'] = [ 'Voila', '195.101.94.80', 80, 'Est-ce que <a href="http://www.voila.fr">Voila</a> fonctionne ? (France)', 'nobody' ]
services_exterieurs ['Yahoo!'] = [ 'Yahoo!', '66.94.230.39', 80, 'Est-ce que <a href="http://www.yahoo.com">Yahoo!</a> fonctionne ? (USA)', 'nobody' ]
services_exterieurs ['Altalavista'] = [ 'Altavista', '216.155.200.155', 80, 'Est-ce que <a href="http://www.altavista.com">Altavista</a> fonctionne ? (USA)', 'nobody' ]
# personnes à informer pour l'indiponibilité de certains serveurs
contact = {}
contact ['pegase.crans.org'] = 'pessoles@crans.org'
# service à redémarer
restart_cmd = ""
# FIN DE LA CONFIGURATION
def __str__ (self) :
return "autostatus"
def make_config (self, dico ) :
"""
Transforme le dico en suite lignes de configuration
"""
liste = dico.keys()
liste.sort()
append = ""
for i in liste :
append = append + " ".join( dico[i] ) + "\n"
return append.encode('iso-8859-15')
def mail_contact (self, nom) :
# retourne le mail à qui envoyer les avis pour un serveur
if nom in self.contact.keys() :
return self.contact[nom]
else :
return 'nobody'
def _gen (self) :
# machines crans
################
machines = crans().machines()
# tri des machines par type
bornes = {}
switchs = {}
serveurs = {}
ferme = {}
# tri des machines
for m in machines :
# machine exclue
if m.nom() in self.exclude :
continue
# les bornes
if m.canal() :
# C'est une borne
if m.info() :
# on regarde si c'est une borne de batiment
if ( m.info()[0][0:3] == "Au " ) and ( len(m.info()[0]) == 5 ) :
bornes[ "1-" + m.info()[0][4]+m.info()[0][3] + "-" + m.nom() ] = [ m.nom().split(".")[0] , m.nom() , 'none' , self.mail_contact(m.nom()) , m.info()[0] ]
else :
bornes[ "2-" + m.info()[0] + m.nom() ] = [ m.nom().split(".")[0] , m.nom() , 'none' , self.mail_contact(m.nom()) , m.info()[0] ]
else :
# on met les bornes non définies à la fin (ordre alphabétique)
bornes[ "3-" + m.nom() ] = [ m.nom().split(".")[0] , m.nom() , 'none' , self.mail_contact(m.nom()) , 'Inutilise' ]
# les switchs
elif m.info() and 'switch' in m.info()[0].lower() :
# est ce que c'est un batiment
if 'bat' == m.nom()[0:3] :
index = '1-' + m.nom().split(".")[0]
else :
index = '0-' + m.nom().split(".")[0]
# on ajoute au dictionnaire
switchs[ index ] = [ m.nom().split(".")[0] , m.nom() , 'none' , self.mail_contact(m.nom()) , m.info()[0] ]
# la ferme
elif '.ferme.crans.org' in m.nom() :
nom = ".".join(m.nom().split(".")[0:2])
if m.info() :
ferme[ nom ] = [ nom , m.nom() , 'none' , self.mail_contact(m.nom()) , m.info()[0] ]
else :
ferme[ nom ] = [ nom , m.nom() , 'none' , self.mail_contact(m.nom()) , 'Infos non disponibles' ]
# les serveurs
else :
if ".wifi.crans.org" in m.nom() :
nom = m.nom().split(".")[0] + ".wifi"
else :
nom = m.nom().split(".")[0]
if m.info() :
serveurs[ nom ] = [ nom , m.nom() , 'none' , self.mail_contact(m.nom()) , m.info()[0] ]
else :
serveurs[ nom ] = [ nom , m.nom() , 'none' , self.mail_contact(m.nom()) , 'Infos non disponibles' ]
# route vers l'extérieur
########################
# on récupère la route vers l'extérieur
traceroute = commands.getoutput("/usr/bin/traceroute www.free.fr 2> /dev/null | sed 's/\*//g' | sed 's/ */ /g' | sed 's/^ //g' | sed 's/[(,)]//g' | cut -d ' ' -f 2,3").split("\n")
# initialisation des variables
in_renater = 0
route_to_ext = ''
depends_to_ext = ''
for routeur in traceroute :
# on commence à rentrer dans la chaine des routeurs renater
if 'renater.fr' in routeur :
in_renater = 1
# on est plus dans les routeurs renater donc on arrête
if in_renater and not 'renater.fr' in routeur :
continue
# ajout du routeur
# ip
tmp_ip = routeur.split(' ')[1]
# nom & desciption
if routeur.split(' ')[1] in self.infos_routeurs.keys() :
tmp_name = self.infos_routeurs[tmp_ip][0]
tmp_desc = self.infos_routeurs[tmp_ip][1]
else :
tmp_name = routeur.split(' ')[0].split('.')[0]
tmp_desc = 'Pas de description'
# dépendances
if not depends_to_ext :
tmp_depends = 'none'
depends_to_ext = tmp_name
else :
tmp_depends = depends_to_ext
depends_to_ext += ',' + tmp_name
# on l'ajoute à la route
if route_to_ext :
route_to_ext += '\n'
route_to_ext += '%s %s %s %s %s' % (tmp_name, tmp_ip, tmp_depends,self.mail_contact(tmp_name),tmp_desc)
# services extérieurs
#####################
services_exterieurs = {}
for key in self.services_exterieurs.keys() :
s = self.services_exterieurs[key]
if s[2] :
services_exterieurs[ key ] = [ s[0] + ':' + str(s[2]), s[1] , depends_to_ext, s[4] , s[3] ]
else :
services_exterieurs[ key ] = [ s[0] , s[1] , depends_to_ext, s[4] , s[3] ]
# génération du fichier
#######################
file = self._open_conf(self.CONFFILE, "#")
# génère le dictionnaire pour les modifications
dico = {}
dico['switchs'] = self.make_config(switchs)
dico['bornes'] = self.make_config(bornes)
dico['serveurs'] = self.make_config(serveurs)
dico['ferme'] = self.make_config(ferme)
dico['route'] = route_to_ext.encode('iso-8859-15')
dico['exterieur'] = self.make_config(services_exterieurs)
# on écrit dans le fichier de configuration
file.write( self.matrice % dico )
# on ferme le fichier
file.close()