Commit 99734a4d authored by Gabriel Detraz's avatar Gabriel Detraz
Browse files

Réécriture de droits.py avec lc_ldap et affichage

parent 20e7699a
#!/bin/bash /usr/scripts/python.sh
# -*- coding: utf-8 -*-
import sys, signal, os
import getopt
import ldap
# Imports pour LDAP
from gestion.config import droits_groupes, droits_mailing_listes
from gestion.gen_confs import gen_config
from gestion import affichage
from lc_ldap import shortcuts
from lc_ldap.crans_utils import strip_accents
conn = shortcuts.lc_ldap_admin()
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(droits):
####### Les groupes
base_group_dn = 'ou=Group,dc=crans,dc=org'
def build_group(self) :
""" Reconstruit les groupes dans la base LDAP """
animation = affichage.Animation(texte="Reconfiguration des groupes unix", nb_cycles=len(droits_groupes.keys()), couleur=True, kikoo=True)
for group, fonctions in droits_groupes.items() :
animation.new_step()
# Qui doit être dans ce groupe ?
res = []
for f in fonctions :
res += conn.search(u'droits=%s' % f)
# Récupération de la constitution du groupe actuel
dn = 'cn=%s,%s' % (group, self.base_group_dn)
data = 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 = str(adher['uid'][0].encode('utf-8'))
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 webradio
data['memberUid'].append('webradio')
# Sauvegarde
modlist = ldap.modlist.modifyModlist(init_data,data)
conn.modify_s(dn,modlist)
def print_liste(self,poste) :
""" Donne la liste des membres actifs """
for adh in conn.search(u'(&(droits=%s)(!(chbre=EXT)))' % poste):
print "%s %s" % (adh['nom'][0], adh['prenom'][0])
def config_ML(self, mode='autosync', args=None) :
""" Reconfigure les MLs.
mode désigne le mode de fonctionnement :
* autosync est le mode par défaut, il resynchronise les MLs avec les
droits
* forcedel fait comme autosync, en demandant un args du type
[('ml1', 'all'), ('ml2', 'adresse_mail1')]
et supprime les adresses mail concernées de la mailing-liste,
'all' pour toutes les MLs ne correspondant pas à des gens avec
des droits (seulement si elles ne seront pas réinscrites
automatiquement)
* getunsync retourne les gens qui devraient être inscrits/désinscrits
de chaque ML
args désigne l'argument au mode choisi."""
if mode == 'getunsync':
unsync = {}
label = u'Recherche des ml non synchronisées'
else:
label = u'Reconfiguration des ml Cr@ns'
try:
animation = affichage.Animation(texte=label, nb_cycles=len(droits_mailing_listes.keys()), couleur=True, kikoo=True)
except:
pass
for ML, fonctions in droits_mailing_listes.items() :
try:
animation.new_step()
except:
pass
if ML[0] == '+' :
ML = ML[1:]
only_add = True
else :
only_add = False
# 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 += conn.search(u'droits=%s' % f)
# 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'][0].lower()
if mail in mail_traite : continue
mail_traite.append(mail)
if adher.get('uid', '') != '' and not mail.endswith('@crans.org') : mail += '@crans.org'
if mail not in deja_inscrits.keys() :
# Visiblement pas inscrit
to_add.append([ mail, adher['nom'][0].value ])
else :
# L'adhérent est déja inscrit
deja_inscrits.pop(mail)
if mode == 'autosync' or mode == 'forcedel':
# Ajout
for mail, nom in to_add :
pw = Utils.MakeRandomPassword()
userdesc = UserDesc(mail, strip_accents(nom), pw)
#mlist.ApprovedAddMember(userdesc)
if not only_add or mode == 'forcedel':
# Supression des personnes inscritees en trop
if not only_add or (mode == 'forcedel' and args != None
and (ML, 'all') in args):
for mail in deja_inscrits.values() :
mlist.ApprovedDeleteMember(mail)
else:
# Suppression des mails demandés
for mail in deja_inscrits.values() :
if (ML, mail) in args:
mlist.ApprovedDeleteMember(mail)
mlist.Save()
elif mode == 'getunsync':
if to_add or deja_inscrits:
unsync[ML] = (only_add, map(lambda (x,y): y, to_add),
deja_inscrits.values())
mlist.Unlock()
self.mlist_to_unlock = None
if mode == 'getunsync':
return unsync
def gen_conf(self):
try:
self.build_group()
print affichage.OK
except:
print affichage.ERREUR
if self.debug :
import traceback
traceback.print_exc()
try:
self.config_ML()
print affichage.OK
except:
print affichage.ERREUR
if self.debug :
import traceback
traceback.print_exc()
try:
# Au cas où...
self.mlist_to_unlock.Unlock()
except :
pass
class desabonner_ml(droits_ldap):
def gen_conf(self):
animation = affichage.Animation(texte="Désabonnnement ml Cr@ns", nb_cycles=1, couleur=True, kikoo=True)
try:
to_del = []
for arg in self.args:
(mail, ml) = arg.split('$')
to_del.append((ml, "%s@crans.org" % mail))
self.config_ML(mode='forcedel', args=to_del)
animation.new_step()
print affichage.OK
except:
print affichage.ERREUR
if self.debug :
import traceback
traceback.print_exc()
def usage():
print "%s [options] [arguments]" % sys.argv[0]
print "Options :"
print " * -h : afficher cette aide"
print " * -d ml1:mail1,mail2 ml2:all : enlever des adresses mail"
print " * -p droit1 droit2 : afficher les membres ayant tels droits"
print " * -u : affiche les MLs avec des gens à inscrire / enlever"
if __name__ == '__main__' :
try:
opts, args = getopt.getopt(sys.argv[1:], "dhpu", [])
except:
usage()
sys.exit()
if len(opts) == 0 or '-h' in sys.argv[1:]:
usage()
sys.exit()
cl = droits_ldap()
for o, a in opts:
if o == '-d':
# Suppression d'adresses mail
to_del = []
for arg in args:
if ':' in arg:
[ml, mails] = arg.split(':', 1)
to_del.extend(map(lambda m: (ml, m), mails.split(',')))
print "Suppression forcée : %s ..." % str(to_del)
cl.config_ML(mode='forcedel', args=to_del)
elif o == '-p':
# Affichage des membres ayant certains droits
for arg in args:
titre = "%s : " % arg
print titre
print "-" * len (titre)
cl.print_liste(arg)
elif o == '-u':
# Affichage des MLs non synchronisées
print "MLs non synchronisées :"
unsync = cl.config_ML(mode='getunsync')
for ml in unsync.keys():
(only_add, to_add, to_del) = unsync[ml]
print u"%s: À ajouter: %s / À enlever: %s%s" % (ml,
', '.join(to_add), ','.join(to_del),
u" (ne seront pas enlevées automatiquement)"
if to_add == 1 else "")
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment