
ML a laquelle sont inscrits les gens ayant les droits Tresorier darcs-hash:20100208140156-ddb99-2dea044a800ebe179d72d79a6feca6b20472ec17.gz
276 lines
10 KiB
Python
276 lines
10 KiB
Python
#! /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'appartenance à quel groupe Unix ?
|
|
groupes = {'adm' : [u'Nounou'],
|
|
'respbats' : [u'Imprimeur', u'Cableur', u'Nounou'],
|
|
'moderateurs' : [u'Moderateur'],
|
|
'disconnect' : [u'Bureau'],
|
|
'imprimeurs' : [u'Imprimeur', u'Nounou'],
|
|
'bureau' : [u'Bureau'],
|
|
'webadm' : [u'WebMaster'],
|
|
'webradio' : [u'WebRadio'],
|
|
}
|
|
|
|
####### Les ML
|
|
# Le + devant un nom de ML indique une synchronisation
|
|
# 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'],
|
|
'tresorier' : [u'Tresorier'],
|
|
|
|
'+federez' : [u'Bureau', u'Apprenti', u'Nounou'],
|
|
'+install-party' : [u'Bureau', u'Apprenti', u'Nounou'],
|
|
|
|
'+dsi-crans' : [u'Nounou', u'Bureau'],
|
|
'+crous-crans' : [u'Nounou', u'Bureau'],
|
|
|
|
'+wrc' : [u'WebRadio'],
|
|
}
|
|
|
|
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')
|
|
elif group == 'webradio':
|
|
# Ajout de michel et webradio
|
|
data['memberUid'].append('michel')
|
|
data['memberUid'].append('webradio')
|
|
|
|
# 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 conserve le shell
|
|
#Il faut ôter les emplacements spécifique à linux (type
|
|
#/usr/bin/zsh)
|
|
if "zsh" in a._data['loginShell'][0]:
|
|
shell = "/bin/zsh"
|
|
elif "bash" in a._data['loginShell'][0]:
|
|
shell = "/bin/bash"
|
|
else:
|
|
shell = "/bin/zsh"
|
|
# 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],
|
|
shell)
|
|
|
|
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'))
|