Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Benjamin Graillot
scripts
Commits
99734a4d
Commit
99734a4d
authored
Dec 13, 2015
by
Gabriel Detraz
Browse files
Réécriture de droits.py avec lc_ldap et affichage
parent
20e7699a
Changes
1
Hide whitespace changes
Inline
Side-by-side
gestion/gen_confs/droits2.py
0 → 100755
View file @
99734a4d
#!/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
""
)
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment