scripts/gestion/gen_confs/droits.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

262 lines
8.5 KiB
Python
Executable file

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
import sys, signal, os, smtplib
# Imports pour LDAP
sys.path.append('/usr/scripts/gestion')
from gen_confs import gen_config, anim, cprint, OK, ERREUR
from ldap_crans import crans_ldap, crans, preattr, ldap, smtpserv
from whos import adher_details
from socket import gethostname
if gethostname().split(".")[0] == 'zamok':
# Imports pour mailman
sys.path.append('/usr/lib/mailman')
from Mailman import MailList
from Mailman import Utils
from Mailman.UserDesc import UserDesc
class droits(crans_ldap,gen_config) :
####### Les groupes
base_group_dn = 'ou=Group,dc=crans,dc=org'
# Quels droits donnent l'appartenacne à quel groupe ?
groupes = { 'adm' : [ u'Nounou' ] ,
'respbats' : [ u'Câbleur' , u'Déconnecteur', u'Nounou' ] ,
'moderateurs' : [ u'Modérateur' ] ,
'disconnect' : [ u'Déconnecteur' ] ,
'webcvs' : [ u'CVSWeb'] }
####### Les ML
# Le + devant un nom de ML indique une synchronisqtion
# ML <-> fonction partielle : il n'y a pas d'effacement
# des abonnés si le droit est retiré
mailing_listes = { 'roots' : [ u'Nounou', u'Apprenti' ],
'+nounou' : [ u'Nounou', u'Apprenti' ],
'respbats' : [ u'Câbleur', u'Nounou' ],
'+moderateurs' : [ u'Modérateur' ],
'+disconnect' : [ u'Déconnecteur' ] }
def restart(s) :
# Rien à faire
pass
def __str__(self):
return "droits"
def build_group(self) :
""" Reconstruit les groupes dans la base LDAP """
self.anim.iter = len( self.groupes.keys() )
for group, fonctions in self.groupes.items() :
self.anim.cycle()
# Qui doit être dans ce groupe ?
res = []
for f in fonctions :
res += self.search('droits=%s' % f)['adherent']
# Récupération de la constitution du groupe actuel
dn = 'cn=%s,%s' % (group, self.base_group_dn)
data = self.conn.search_s(dn ,0,'objectClass=posixGroup')[0][1]
init_data = data.copy()
# Supression de tout les membres
data['memberUid'] = []
# Ajout des bonnes personnes
for adher in res :
uid = preattr(adher.compte())[1]
if uid and uid not in data['memberUid'] :
data['memberUid'].append(uid)
# Sauvegarde
modlist = ldap.modlist.modifyModlist(init_data,data)
self.conn.modify_s(dn,modlist)
def build_master_passwd_group(self) :
"""Reconstruit les entrées à ajouter dans master.passwd
Reconstruit également /etc/group pour le group wheel
"""
master = ""
group = "wheel:*:0:root"
self.anim.iter = 2
for fonction in ("Nounou", "Apprenti"):
self.anim.cycle()
# Qui doit être dans ce groupe ?
res = self.search('droits=%s' % fonction)['adherent']
for a in res:
if fonction == "Nounou":
# On rajoute à /etc/group
group = "%s,%s" % (group, a._data['uid'][0])
# On ajoute dans master
# Le mot de passe est bidon
master = "%s%s:$1$rQcJgpD8$ZZjjszWKnSp9rR6iZ9GPm2:%s:1000:ldap:0:0:%s:%s:%s\n" % (master,
a._data['uid'][0],
a._data['uidNumber'][0],
a._data['gecos'][0],
a._data['homeDirectory'][0],
"/bin/zsh")
# On crée le home
try:
os.mkdir("%s" % a._data['homeDirectory'][0])
except: # Façon Fred
pass
group = "%s\n" % group
# On va réécrire /etc/master.passwd
# cf man master.passwd
fichier = file("/etc/master.passwd")
for line in fichier:
if line.split(":")[4].strip() != "ldap":
master = "%s%s" % (line,master)
fichier.close()
# On va écrire par-dessus
fichier = file("/etc/master.passwd", "w")
fichier.write(master)
fichier.close()
os.system("pwd_mkdb -p /etc/master.passwd")
# On réécrit /etc/group
fichier = file("/etc/group")
for line in fichier:
if line.split(":")[0].strip() != "wheel":
group = "%s%s" % (group,line)
fichier.close()
# On va réécrire par-dessus
fichier = file("/etc/group", "w")
fichier.write(group)
fichier.close()
def print_liste(self,poste) :
""" Donne la liste des membres actifs """
for adh in self.search('droits=%s&chbre!=EXT' % poste)['adherent'] :
print "%s %s" % (adh.nom(), adh.prenom())
def sync_ML(self) :
self.anim.iter = len( self.mailing_listes.keys() )
for ML, fonctions in self.mailing_listes.items() :
self.anim.cycle()
if ML[0] == '+' :
ML = ML[1:]
only_add = 1
else :
only_add = 0
# Instance correspondant à la ML
mlist = MailList.MailList(ML)
self.mlist_to_unlock = mlist
# Qui doit être dans cette ML ?
res = []
for f in fonctions :
res += self.search('droits=%s' % f)['adherent']
# Liste des personnes déja inscrites
deja_inscrits = {} # { email en miniscules : email avec case n'importe comment }
for addr in mlist.getMemberCPAddresses(mlist.getMembers()):
deja_inscrits[addr.lower()] = addr
# Mails à ajouter
to_add = []
mail_traite = []
for adher in res :
mail = adher.mail().lower()
if mail in mail_traite : continue
mail_traite.append(mail)
if mail.find('@') == -1 : mail += '@crans.org'
if mail not in deja_inscrits.keys() :
# Visiblement pas inscrit
to_add.append([ mail, adher.Nom() ])
else :
# L'adhérent est déja inscrit
deja_inscrits.pop(mail)
# Ajout
for mail, nom in to_add :
pw = Utils.MakeRandomPassword()
userdesc = UserDesc( mail, nom, pw)
mlist.ApprovedAddMember(userdesc)
if not only_add :
# Supression des personnes inscritees en trop
for mail in deja_inscrits.values() :
mlist.ApprovedDeleteMember(mail)
mlist.Save()
mlist.Unlock()
self.mlist_to_unlock = None
def gen_conf(self) :
if gethostname().split(".")[0] == 'zamok':
self.anim = anim('\tconfiguration groupes')
try :
self.build_group()
self.anim.reinit()
print OK
except :
self.anim.reinit()
print ERREUR
if self.debug :
import traceback
traceback.print_exc()
self.anim = anim('\tconfiguration ML Crans')
try :
self.sync_ML()
self.anim.reinit()
print OK
except :
self.anim.reinit()
try :
# Au cas où...
self.mlist_to_unlock.Unlock()
except :
pass
print ERREUR
if self.debug :
import traceback
traceback.print_exc()
self.anim = anim('\tenvoi d\'un mail à roots')
try :
from mail import mail_details
adherents = []
for uid in self.uids :
adherents += self.search('uid=%s' % uid)['adherent']
mail_details(adherents, Subject = 'Modification des droits d\'un adherent')
self.anim.reinit()
print OK
except :
self.services_to_restart('droits',self.uids)
self.anim.reinit()
print ERREUR
if self.debug :
import traceback
traceback.print_exc()
elif gethostname().split(".")[0] == 'nectaris':
self.anim = anim('\tconfiguration master.passwd')
try:
self.build_master_passwd_group()
self.anim.reinit()
print OK
except:
self.anim.reinit()
print ERREUR
if self.debug :
import traceback
traceback.print_exc()
if __name__ == '__main__' :
if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) == 1 :
print "%s <switch>" % sys.argv[0].split('/')[-1].split('.')[0]
print "Génération de la liste des personnes avec le(s) droit(s) donné(s)."
sys.exit(255)
cl = droits()
for arg in sys.argv[1:] :
titre = "%s : " % arg
print titre
print "-" * len (titre)
cl.print_liste(unicode(arg,'iso-8859-1'))