Commit eae0d21f authored by Stephane Glondu's avatar Stephane Glondu

[debian/*.py] remove trailing whitespaces

Ignore-this: f62e84c258c847013d307d12acdf489e

darcs-hash:20090309212356-0445d-d8338d06f968f316fcd085446023123be87040f7.gz
parent cc31727b
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# Serveur SSL qui renvoie la MAC correspondant à une IP
# Ce serveur est utilisé sur Nectaris par les bornes wifi pour faire
......@@ -57,15 +57,15 @@ class ARPProtocol(basic.LineReceiver):
return self.transport.write(str(m) + "\r\n")
else:
return self.transport.write("unknown\r\n")
class ARPFactory(protocol.ServerFactory):
"""Backend du serveur. Effectue la résolution IP/MAC."""
protocol = ARPProtocol
def __init__(self, network='0.0.0.0/0'):
self.ldap = crans_ldap()
self.network = network
def getMac(self, IP):
return defer.succeed(self._getMac(IP))
......
......@@ -5,7 +5,7 @@
Script de changement de mots de passe LDAP
Utilisation :
* cas 1 : sans arguements par un utlisateur lambda :
* 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 :
......@@ -28,7 +28,7 @@ try :
except :
ldap_password = ''
ldap_auth_dn = ''
uri = 'ldap://ldap.adm.crans.org'
syslog.openlog('chgpass',syslog.LOG_PID,syslog.LOG_AUTH)
......@@ -45,14 +45,14 @@ 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 :
while 1 :
mdp = getpass.getpass('Nouveau mot de passe : ')
### Test du mdp
## 1 - Longueur
if len(mdp) < 6 :
if len(mdp) < 6 :
cprint(u'Mot de passe trop court', 'rouge')
continue
......@@ -68,8 +68,8 @@ Il ne doit pas être basé sur un mot du dictionnaire.""", 'jaune')
if "'" in mdp:
cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)',
'rouge')
continue
continue
## 3 - assez de caractères de types différents ?
chiffres = 0
majuscules = 0
......@@ -89,33 +89,33 @@ Il ne doit pas être basé sur un mot du dictionnaire.""", 'jaune')
(not majuscules and not minuscules) :
cprint(u'Mot de passe trop simple.', 'rouge')
continue
## 4 - Cracklib
test = commands.getoutput("echo '%s' | /usr/sbin/crack_testlib" % mdp)
if test.split(':')[-1] != ' ok' :
commentaire = {
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'
}.get(test.split(':')[-1],test.split(':')[-1])
cprint(commentaire, 'rouge')
continue
### 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')
continue
break
# Changement mdp
if os.system("/usr/bin/ldappasswd -H '%s' -x -D '%s' -w '%s' '%s' -s '%s' > /dev/null" % (uri, ldap_auth_dn, ldap_password, dn, mdp) ):
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')
except KeyboardInterrupt :
cprint(u'\nAbandon', 'rouge')
pass
......@@ -130,7 +130,7 @@ if __name__ == '__main__' :
# Changement de son mot de passe
login = getuser()
self_mode = True
elif '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) != 2 :
print "%s <login>" % sys.argv[0].split('/')[-1].split('.')[0]
print "Changement du mot de passe du compte choisi."
......@@ -143,11 +143,11 @@ if __name__ == '__main__' :
if not c.isalnum() and not c=='-' :
cprint(u'Login incorrect', 'rouge')
sys.exit(1)
if getuser() == login :
cprint(u'Utiliser passwd pour changer son propre mot de passe', 'rouge')
sys.exit(2)
if self_mode :
s = commands.getoutput('sudo -u respbats ldap_whoami')
else :
......@@ -155,13 +155,13 @@ if __name__ == '__main__' :
if not s :
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
cprint(u'Erreur lors de la recherche du login : plusieurs occurences !', 'rouge')
sys.exit(4)
s = s.split('\n')
try :
dn = s[0].split()[1]
......@@ -172,13 +172,13 @@ if __name__ == '__main__' :
except :
cprint(u'Erreur lors de la recherche du login', 'rouge')
sys.exit(5)
if self_mode :
# 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()
try :
try :
resultat = s.split('\n')[0].split(':')[1].strip()
except :
cprint(u"Erreur lors de l'authentification", 'rouge')
......@@ -186,7 +186,7 @@ if __name__ == '__main__' :
if resultat != dn :
cprint({ 'Invalid credentials (49)': u'Mot de passe invalide' }.get(resultat, resultat), 'rouge')
sys.exit(8)
elif len(s) > 3 and os.getuid()!=0 :
# Adhérent avec droits et on est pas root
From = 'roots@crans.org'
......
#! /usr/bin/env python
# -*- coding: utf-8 -*-
""" Changement du shell de l'utilisateur lancant le programme
""" Changement du shell de l'utilisateur lancant le programme
DOIT ETRE LANCE PAR SUDO
Copyright (C) Frédéric Pauget
Licence : GPLv2
"""
......@@ -31,7 +31,7 @@ adh = s['adherent']
if len(adh) != 1 :
print 'Erreur fatale lors de la consultation de la base LDAP'
sys.exit(3)
adh = adh[0]
shell = prompt(u'Nouveau shell :')
fd=open('/etc/shells')
......
......@@ -171,7 +171,7 @@ Si tu as des questions, contacte disconnect@crans.org
NB : L'upload consiste en l'envoi de données vers des machines n'étant
pas branchées sur le CRANS.
--
--
Disconnect team"""
message_hard = u"""From: %(from)s
......@@ -199,7 +199,7 @@ Si tu as des questions, contacte disconnect@crans.org
NB: L'upload consiste en l'envoi de données vers des machines n'étant
pas branchées sur le CRANS.
--
--
Disconnect team"""
......@@ -210,7 +210,7 @@ Content-Type: text/plain; charset="iso-8859-15"
%(proprio)s uploade actuellement %(upload)s Mo.
--
--
Message créé par deconnexion.py"""
message_disconnect_hard = u"""From: %(from)s
......@@ -220,7 +220,7 @@ Content-Type: text/plain; charset="iso-8859-15"
%(proprio)s a été déconnecté pour upload (%(upload)s Mo).
--
--
Message créé par deconnexion.py"""
message_disconnect_multi = u"""From: %(from)s
......@@ -234,23 +234,23 @@ L'adhérent %(proprio)s a été déconnecté %(nbdeco)d fois pour upload en un m
Le PS a été généré et se trouve sur zamok :
%(ps)s
--
Message créé par deconnexion.py"""
--
Message créé par deconnexion.py"""
message_demenagement = u"""From: %(from)s
To: %(to)s
Subject: =?iso-8859-1?Q?D=E9m=E9nagement=20non=20d=E9clar=E9?=
Subject: =?iso-8859-1?Q?D=E9m=E9nagement=20non=20d=E9clar=E9?=
Content-Type: text/plain; charset="iso-8859-15"
Bonjour,
Il semble que tu étais inscrit dans la chambre %(chambre), mais un
Il semble que tu étais inscrit dans la chambre %(chambre), mais un
autre adhérent s'y est inscrit, ce qui suppose que tu n'y es plus.
Pourrais tu nous préciser ta nouvelle chambre ou adresse stp ?
Si tu es parti du campus, souhaites-tu garder tes machines ?
--
--
Merci par avance,
Les membres actifs du Crans"""
......@@ -306,7 +306,7 @@ La machine %(hostname)s a été déconnectée pendant 24h pour
utilisation du protocole %(protocole)s.
Nombre de paquets : %(nb_paquets)s paquets depuis le %(datedebut)s.
--
--
Message créé par deconnexion.py"""
deconnexion = u"""From: %(From)s
To: %(To)s
......@@ -332,7 +332,7 @@ il pénalise l'ensemble des adhérents de l'association.
Tu seras donc déconnecté 24h.
--
--
Disconnect Team"""
message_disconnect_multi = u"""From: %(from)s
......@@ -345,7 +345,7 @@ L'adhérent %(proprio)s a été déconnecté %(nbdeco)d fois pour p2p en un an !
Le PS a été généré et se trouve sur zamok :
%(ps)s
--
--
Message créé par deconnexion.py"""
......@@ -449,7 +449,7 @@ Pour y avoir accés depuis l'extérieur il faut utiliser un mot de passe:
Sur ce, bienvenue au Cr@ns !
PS: Il t'est conseillé de conserver ce mail à toutes fin utiles
--
--
Les membres actifs."""
......@@ -469,7 +469,7 @@ de les utiliser est disponible sur la page :
Si tu as des questions, n'hésite pas à les poser
à d'autres câbleurs ou aux nounous.
--
--
Les nounous"""
pages_infos_droits = { "Cableur" : "https://wiki.crans.org/%C3%8AtreC%C3%A2bleur",
......@@ -496,7 +496,7 @@ https://wiki.crans.org/CransAdministratif?action=AttachFile&do=get&target=charte
Merci par avance,
--
--
Le bureau du CRANS"""
txt_menage_cableurs = u"""From: Crans <%(From)s>
......@@ -515,5 +515,5 @@ heureux de te les remettre.
Cordialement,
--
--
Le bureau du CRANS"""
......@@ -3,7 +3,7 @@
###############################################################################
# config_mail : gestion du .forward et .procmailrc des adhérents
###############################################################################
# The authors of this code are
# The authors of this code are
# Etienne Chové <etienne.chove@crans.org>
#
# Copyright (C) 2006 Etienne Chové
......@@ -95,14 +95,14 @@ class MailConfigError(ReferenceError):
def _IsMail(mail):
"""
Dit si la chaine fournie est une adresse mail valide
"""
"""
return bool(re.match('[a-z0-9_\.-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)+',mail.lower()))
def _Clean(texte):
"""
Nettoie une chaine de caractère/liste en supprimant les lignes vides/commentés,
et retourne une liste
"""
"""
if type(texte) != list:
texte = texte.split('\n')
return [ x.strip() for x in texte if x.strip() and x[0]!='#' ]
......@@ -123,31 +123,31 @@ def _GetConfig():
# forward simple
if _IsMail(fic_forward):
return {'forward':fic_forward, 'spam':'accepte'}
# utilisation de procmail
if fic_forward != _Clean(forward_procmail)[0]:
raise MailConfigError, 'Fichier forward non compréhensible'
## lecture du .procmailrc
fic_procmail = _Clean( open('%s/.procmailrc'%home).readlines() )
# forward
if _IsMail( fic_procmail[-1][1:].strip() ) and fic_procmail[-2] == ":0" :
forward = fic_procmail[-1][1:].strip()
fic_procmail = fic_procmail[:-2]
else:
forward = ''
# forward simple dans le procmailrc
if not fic_procmail:
return {'forward':forward, 'spam':'accepte'}
# marquage des spams
tmp = _Clean( procmail_mark )
if fic_procmail[:len(tmp)] != tmp:
raise MailConfigError, 'Fichier de procmail non compréhensible'
fic_procmail = fic_procmail[len(tmp):]
# suppression des spams ?
if not fic_procmail:
return {'forward':forward, 'spam':'marque'}
......@@ -158,7 +158,7 @@ def _GetConfig():
def _SetConfig(forward = None, spam= None):
""" Modifie la configuration de l'utilisateur courant """
# variable new_spam
if spam in ['accepte','supprime','marque']:
new_spam = spam
......@@ -166,7 +166,7 @@ def _SetConfig(forward = None, spam= None):
new_spam = _GetConfig()['spam']
else:
raise ValueError, 'Valeur interdite pour le paramètre spam'
# variable forward
if forward == None:
new_forward = _GetConfig()['forward']
......@@ -174,7 +174,7 @@ def _SetConfig(forward = None, spam= None):
new_forward = forward
else:
raise ValueError, 'Adresse mail invalide'
# génération des fichiers
if new_spam=='accepte':
# suppression du .procmailrc
......@@ -210,17 +210,17 @@ def _Sudo(uid, forward=None, spam=None):
c += " --forward=%s" % forward
if spam!=None:
c += " --spam=%s" % spam
# execution de la commande
status, output = getstatusoutput(c)
# code d'erreur
if status:
sys.stderr.write("Erreur sudo : %s\n"%c)
sys.stderr.write(output)
sys.stderr.flush()
sys.exit(status)
# valeurs de retour
res = {}
for line in output.split('\n'):
......@@ -230,37 +230,37 @@ def _Sudo(uid, forward=None, spam=None):
##
############################################################################
def MailConfig(uid=None, forward=None, spam=None):
""" Modifie ou retourne la configuration mail de l'utilisateur
user = utilisateur à configurer, si None configure l'utilisateur courant
forward = adresse vers laquelle rediriger les mails, chaine vide si pas de redirection
spam = action à effectuer sur les spams (accepte, supprime, marque)
Pour les champs forward et spam, la valeur None ne touche pas au champ.
Retourne un dictionnaire { 'forward':'', 'spam':'' }
"""
## demande pour un autre utilisateur
if uid:
return _Sudo(uid=uid, forward=forward, spam=spam)
## nettoyage des variables
cfg = _GetConfig()
if forward == cfg['forward']:
forward = None
if spam == cfg['spam']:
spam = None
## modifications
if forward!=None or spam!=None:
_SetConfig(forward=forward, spam=spam)
## on renvoie la configuration
return _GetConfig()
if __name__=="__main__":
## parsage des arguments
forward = None
......@@ -271,10 +271,10 @@ if __name__=="__main__":
forward = v
elif o == '--spam':
spam = v
## execution de MailConfig
res = MailConfig(forward=forward, spam=spam)
## affichage des résultats
for i in res.items():
print "%s=%s" % i
......
......@@ -20,10 +20,10 @@ def format_sender(sender, header_charset='ISO-8859-15'):
"""
from email.Header import Header
from email.Utils import parseaddr, formataddr
# Split real name (which is optional) and email address parts
sender_name, sender_addr = parseaddr(sender)
# We must always pass Unicode strings to Header, otherwise it will
# use RFC 2047 encoding even on plain ASCII strings.
sender_name = str(Header(unicode(sender_name), header_charset))
......@@ -71,14 +71,14 @@ def send_email(sender, recipient, subject, body, server='localhost', cc=None, de
sender = format_sender(sender)
recipient = format_sender(recipient)
if cc: cc = format_sender(cc)
# Create the message ('plain' stands for Content-Type: text/plain)
msg = MIMEText(body.encode(body_charset), 'plain', body_charset)
msg['From'] = sender
msg['To'] = recipient
msg['Subject'] = Header(unicode(subject), header_charset)
if cc: msg['Cc'] = cc
if debug:
actual_recipient = [debug]
else:
......@@ -89,7 +89,7 @@ def send_email(sender, recipient, subject, body, server='localhost', cc=None, de
actual_sender = format_sender(actual_sender)
else:
actual_sender = sender
# Send the message
if isinstance(server, SMTP):
server.sendmail(actual_sender, actual_recipient, msg.as_string())
......@@ -113,23 +113,23 @@ def parse_mail_template(fichier):
"""
if not isinstance(fichier, file):
fichier = file(fichier)
encoding = fichier.readline()
matched = re.search(r'^Encoding:\s*([^\r\n]*)', encoding)
if matched:
encoding = matched.group(1)
else:
raise SyntaxError("Encoding manquant dans template")
subject = fichier.readline()
matched = re.search(r'^Subject:\s*([^\r\n]*)', subject)
if matched:
subject = matched.group(1).decode(encoding)
else:
raise SyntaxError("Subject manquant dans template")
if fichier.readline() not in ['\r\n', '\n']:
raise SyntaxError("le fichier n'a pas le bon format")
body = fichier.read().decode(encoding)
return subject, body
This diff is collapsed.
......@@ -14,7 +14,7 @@ from config import NETs_regexp
__QuadToDecDone = {}
def QuadToDec(ip) :
"""
"""
Retourne la représentation décimale d'une ip
ip est de la forme xxx.xxx.xxx.xxx
"""
......@@ -33,9 +33,9 @@ def QuadToDec(ip) :
# Pour accélérer DecToQuad
__DecToQuadDone = {}
def DecToQuad(ip_dec) :
"""
"""
Retourne la représentation habituelle d'une ip (xxx.xxx.xxx.xxx)
ip_dec est l'IP en base 10
"""
......@@ -62,7 +62,7 @@ def param(net, raw=False) :
'netmask' : yyy.yyy.yyy.yyy ,
'broadcast' : zzz.zzz.zzz.zzz }
sinon retourne {}
Si raw = False, alors, on ne convertit pas les résultats sous forme pointée.
Ils restent sous forme d'un entier.
"""
......@@ -70,18 +70,18 @@ def param(net, raw=False) :
return __paramDone[net]
reseau = {}
ip, mask = net.split('/')
try :
mask = int(mask)
dec_ip = QuadToDec(ip)
if dec_ip == -1 : raise
except :
return {}
# Calcul du netmask
non_dec_netmask = netmask(mask, dec=False)
dec_netmask = netmask(mask)
reseau = { 'netmask' : dec_netmask,
'network' : dec_ip & dec_netmask,
'broadcast' : dec_ip | non_dec_netmask }
......@@ -91,7 +91,7 @@ def param(net, raw=False) :
else:
__paramDone[net] = reseau
return reseau
def AddrInNet(ip,net) :
"""
ip est de la forme xxx.xxx.xxx.xxx
......@@ -101,7 +101,7 @@ def AddrInNet(ip,net) :
Note : retourne False si l'IP est une adresse de réseau ou broadcast
"""
if type(net)==str : net = [ net ]
r = False
ip = QuadToDec(ip)
for ne in net :
......@@ -109,11 +109,11 @@ def AddrInNet(ip,net) :
if ip == n['broadcast'] or ip == n['network'] :
return False
r = r or n['netmask'] & ip == n['network']
return r
def AddrInNets(ip,nets) :
""" Vérifie si l'ip est au moins dans un des réseaux
""" Vérifie si l'ip est au moins dans un des réseaux
de la liste nets (voir AddrInNet) """
for net in nets :
if AddrInNet(ip,net) :
......
......@@ -3,7 +3,7 @@
# ldap_passwd.py : manipulation des mots de passes LDAP
# $Id: ldap_passwd.py,v 1.7 2006-05-04 17:46:58 chove Exp $
###############################################################################
# The authors of this code are
# The authors of this code are
# Bjorn Ove Grotan <bgrotan@grotan.com>
# Etienne Chové <etienne.chove@crans.org>
#
......@@ -27,19 +27,19 @@
###############################################################################
# For extra strength passwords, we wanted SSHA in our LDAP-environment
# as the standard python-module 'sha' does not support ssha, but this can
# easily be implemented with a few extra functions.
# as the standard python-module 'sha' does not support ssha, but this can
# easily be implemented with a few extra functions.
#
# SSHA can be described as:
# the SHA1-digest of a password with a sequence of "salt" bytes, where
# the bytes are randomly chosen - followed by the same salt bytes
# For LDAP-use, the SHA1 and SSHA-digest has to be base64-encoded.
# For LDAP-use, the SHA1 and SSHA-digest has to be base64-encoded.
#
# Example-LDIF:
# {SSHA}oaEG3PJ10sHxGcSxsDRRooTifL55/2NOdN3nU1VEV+NFzc9Q
#
#
# This package should now support passwords compatible with [1] Samba using the [2]
# smbpasswd module for [3] Python. The samba compability is added for use with Samba
# smbpasswd module for [3] Python. The samba compability is added for use with Samba
# as PDC with storing user and host-information in LDAP.
#
# [1] http://www.samba.org
......@@ -70,7 +70,7 @@ if smb:
algos['lmpassword'] = 'lan man hash'
algos['ntpassword'] = 'nt hash'
def getsalt(chars=string.letters+string.digits, length=16):
''' Generate a random salt. Default length is 16 '''
salt = ''
......@@ -79,18 +79,18 @@ def getsalt(chars=string.letters+string.digits, length=16):
return salt