
en cas de crash d'un serveur... merci xabi pour ses ides ;-) darcs-hash:20041213235540-4ec08-e751947201d72686ad162fabc1dff4efb4ec7e55.gz
277 lines
8.8 KiB
Python
Executable file
277 lines
8.8 KiB
Python
Executable file
#! /usr/bin/env python
|
|
# -*- coding: iso-8859-15 -*-
|
|
|
|
"""
|
|
Classe de génération du fichier de l'autostatus
|
|
Utilisé par generate.py
|
|
"""
|
|
|
|
# importation des fonctions et classes
|
|
|
|
import sys, os, commands
|
|
sys.path.append('/usr/scripts/gestion')
|
|
from ldap_crans import crans
|
|
from gen_confs import gen_config
|
|
|
|
# définition de la classe
|
|
|
|
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] :
|
|
# on convertit le bat# en bat#-0
|
|
if not "-" in m.nom().split(".")[0] :
|
|
index = m.nom().split(".")[0] + "-0"
|
|
else :
|
|
index = m.nom().split(".")[0]
|
|
else :
|
|
index = 'a' + 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()
|