scripts/gestion/gen_confs/generate.py
chove e1d596eed7 envoi de mails pour :
- la modification des droits d'un adhrent
  - la modification du firewall concernant une machine
  - la modification d'un serveur
la fonction utilise pour envoyer des mails est dans mail.py
pour le firewall je ne sait pas quoi gnrer comme execption si j'arrive pas
 envoyerr de mail, donc ca part  la trappe si komaz n'arrive pas  crire
le mail

darcs-hash:20050221194135-4ec08-9ef761d782311a90d0d6caa495b6862ada6634b9.gz
2005-02-21 20:41:35 +01:00

495 lines
16 KiB
Python
Executable file

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# Copyright (C) Frédéric Pauget
# Licence : GPLv2
"""Ce script permet de lancer la reconfiguration des divers services
Usage: %(prog)s options
Les options possibles sont :
\t%(options)s
Les options avec = doivent être suivies d'un argument. Plusieurs
arguments peuvent être founis pour une même option, les séparer par &
"""
import sys, signal, os, commands, getopt, smtplib, shutil
sys.path.append('/usr/scripts/gestion')
from ldap_crans import crans_ldap, crans, smtpserv, hostname
from lock import *
from affich_tools import anim, cprint, OK, ERREUR, WARNING
from time import localtime, strftime, time
import config
args_autorises = ['quiet', 'remove=', 'add=', 'list' ,'help', 'reconnect']
if hostname == 'zamok' :
args_autorises += [ 'home=', 'mail_bienvenue=', 'ML-ENS=', 'droits', 'switch=' , 'dhcp', 'dns', 'firewall' , 'del_user=', 'blacklist_upload', 'autostatus']
elif hostname == 'nectaris' :
args_autorises += [ 'conf_wifi', 'bornes_wifi=' , 'droits-nectaris', 'dhcp-nectaris']
elif hostname == 'sila' :
args_autorises += [ 'bl_squid_upload', 'blacklist_virus' , 'blacklist_warez' , 'bl_chbre_invalide', 'bl_carte_etudiant' ]
elif hostname == 'komaz' :
args_autorises += [ 'firewall-komaz=' , 'firewall-komaz-ports=' , 'firewall-komaz-blacklist']
# On vérifie que l'on est root
if os.getuid() != 0:
sys.stderr.write("Il faut être root\n")
sys.exit(1)
signal.signal(signal.SIGINT,signal.SIG_IGN) # Pas de Ctrl-C
db = crans_ldap()
make_lock('auto_generate','Big lock',nowait=1)
##### Options fournies ?
try :
if len(sys.argv) > 1 :
options, arg = getopt.getopt(sys.argv[1:], 'h', args_autorises)
else :
options, arg = ( [],'')
except getopt.error, msg :
sys.stderr.write('%s\n' % msg)
sys.exit(255)
debug = 1 # défaut
to_do = {}
for opt, val in options :
if opt == '--quiet' :
debug = 0
elif opt == '--remove' :
for serv in val.split('&') :
print 'Supression de %s' % serv
db.services_to_restart('-%s' % serv)
sys.exit(0)
elif opt == '--list' :
print 'Services à redémarrer :'
print db.services_to_restart()
sys.exit(0)
elif opt == '--reconnect' :
# Personnes à reconnecter
print 'Recheche personnes en fin de sanction.'
hier = strftime('%d/%m/%Y %H:%M'.split()[0],localtime(time()-60*60*24))
c = db.search('blacklist=*,%s*' % hier)
services = []
for a_reco in c['adherent'] + c['machine'] + c['club'] :
for bl in a_reco.blacklist() :
fin, sanction = bl.split(',')[1:3]
if fin.split()[0] == hier and sanction not in services :
services.append(sanction)
for s in services :
print "Ajout de blacklist_%s pour reconfiguration" % s
db.services_to_restart('blacklist_%s' % s.encode())
sys.exit(0)
elif opt=='--add' :
# Ajout d'un item dans les services à redémarrer
for serv in val.split('&') :
if serv.find(',')!=-1 :
serv, arg = serv.split(',',1)
arg = arg.split(',')
else :
arg = []
print 'Ajout de %s (%s)' % ( serv, arg )
db.services_to_restart(serv, arg)
sys.exit(0)
elif opt =='-h' or opt == '--help' :
print __doc__ % { 'prog' : sys.argv[0].split('/')[-1] , 'options' : '\n\t'.join(args_autorises) }
sys.exit(0)
elif len(opt)>2 and opt[:2]=='--' :
to_do[opt[2:]] = val.split('&')
##### Lecture de la base LDAP si besion ce qu'il y a a faire et préparation
if not to_do :
if debug : print 'Lecture services à redémarrer dans la base LDAP'
to_do = db.services_to_restart()
auto = 1
else :
auto = 0
if debug : print 'Services à redémarrer imposés (non lecture de la base LDAP)'
inst = []
if hostname == 'zamok':
if 'del_user' in to_do.keys() :
if auto : db.services_to_restart('-del_user')
cprint('Archivage fichiers utilisateur','gras')
for args in to_do['del_user'] :
anim('\t' + args)
try :
login, home = args.split(',')
if not login or not home :
raise ValueError('Argument invalide')
warn = ''
f = config.cimetiere + '/files/' + strftime('%Y-%m-%d-%Hh%Mm_') + login + '.tar.bz2'
status, output = commands.getstatusoutput("tar cjf '%s' '%s' /var/spool/mail/%s" % ( f,home,login) )
if ( status != 512 and status!=0 ) or not os.path.isfile(f) :
# La 512 est si un des paths n'exite pas.
raise OSError(output)
if os.path.isdir(home) and os.stat(home)[4] >= 500 :
shutil.rmtree(home)
else :
warn += '%s incorrect\n' % home
if os.path.isfile('/var/spool/mail/' + login ) :
os.unlink('/var/spool/mail/' + login)
else :
warn += '/var/spool/mail/%s incorrect\n' % login
if warn :
print WARNING
if debug :
sys.stderr.write(warn)
else :
print OK
except :
print ERREUR
# On devra le refaire la prochaine fois
if auto : db.services_to_restart('del_user',[args])
if debug :
import traceback
traceback.print_exc()
if 'home' in to_do.keys() :
if auto : db.services_to_restart('-home')
cprint('Création home','gras')
for args in to_do['home'] :
anim('\t' + args)
try :
home, uid, login = args.split(',')
### Home
if not os.path.exists(home) :
# Le home n'existe pas
os.mkdir(home, 0755)
os.chown(home, int(uid) ,config.gid)
elif os.path.isdir(home) :
# Il y un répertoire existant
# Bon UID ?
stat = os.stat(home)
if stat[4] != int(uid) or stat[5] != config.gid :
# Le home n'est pas à la bonne personne
raise OSError('home existant')
### Mail
try :
os.mkdir(home + '/Mail', 0700)
os.chown(home + '/Mail', int(uid) ,config.gid)
except :
# Pas grave
pass
### Quota
status, output = commands.getstatusoutput('/usr/sbin/edquota -p pauget %s' % login )
if status :
print WARNING
if debug :
sys.stderr.write(output+'\n')
else :
print OK
except :
print ERREUR
# On devra le refaire la prochaine fois
if auto : db.services_to_restart('home',[args])
if debug :
import traceback
traceback.print_exc()
if 'mail_bienvenue' in to_do.keys() :
if auto : db.services_to_restart('-mail_bienvenue')
cprint('Envoi mail de bienvenue','gras')
for mail in to_do['mail_bienvenue'] :
anim('\t' + mail)
try :
From = "respbats@crans.org"
To = mail
if To.find('@') == -1 : To += '@crans.org'
conn=smtplib.SMTP(smtpserv)
conn.sendmail(From, To , config.txt_mail_bienvenue % { 'From' : From, 'To' : To })
conn.quit()
print OK
except Exception, c:
print ERREUR
if auto : db.services_to_restart('mail_bienvenue',[mail])
if debug :
import traceback
traceback.print_exc()
if 'ML-ENS' in to_do.keys() :
if auto : db.services_to_restart('-ML-ENS')
cprint('Inscription ML-ENS','gras')
for mail in to_do['ML-ENS'] :
anim('\t'+mail)
status, output = commands.getstatusoutput("echo '%s' | /usr/sbin/add_members -r - com-ens >/dev/null 2>&1" % mail)
if status :
# Il y a eu une erreur
print ERREUR
if auto : db.services_to_restart('ML-ENS', [mail])
if debug :
sys.stderr.write(output+'\n')
else :
print OK
if 'droits' in to_do.keys() :
if auto : db.services_to_restart('-droits')
db.services_to_restart('droits-nectaris')
try:
from gen_confs.droits import droits
a = droits()
a.uids = to_do['droits']
a.debug = debug
a.reconfigure()
except:
if auto : db.services_to_restart('droits',to_do['droits'])
if 'blacklist_upload' in to_do.keys() :
if auto : db.services_to_restart('-blacklist_upload')
db.services_to_restart('bl_squid_upload')
db.services_to_restart('firewall-komaz-blacklist')
try:
from gen_confs.firewall import bl_upload_fw
a = bl_upload_fw()
a.debug = debug
a.reconfigure()
except:
if auto: db.services_to_restart('blacklist_upload')
if 'switch' in to_do.keys() :
if auto : db.services_to_restart('-switch')
try:
from gen_confs.switchs import switch
a = switch(to_do['switch'])
a.debug = debug
a.reconfigure()
except:
if auto : db.services_to_restart('switch',to_do['switch'])
sys.stdout.write('Erreur dans la config des switchs.\n')
if debug :
import traceback
traceback.print_exc()
if 'mail_modification_machine' in to_do.keys() :
cprint('Modification d\'une machine : envoi d\'un mail à roots@crans.org','gras')
try :
from mail import mail_details
# liste des machines
machines = []
for ip in to_do['mail_modification_machine'] :
anim('\t' + ip)
machines += db.search('ipHostNumber=%s' % ip)['machine']
# envoi du mail
mail_details(machines, Subject = 'Modification d\'une machine de l\'association')
if auto : db.services_to_restart('-mail_modification_machine')
print OK
except :
print ERREUR
if 'autostatus' in to_do.keys() :
if auto : db.services_to_restart('-autostatus')
try:
from autostatus import autostatus
a = autostatus()
a.debug = debug
a.reconfigure()
except:
if auto : db.services_to_restart('autostatus')
# Les services suivants ont besoin de la liste des machines
# On va donc la lire une seule fois pour leur passer ensuite
restartlater = []
if 'dns' in to_do.keys() :
from gen_confs.bind import dns
inst.append([dns(),"dns"])
if 'dhcp' in to_do.keys() :
from gen_confs.dhcpd import dhcp
inst.append([dhcp(),"dhcp"])
if 'firewall' in to_do.keys() :
# Quand sila et komaz liront la base LDAP
from gen_confs.firewall import firewall
inst.append([firewall(),"firewall"])
elif hostname == 'nectaris':
# On s'occupe de nectaris
if 'conf_wifi' in to_do.keys():
if auto : db.services_to_restart('-conf_wifi')
try:
from gen_confs.wifi import conf_wifi
a = conf_wifi()
a.debug = debug
a.reconfigure()
# On va aussi demander la reconfiguration de toutes les bornes
to_do['bornes_wifi'] = []
except:
if auto : db.services_to_restart('conf_wifi')
sys.stdout.write('Erreur dans la config du wifi.\n')
if 'dhcp-nectaris' in to_do.keys() :
from gen_confs.dhcpd import dhcp
inst.append([dhcp(),"dhcp-nectaris"])
if 'bornes_wifi' in to_do.keys():
if auto : db.services_to_restart('-bornes_wifi')
try:
from gen_confs.wifi import bornes_wifi
if to_do['bornes_wifi']==['all']:
a = bornes_wifi()
else:
a = bornes_wifi(to_do['bornes_wifi'])
a.debug = debug
a.reconfigure()
except:
# Pas terrible : on va redemarrer les bornes qui ont redemarré correctement
if auto : db.services_to_restart('bornes_wifi', to_do['bornes_wifi'])
sys.stdout.write('Erreur dans la config des bornes wifi.\n')
if 'droits-nectaris' in to_do.keys():
if auto : db.services_to_restart('-droits-nectaris')
try:
from gen_confs.droits import droits
a = droits()
a.debug = debug
a.reconfigure()
except:
if auto : db.services_to_restart('droits-nectaris')
sys.stdout.write('Erreur dans la config des droits sur nectaris.\n')
elif hostname == 'sila' :
if 'bl_carte_etudiant' in to_do.keys() :
if auto : db.services_to_restart('-bl_carte_etudiant')
try:
from gen_confs.squid import squid_carte
a = squid_carte()
a.debug = debug
a.reconfigure()
except:
if auto: db.services_to_restart('bl_carte_etudiant')
if 'blacklist_virus' in to_do.keys() :
if auto : db.services_to_restart('-blacklist_virus')
try:
from gen_confs.squid import squid_virus
a = squid_virus()
a.debug = debug
a.reconfigure()
except:
if auto: db.services_to_restart('blacklist_virus')
if 'blacklist_warez' in to_do.keys() :
if auto : db.services_to_restart('-blacklist_warez')
try:
from gen_confs.squid import squid_warez
a = squid_warez()
a.debug = debug
a.reconfigure()
except:
if auto: db.services_to_restart('blacklist_warez')
if 'bl_squid_upload' in to_do.keys() :
if auto : db.services_to_restart('-bl_squid_upload')
try:
from gen_confs.squid import squid_upload
a = squid_upload()
a.debug = debug
a.reconfigure()
except:
if auto: db.services_to_restart('bl_squid_upload')
if 'bl_chbre_invalide' in to_do.keys() :
if auto : db.services_to_restart('-bl_chbre_invalide')
try:
from gen_confs.squid import squid_chbre
a = squid_chbre()
a.debug = debug
a.reconfigure()
except:
if auto: db.services_to_restart('bl_chbre_invalide')
elif hostname == 'komaz' :
if 'firewall-komaz' in to_do.keys() or \
'firewall-komaz-ports' in to_do.keys() or \
'firewall-komaz-blacklist' in to_do.keys() :
from firewall_komaz import firewall_komaz
fw = firewall_komaz()
fw.debug = debug
cprint('Reconfiguration firewall','gras')
if 'firewall-komaz' in to_do.keys() :
if auto : db.services_to_restart('-firewall-komaz')
try :
fw.mac_ip_maj(to_do['firewall-komaz'])
except :
if auto : db.services_to_restart('firewall-komaz',to_do['firewall-komaz'])
if 'firewall-komaz-ports' in to_do.keys() :
if auto : db.services_to_restart('-firewall-komaz-ports')
try :
fw.port_maj(to_do['firewall-komaz-ports'])
except :
if auto : db.services_to_restart('firewall-komaz-ports',to_do['firewall-komaz-ports'])
if 'firewall-komaz-blacklist' in to_do.keys() :
if auto : db.services_to_restart('-firewall-komaz-blacklist')
try :
fw.blacklist()
except :
if auto : db.services_to_restart('firewall-komaz-blacklist',to_do['firewall-komaz-blacklist'])
# On indique que les services seront a priori redemarrés
if auto :
for i in inst:
db.services_to_restart("-%s" % i[1])
## On fait ce qu'il reste à faire
if inst :
# Récolte des données
cprint('Lecture base LDAP','gras')
# Machines de l'assoce
machines = crans(db.conn).machines()
# Machines des adhérents et clubs de l'année en cours
base = db.search('paiement=ok')
base = base['adherent'] + base['club']
a = anim('\ttri machines',len(base))
for adh in base :
a.cycle()
# Adhérent ayant payé l'année en cours
if 'bloq' in adh.blacklist_actif() :
# Adhérent ignoré
continue
machines += adh.machines()
a.reinit()
print OK
# Reconfiguration des services
for i in inst :
i[0].debug = debug
i[0].machines = machines
try :
i[0].reconfigure()
except :
# Erreur, il faudra relancer le service la prochaine fois
if auto : db.services_to_restart('%s' % i[1])
sys.stdout.write('Erreur dans la config de %s.\n' % i[1])
if debug :
print 'Non traité ici mais signalé dans la base LDAP : \n\t', db.services_to_restart()
signal.signal(signal.SIGINT,signal.SIG_DFL) # Comportement normal de Ctrl-C
remove_lock('auto_generate')