Commit cc31727b authored by Stephane Glondu's avatar Stephane Glondu

[gestion/*.py] Ré-encodage de certains scripts en UTF-8

Ignore-this: dafa22ed56eaf0d816fd089e42672eb5

darcs-hash:20090309212124-0445d-09ac8ae4052b6f333706be1baa1c7f4d94455fd5.gz
parent 7addc503
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
""" Collection de fonction/classe pour avoir un bel affichage
Copyright (C) Frédéric Pauget
Copyright (C) Frédéric Pauget
Licence : GPLv2
"""
import sys, re, os, tempfile
# Détermination de l'encodage
# Détermination de l'encodage
encoding = None
try:
from locale import getpreferredencoding
......@@ -20,7 +20,7 @@ except:
if not encoding:
encoding = sys.stdin.encoding or "ISO-8859-15"
# Si aucune locale n'est définie, on se met en ISO-8859-15
# Si aucune locale n'est définie, on se met en ISO-8859-15
if encoding == "ANSI_X3.4-1968":
encoding = "ISO-8859-15"
......@@ -32,13 +32,13 @@ else:
stdout_atty = sys.stdout.isatty()
def dialog(backtitle,arg,dialogrc='') :
""" Affiche la boite de dialogue défine avec les arguments fournis
""" Affiche la boite de dialogue défine avec les arguments fournis
(cf man dialog)
si tout se déroule bien retourne :
si tout se déroule bien retourne :
[ 0, [ reponse(s) ] ]
si annulatin retourne :
[ 1, [] ]
si appui sur ESC demande confirmation de l'abandon et exécute sys.exit(0)
si appui sur ESC demande confirmation de l'abandon et exécute sys.exit(0)
si erreur dans les arguments raise RuntimeError
"""
f = tempfile.NamedTemporaryFile()
......@@ -49,7 +49,7 @@ def dialog(backtitle,arg,dialogrc='') :
# Annuler
f.close()
return [ 1, [] ]
# Lecture du fichier de résultat et effacement
# Lecture du fichier de résultat et effacement
try:
result=f.readlines()
f.close()
......@@ -62,7 +62,7 @@ def dialog(backtitle,arg,dialogrc='') :
raise RuntimeError( arg, result[1].strip() )
elif res==65280 :
# Appui sur ESC
arg1 = u'--title "Annulation" --yesno "Quitter ?\nLes dernières modifications seront perdues." 6 48'
arg1 = u'--title "Annulation" --yesno "Quitter ?\nLes dernières modifications seront perdues." 6 48'
print backtitle
cmd = u'%s /usr/bin/dialog --backtitle "%s" %s' % (dialogrc, backtitle,arg1)
res = os.system(cmd.encode('iso-8859-15','ignore') )
......@@ -73,8 +73,8 @@ def dialog(backtitle,arg,dialogrc='') :
def coul(txt, col=None):
"""
Retourne la chaine donnée encadrée des séquences qui
vont bien pour obtenir la couleur souhaitée
Retourne la chaine donnée encadrée des séquences qui
vont bien pour obtenir la couleur souhaitée
Les couleur sont celles de codecol
Il est possible de changer la couleur de fond grace aux couleur f_<couleur>
"""
......@@ -123,7 +123,7 @@ def cprint(txt, col='blanc', newline=True):
def tableau(data, titre=None, largeur=None, alignement=None, format=None):
"""
Retourne une chaine formatée repésentant un tableau.
Retourne une chaine formatée repésentant un tableau.
data : liste de listes, chacune contenant les valeurs d'une ligne
......@@ -132,7 +132,7 @@ def tableau(data, titre=None, largeur=None, alignement=None, format=None):
largeur : liste des largeurs des colonnes, '*' met la plus grande
largeur possible.
Si None, réduit aux max chaque colonne
Si None, réduit aux max chaque colonne
alignement : liste des alignements : c = centrer
g = gauche
......@@ -149,7 +149,7 @@ def tableau(data, titre=None, largeur=None, alignement=None, format=None):
elif titre :
nbcols = len(titre)
else :
return u'Aucune donnée'
return u'Aucune donnée'
# Formats
#########
......@@ -195,12 +195,12 @@ def tableau(data, titre=None, largeur=None, alignement=None, format=None):
# Alignement
if l > largeur :
# découpage d'une chaine trop longue
# découpage d'une chaine trop longue
regexp = re.compile('\x1b\[1;([0-9]|[0-9][0-9])m')
new_data = u''
new_len = 0
# On laisse la mise en forme et on coupe les caratères affichés
# On laisse la mise en forme et on coupe les caratères affichés
while True :
s = regexp.search(data)
if s and not s.start() :
......@@ -208,12 +208,12 @@ def tableau(data, titre=None, largeur=None, alignement=None, format=None):
new_data += data[:s.end()]
data = data[s.end():]
elif new_len < largeur - 1 :
# c'est un caratère normal, et il y a la place
# c'est un caratère normal, et il y a la place
new_data += data[0]
data = data[1:]
new_len += 1
else :
# c'est un caratère normal mais on a dépassé le max
# c'est un caratère normal mais on a dépassé le max
data = data[1:]
if not data :
return new_data + '*'
......@@ -237,19 +237,19 @@ def tableau(data, titre=None, largeur=None, alignement=None, format=None):
if titre :
# ligne de titre
chaine = sep_col + sep_col.join([aligne(titre[i],'c',largeur[i]) for i in range(nbcols)]) + sep_col + u'\n'
# ligne de séparation
# ligne de séparation
chaine += sep_col + u'+'.join([u'-'*largeur[i] for i in range(nbcols)]) + sep_col + u'\n'
else :
chaine = u''
# Les données
# Les données
#############
chaine += u'\n'.join([sep_col + sep_col.join([ligne[i] for i in range(nbcols)]) + sep_col for ligne in data])
return chaine
def get_screen_size():
"""Retourne la taille de l'écran.
"""Retourne la taille de l'écran.
Sous la forme d'un tuble (lignes, colonnes)"""
......@@ -265,7 +265,7 @@ def get_screen_size():
def prompt(prompt, defaut='', couleur='gras'):
u"""
Pose la question prompt en couleur (défaut gras), retourne la réponse.
Pose la question prompt en couleur (défaut gras), retourne la réponse.
"""
sys.stdout.write(coul(prompt, couleur).encode(encoding))
if defaut :
......@@ -276,12 +276,12 @@ def prompt(prompt, defaut='', couleur='gras'):
return v
class anim :
""" Permet de créer une animation :
""" Permet de créer une animation :
truc................./
truc.................-
truc.................\
truc.................|
ou une barre de progression si le nombre total d'itérations est founi.
ou une barre de progression si le nombre total d'itérations est founi.
"""
def __init__(self,truc,iter=0) :
""" Affichage de :
......@@ -304,7 +304,7 @@ class anim :
def cycle(self) :
""" Efface la ligne courrante et
affiche : truc..................?
? caratère variant à chaque appel """
? caratère variant à chaque appel """
sys.stdout.write(el + self.txt)
if self.iter!=0 :
sys.stdout.write('[')
......
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
#
# $Id: ajoute_chambre.py,v 1.2 2007-02-24 01:08:45 dimino Exp $
#
......@@ -25,7 +25,7 @@
#
#
# Description:
# Ajoute une chambre sur une prise libre (fait pour le batiment g la base)
# Ajoute une chambre sur une prise libre (fait pour le batiment g à la base)
#
import sys, os
......@@ -35,14 +35,14 @@ sys.path.append('/usr/scripts/gestion')
from annuaires import chbre_prises, reverse, bat_switchs
from affich_tools import cprint
# C'est juste pour le dboggage
# C'est juste pour le déboggage
__fichier_annuaire = "/usr/scripts/gestion/annuaires.py"
def assigne_chambre(prise, chbre):
""" Assigne une chambre une prise.
""" Assigne une chambre à une prise.
prise doit tre de la forme bnnn[g/d], ou nnn[g/d], dans ce dernier cas le btiment est le g.
prise doit être de la forme bnnn[g/d], ou nnn[g/d], dans ce dernier cas le bâtiment est le g.
"""
if len(chbre) != 3 or not chbre.isdigit():
......@@ -75,7 +75,7 @@ prise doit
# if chambre != 'XXX':
# return 'prise_utilisee'
# Ajout effectif de la chambre sur la prise donne
# Ajout effectif de la chambre sur la prise donnée
annuaire = open(__fichier_annuaire, 'r')
tampon = annuaire.read()
......@@ -109,15 +109,15 @@ prise doit
if not user:
user = os.getenv('USER') or "inconnu"
# Vu que a va tre mis dans la ligne de commande xcuter aprs,
# autant tre parano.
# Vu que ça va être mis dans la ligne de commande éxécuter après,
# autant être parano.
for c in user:
if not (c.isalnum or c in [ '-', '_' ]):
user = "(uid=%d)" % (os.getuid())
break
os.system('cd /usr/scripts/gestion && /usr/bin/cvs commit %s \
-m "ajoute_chambre.py: chambre %s%s ajout sur la prise %s%s par %s"' %
-m "ajoute_chambre.py: chambre %s%s ajouté sur la prise %s%s par %s"' %
(__fichier_annuaire, bat, chbre, bat, prise, user))
......@@ -133,18 +133,18 @@ def __aide():
""" Aide """
cprint(u"""Usage: %s [OPTIONS] <prise> <chambre>
Ajoute une chambre sur une prise qui n'tait pas encore utilis.
Ajoute une chambre sur une prise qui n'était pas encore utilisé.
Options:
-h, --help affiche cette aide
<prise> doit tre de la forme bnnn ou nnn o:
- B est le batiment (g si non spcifi)
- nnn est le numro de la prise
<prise> doit être de la forme bnnn ou nnn où:
- B est le batiment (g si non spécifié)
- nnn est le numéro de la prise
<chambre> doit tre de la forme nnn
<chambre> doit être de la forme nnn
Rapporter toutes anomalies <dimino@crans.org>.""" % sys.argv[0].split('/')[-1].split('.')[0])
Rapporter toutes anomalies à <dimino@crans.org>.""" % sys.argv[0].split('/')[-1].split('.')[0])
sys.exit(0)
......@@ -173,7 +173,7 @@ if __name__ == '__main__':
__usage(u"Format de la chambre invalide")
elif resultat == 'chambre_deja_cablee':
__usage(u"La chambre est dj cable")
__usage(u"La chambre est déjà cablée")
elif resultat == 'batiment_inconnu':
__usage(u"Le batiment n'existe pas")
......@@ -182,11 +182,11 @@ if __name__ == '__main__':
__usage(u"La prise n'existe pas")
elif resultat == 'prise_utilisee':
__usage(u"La prise est dj utilise")
__usage(u"La prise est déjà utilisée")
elif resultat == 'prise_introuvable':
cprint(u"""La prise n'a pas t trouv dans l'annuaire.
Vrifiez que vous avez bien mis le numro de prise et de chambre.""")
cprint(u"""La prise n'a pas été trouvé dans l'annuaire.
Vérifiez que vous avez bien mis le numéro de prise et de chambre.""")
elif resultat == 'fichier_annuaire_invalide':
cprint(u"Le fichier d'annuaire n'est pas reconnu, envoyer un mail dimino@crans.org")
cprint(u"Le fichier d'annuaire n'est pas reconnu, envoyer un mail à dimino@crans.org")
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
# Liste des btiments avec switch manageables
# Liste des bâtiments avec switch manageables
bat_switchs = [ 'a' , 'b' , 'c' , 'h' , 'i' , 'j' , 'm' , 'p']
bat_manuels = [ 'o' , 'r' ] # Y en a plus aucun :) ou presque
......@@ -9,8 +9,8 @@ aide={
'g' : "appart du RDC=G901"
}
# Toute chambre ne commencant pas par 3 chiffres sera considr comme un local club
# En consquence les locaux club ne devront pas commencer par 3 chiffres.
# Toute chambre ne commencant pas par 3 chiffres sera considéré comme un local club
# En conséquence les locaux club ne devront pas commencer par 3 chiffres.
#Pour le G :
# le signe - indique un cable 10 Mbps
......@@ -52,8 +52,8 @@ chbre_prises={ 'a' :
'603d':'301', '608d':'302', 'cl6':'303'},
# Le local club du 6me et les chambres A608d, A603d sont sur la
# prise 202 (switch au 6me dans le local technique cot de
# Le local club du 6ème et les chambres A608d, A603d sont sur la
# prise 202 (switch au 6ème dans le local technique à coté de
# l'ascensseur
'b' :
......@@ -465,11 +465,11 @@ chbre_prises={ 'a' :
'XXX':'641' , 'XXX':'642' , 'XXX':'643' , 'XXX':'644' ,
'XXX':'645' , 'XXX':'646', 'XXX':'647' , 'XXX':'648' ,
# Ce switch n'est pas au btiment G comme on pourrait le croire
# Ce switch n'est pas au bâtiment G comme on pourrait le croire
'999':'701' , '998':'702' , '997':'703' , '996':'704'}
}
# Prises d'uplink, de machines du crans / Prises d'utilit CRANS
# Prises d'uplink, de machines du crans / Prises d'utilité CRANS
uplink_prises={ 'a' :
{ 49 : 'uplink->backbone', 50 : 'uplink->bata-1',
149 : 'uplink->bata-0', 150 : 'uplink->bata-2',
......@@ -535,8 +535,8 @@ def reverse(bat) :
def all_switchs(bat=None):
"""Retourne la liste des switchs pour un batiment.
Si bat est donn, seulement pour le btiment demand, sinon pour
tous les btiments. bat peut tre une liste aussi. Le backbone n'est
Si bat est donné, seulement pour le bâtiment demandé, sinon pour
tous les bâtiments. bat peut être une liste aussi. Le backbone n'est
pas pris en compte. La convention est batx-y sauf si y=0 et on a donc
simplement batx"""
def cmp(x,y):
......@@ -568,7 +568,7 @@ def locaux_clubs() :
'Mcl0' : 'Shape',
'Mcl1' : 'Krobot',
'EXT' : 'EXT' }
# Ajout des locaux d'tage A, B et C
# Ajout des locaux d'étage A, B et C
for b in 'ABC' :
for i in range(2,7) :
locaux_clubs['%scl%i' % ( b, i)] = '%i@%s' % (i, b)
......
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
# Serveur SSL qui renvoie la MAC correspondant une IP
# Ce serveur est utilis sur Nectaris par les bornes wifi pour faire
# les requtes ARP.
# Serveur SSL qui renvoie la MAC correspondant à une IP
# Ce serveur est utilisé sur Nectaris par les bornes wifi pour faire
# les requêtes ARP.
# Lancement : twistd -n -y arp.py --pidfile=/var/run/arp.pid
# Pas de -n pour qu'il passe en fond
......@@ -29,18 +29,18 @@ import re
class ServerContextFactory(ContextFactory):
def getContext(self):
"""Cration d'un contexte SSL ct serveur."""
"""Création d'un contexte SSL côté serveur."""
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_certificate_file('/etc/ssl/certs/nectaris.pem')
ctx.use_privatekey_file('/etc/ssl/private/nectaris.pem')
return ctx
class ARPProtocol(basic.LineReceiver):
"""Protocole de communication pour rcuprer une adresse MAC.
"""Protocole de communication pour récupérer une adresse MAC.
Chaque lignee reue contient une adresse IP et le serveur rpond
Chaque lignee reçue contient une adresse IP et le serveur répond
avec l'adresse MAC correspondante ou avec `unknown' si celle-ci
est inconnue (ou non autorise).
est inconnue (ou non autorisée).
"""
def lineReceived(self, IP):
self.factory.getMac(IP
......@@ -51,7 +51,7 @@ class ARPProtocol(basic.LineReceiver):
def answerMac(self, m):
"""Renvoie au client la bonne adresse MAC.
`m' peut tre None.
`m' peut être None.
"""
if m:
return self.transport.write(str(m) + "\r\n")
......@@ -59,7 +59,7 @@ class ARPProtocol(basic.LineReceiver):
return self.transport.write("unknown\r\n")
class ARPFactory(protocol.ServerFactory):
"""Backend du serveur. Effectue la rsolution IP/MAC."""
"""Backend du serveur. Effectue la résolution IP/MAC."""
protocol = ARPProtocol
def __init__(self, network='0.0.0.0/0'):
......@@ -70,26 +70,26 @@ class ARPFactory(protocol.ServerFactory):
return defer.succeed(self._getMac(IP))
def _getMac(self, IP):
"""Fonction relle, synchrone, qui obtient l'adresse MAC."""
"""Fonction réelle, synchrone, qui obtient l'adresse MAC."""
try:
if AddrInNet(IP, self.network):
results = self.ldap.search('ip=%s' % IP)['machine']
if results:
# On a au moins un rsultat, on retourne le premier
# On a au moins un résultat, on retourne le premier
return results[0].mac().strip()
else:
# On a rien
return None
else:
# L'IP n'est pas autorise
# L'IP n'est pas autorisée
return None
except ValueError:
# A priori, ce n'tait pas une IP
# A priori, ce n'était pas une IP
return None
# Corps du programme
# On coute sur le port 5243 et on ne rpond qu'aux requtes concernant le
# sous-rseau wifi
# On écoute sur le port 5243 et on ne répond qu'aux requêtes concernant le
# sous-réseau wifi
application = service.Application('arp')
factory = ARPFactory('138.231.148.0/21')
# Remplacer SSL par TCP pour ne pas utiliser SSL et virer ServerContextFactory
......
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
"""
Script de changement de mots de passe LDAP
......@@ -7,14 +7,14 @@ Script de changement de mots de passe LDAP
Utilisation :
* cas 1 : sans arguements par un utlisateur lambda :
changement de son propre mdp
* cas 2 : avec argument par un utilisateur ayant accès
total à la base LDAP (respbats) mais PAS ROOT :
changement du mdp de l'adhérent fourni en argument,
impossibilité de modifier le mdp d'un compte privilégié
* cas 3 : lancé par root : possibilité de modifier
* cas 2 : avec argument par un utilisateur ayant accès
total à la base LDAP (respbats) mais PAS ROOT :
changement du mdp de l'adhérent fourni en argument,
impossibilité de modifier le mdp d'un compte privilégié
* cas 3 : lancé par root : possibilité de modifier
tous les mots de passe LDAP
Copyright (C) Frédéric Pauget
Copyright (C) Frédéric Pauget
Licence : GPLv2
"""
......@@ -33,17 +33,17 @@ uri = 'ldap://ldap.adm.crans.org'
syslog.openlog('chgpass',syslog.LOG_PID,syslog.LOG_AUTH)
def decode64(chaine):
""" Décode une chaine de caratère utf8/64 et retourne un unicode """
""" Décode une chaine de caratère utf8/64 et retourne un unicode """
try:
return base64.decodestring(chaine).decode('utf8','ignore')
except:
return chaine.decode('utf8','ignore')
def chgpass(dn) :
cprint(u"""Le nouveau mot de passe doit comporter au minimum 6 caractères.
Il ne doit pas être basé sur un mot du dictionnaire.""", 'jaune')
print "Il est conseillé d'utiliser une combinaison de minuscules, majuscules,\nde chiffres et d'au moins un caractère spécial."
print "Le mot de passe tapé ne sera pas écrit à l'écran."
cprint(u"""Le nouveau mot de passe doit comporter au minimum 6 caractères.
Il ne doit pas être basé sur un mot du dictionnaire.""", 'jaune')
print "Il est conseillé d'utiliser une combinaison de minuscules, majuscules,\nde chiffres et d'au moins un caractère spécial."
print "Le mot de passe tapé ne sera pas écrit à l'écran."
print "Taper Ctrl-D pour abandonner"
try :
......@@ -60,17 +60,17 @@ Il ne doit pas
try:
mdp = mdp.encode('ascii')
except UnicodeEncodeError:
cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)',
cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)',
'rouge')
continue
## 2bis - On évite une attaque de type injection de code shell
## 2bis - On évite une attaque de type injection de code shell
if "'" in mdp:
cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)',
cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)',
'rouge')
continue
## 3 - assez de caractères de types différents ?
## 3 - assez de caractères de types différents ?
chiffres = 0
majuscules = 0
minuscules = 0
......@@ -94,9 +94,9 @@ Il ne doit pas
test = commands.getoutput("echo '%s' | /usr/sbin/crack_testlib" % mdp)
if test.split(':')[-1] != ' ok' :
commentaire = {
' it does not contain enough DIFFERENT characters': u'Il y a trop de caractères identiques.' ,
' it is based on a dictionary word': u'Le mot de passe est basé sur un mot du dictionnaire' ,
' it is too simplistic/systematic': u'Le mot de passe est trop simple/répétitif'
' it does not contain enough DIFFERENT characters': u'Il y a trop de caractères identiques.' ,
' it is based on a dictionary word': u'Le mot de passe est basé sur un mot du dictionnaire' ,
' it is too simplistic/systematic': u'Le mot de passe est trop simple/répétitif'
}.get(test.split(':')[-1],test.split(':')[-1])
cprint(commentaire, 'rouge')
continue
......@@ -104,7 +104,7 @@ Il ne doit pas
### On redemande le mot de passe
mdp1 = getpass.getpass('Retaper mot de passe : ')
if mdp != mdp1 :
cprint(u'Les deux mots de passe entrés sont différents, réesayer', 'rouge')
cprint(u'Les deux mots de passe entrés sont différents, réesayer', 'rouge')
continue
break
......@@ -114,7 +114,7 @@ Il ne doit pas
cprint(u'Erreur lors du changement de mot de passe', 'rouge')
syslog.syslog("LDAP password changed for dn=%s" % dn)
else :
cprint(u'Changement effectué avec succès', u'vert')
cprint(u'Changement effectué avec succès', u'vert')
except KeyboardInterrupt :
cprint(u'\nAbandon', 'rouge')
......@@ -125,7 +125,7 @@ Il ne doit pas
pass
if __name__ == '__main__' :
sys.stdout.write('\r \r') # Pour esthétique lors de l'utilisation par sudo
sys.stdout.write('\r \r') # Pour esthétique lors de l'utilisation par sudo
if len(sys.argv) == 1 :
# Changement de son mot de passe
login = getuser()
......@@ -136,7 +136,7 @@ if __name__ == '__main__' :
print "Changement du mot de passe du compte choisi."
sys.exit(255)
else :
# Changement du mot de passe par un câbleur ou une nounou
# Changement du mot de passe par un câbleur ou une nounou
login = sys.argv[1]
self_mode = False
for c in login[:] :
......@@ -153,12 +153,12 @@ if __name__ == '__main__' :
else :
s = commands.getoutput("/usr/bin/ldapsearch -D cn=readonly,dc=crans,dc=org -y/etc/ldap/readonly -x -LLL '(&(objectClass=posixAccount)(uid=%s))' dn nom prenom droits | grep -v MultiMachines" % login).strip()
if not s :
cprint(u'Login non trouvé dans la base LDAP', 'rouge')
cprint(u'Login non trouvé dans la base LDAP', 'rouge')
sys.exit(3)
# Ca a l'air bon
if s.find('\n\n') != -1 :
# Plusieurs trouvé : pas normal
# Plusieurs trouvé : pas normal
cprint(u'Erreur lors de la recherche du login : plusieurs occurences !', 'rouge')
sys.exit(4)
......@@ -174,7 +174,7 @@ if __name__ == '__main__' :
sys.exit(5)
if self_mode :
# Il faut vérifier l'ancien mot de passe
# Il faut vérifier l'ancien mot de passe
ldap_auth_dn = dn
ldap_password = getpass.getpass('Mot de passe actuel : ')
s = commands.getoutput("/usr/bin/ldapwhoami -H '%s' -x -D '%s' -w '%s'" % ( uri, ldap_auth_dn, ldap_password ) ).strip()
......@@ -188,7 +188,7 @@ if __name__ == '__main__' :
sys.exit(8)
elif len(s) > 3 and os.getuid()!=0 :
# Adhérent avec droits et on est pas root
# Adhérent avec droits et on est pas root
From = 'roots@crans.org'
To = 'roots@crans.org'
mail = """From: Root <%s>
......@@ -203,7 +203,7 @@ Tentative de changement du mot de passe de %s par %s.
conn = smtplib.SMTP('localhost')
conn.sendmail(From, To , mail )
conn.quit()
cprint(u'Impossible de changer le mot de passe de cet adhérent : compte privilégié', 'rouge')
cprint(u'Impossible de changer le mot de passe de cet adhérent : compte privilégié', 'rouge')
sys.exit(6)
# Finalement !
......
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
""" Changement du shell de l'utilisateur lancant le programme
DOIT ETRE LANCE PAR SUDO
Copyright (C) Frédéric Pauget
Copyright (C) Frédéric Pauget
Licence : GPLv2
"""
import os, sys
......@@ -15,18 +15,18 @@ from ldap_crans import crans_ldap
db = crans_ldap()
uid = os.getenv('SUDO_UID')
if not uid :
print "Impossible de déterminer l'utilisateur"
print "Impossible de déterminer l'utilisateur"
sys.exit(1)
s = db.search('uidNumber=%s' % os.getenv('SUDO_UID'),'w')
# On vérifie que c'est pas un club
# On vérifie que c'est pas un club
club = s['club']
if len(club) == 1 :
print 'Pas de changement de shell pour les clubs'
sys.exit(2)
# On regarde si on a des résultats dans les adhérents
# On regarde si on a des résultats dans les adhérents
adh = s['adherent']
if len(adh) != 1 :
print 'Erreur fatale lors de la consultation de la base LDAP'
......
This diff is collapsed.
#! /usr/bin/env python
# -*- coding: iso8859-15 -*-
# -*- coding: utf-8 -*-
###############################################################################
# config_mail : gestion du .forward et .procmailrc des adhrents
# config_mail : gestion du .forward et .procmailrc des adhérents
###############################################################################
# The authors of this code are
# Etienne Chov <etienne.chove@crans.org>
# Etienne Chové <etienne.chove@crans.org>
#
# Copyright (C) 2006 Etienne Chov
# Copyright (C) 2006 Etienne Chové
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
......@@ -28,7 +28,7 @@
## Chaines de formatage pour le procmailrc
"""
Script permetant de grer sa configuration mail
Script permetant de gérer sa configuration mail
Usage : ConfigMail.py [--forward=(|<mail>)] [--spam=(accepte|marque|supprime)]
Retourne :
......@@ -37,7 +37,7 @@ Retourne :
"""
procmail_warning = """################################################################
# Ce fichier de configuration a t automatiquement gnr par #
# Ce fichier de configuration a été automatiquement généré par #
# l'intranet. #