scripts/gestion/gen_confs/droits.py
Michel Blockelet 6c24fde691 Le Bureau n'est plus abonne a impression par defaut
On n'a qu'a donner les droits Imprimeur pour ceux que ca interesse ...
parce que au Bureau certains s'en fichent d'avoir les mails de
l'imprimante (surtout quand ils sont a des milliers de km ...)

darcs-hash:20080430214503-ddb99-c69c9fcdf79dc501f9942f4524401fe66fbfd6e4.gz
2008-04-30 23:45:03 +02:00

257 lines
9.3 KiB
Python
Executable file

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
import sys, signal, os
# 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, preattr, ldap, CransLdap, strip_accents
try:
sys.path.append('/usr/lib/mailman')
from Mailman import MailList
from Mailman import Utils
from Mailman.UserDesc import UserDesc
except:
# Machine sans mailman, les ML ne seront pas reconfigurées
pass
class droits(gen_config) :
def restart(s) :
# Rien à faire
pass
def __str__(s):
return "droits"
class droits_ldap(CransLdap, droits):
####### Les groupes
base_group_dn = 'ou=Group,dc=crans,dc=org'
# Quels droits donnent l'appartenacne à quel groupe ?
groupes = { 'adm' : [ u'Nounou' ] ,
'respbats' : [ u'Imprimeur', u'Cableur',
u'Nounou' ] ,
'moderateurs' : [ u'Moderateur' ] ,
'disconnect' : [ u'Bureau'] ,
'webcvs' : [ u'CVSWeb'],
'imprimeurs' : [u'Imprimeur', u'Nounou'],
'bureau' : [u'Bureau'],
}
####### 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'Cableur', u'Nounou', u'Bureau' ],
'+moderateurs' : [ u'Moderateur', u'Bureau'],
'+disconnect' : [ u'Nounou', u'Bureau'],
'+impression' : [ u'Imprimeur'],
'bureau' : [u'Bureau'],
'+federez' : [u'Bureau', u'Apprenti', u'Nounou'],
'+install-party' : [u'Bureau', u'Apprenti', u'Nounou'],
'+dsi-crans' : [u'Nounou', u'Bureau']
}
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 :
if not adher.droitsGeles():
uid = preattr(adher.compte())[1]
if uid and uid not in data['memberUid'] :
data['memberUid'].append(uid)
if group == 'adm':
# Ajout de logcheck et d'arpwatch
data['memberUid'].append('logcheck')
data['memberUid'].append('arpwatch')
# Sauvegarde
modlist = ldap.modlist.modifyModlist(init_data,data)
self.conn.modify_s(dn,modlist)
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, strip_accents(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) :
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()
print ERREUR
if self.debug :
import traceback
traceback.print_exc()
try:
# Au cas où...
self.mlist_to_unlock.Unlock()
except :
pass
class droits_openbsd(droits) :
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 = crans_ldap().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")
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 gen_conf(self) :
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'))