
Mise en place du firewall sur toutes les machines darcs-hash:20050611170224-41617-068d285a581f2c65799ca3fbe33a57a3075b9d03.gz
333 lines
11 KiB
Python
Executable file
333 lines
11 KiB
Python
Executable file
#! /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()
|