[scripts] Going to utf-8

This commit is contained in:
Pierre-Elliott Bécue 2013-05-04 19:19:36 +02:00
parent c4a19a88ed
commit a1bf0a4547
54 changed files with 676 additions and 573 deletions

View file

@ -1,9 +1,9 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
"""DESCRIPTION
Ce script repère les comptes inactifs en parsant les logs de dernière
connexion de sshd et dovecot, et en lisant et mettant à jour les champs
Ce script repère les comptes inactifs en parsant les logs de dernière
connexion de sshd et dovecot, et en lisant et mettant à jour les champs
derniereConnexion dans la base LDAP.
UTILISATION
@ -12,7 +12,7 @@ UTILISATION
ACTIONS POSSIBLES
%(acts)s"""
# Copyright (C) 2006 Stéphane Glondu
# Copyright (C) 2006 Stéphane Glondu
# Licence : GPLv2
@ -41,8 +41,8 @@ openlog('comptes_inactifs')
def nb_mails_non_lus(login):
"""
Renvoie le nombre de mails non lus de login, ou None si impossible à
déterminer.
Renvoie le nombre de mails non lus de login, ou None si impossible à
déterminer.
"""
try:
maildir = '/var/mail/%s/new' % login
@ -56,8 +56,8 @@ def nb_mails_non_lus(login):
class ComptesInactifs(object):
# liste d'expressions régulières qui seront testées sur les lignes de log
# le premier groupe doit correspondre à la date, le second au login
# liste d'expressions régulières qui seront testées sur les lignes de log
# le premier groupe doit correspondre à la date, le second au login
re = [re.compile(r'^(\w+\s+\d+\s+\d+:\d+:\d+).*(?:'
r'dovecot.*Login: user=<|'
r'sshd.*Accepted.*for '
@ -70,7 +70,7 @@ class ComptesInactifs(object):
self.dic = {}
def search(self, query, mode=''):
""" CransLdap.search allégé """
""" CransLdap.search allégé """
query = '(&(objectClass=cransAccount)(objectClass=adherent)(%s))' % query
result = db.conn.search_s(db.base_dn, db.scope['adherent'], query)
result = [db.make(x, mode) for x in result]
@ -79,13 +79,13 @@ class ComptesInactifs(object):
def commit_to_ldap(self):
"""
Sauvegarde du dico dans la base LDAP.
Renvoie le nombre d'entrées mises à jour.
Renvoie le nombre d'entrées mises à jour.
"""
total = 0
for (login, timestamp) in self.dic.items():
a = self.search('uid=%s' % login, 'w')
if not a:
# Probablement un adhérent récemment parti
# Probablement un adhérent récemment parti
continue
a = a[0]
if a._modifiable == 'w':
@ -93,7 +93,7 @@ class ComptesInactifs(object):
if a.modifs: total += 1
a.save()
else:
# on loggue on espérant que les logs seront réinjectés
# on loggue on espérant que les logs seront réinjectés
# plus tard
syslog("LDAP(lock): derniereConnexion=<%s>, login=<%s>" %
(strftime("%b %d %H:%M:%S", localtime(timestamp)), login))
@ -101,7 +101,7 @@ class ComptesInactifs(object):
def update(self, login, timestamp):
"""
Met à jour l'entrée correspondant au login donné.
Met à jour l'entrée correspondant au login donné.
"""
dic = self.dic
timestamp = int(timestamp)
@ -110,8 +110,8 @@ class ComptesInactifs(object):
def update_from_syslog(self, loglines):
"""
Met à jour le dico avec les lignes de syslog données.
Renvoie le nombre de lignes traitées.
Met à jour le dico avec les lignes de syslog données.
Renvoie le nombre de lignes traitées.
"""
annee = localtime(time())[0]
now = time() + 600
@ -124,8 +124,8 @@ class ComptesInactifs(object):
date = list(strptime(m.group(1), "%b %d %H:%M:%S"))
date[0] = annee
t = mktime(date)
# les lignes de syslog n'indiquent pas l'année
# on suppose qu'une date dans le futur est en fait l'année dernière
# les lignes de syslog n'indiquent pas l'année
# on suppose qu'une date dans le futur est en fait l'année dernière
if t > now:
date[0] = annee - 1
t = mktime(date)
@ -135,21 +135,21 @@ class ComptesInactifs(object):
def do_log(self):
"""
Lit des lignes de log sur l'entrée std et met à jour la base LDAP.
Lit des lignes de log sur l'entrée std et met à jour la base LDAP.
"""
parsed_lines = self.update_from_syslog(sys.stdin)
updated_entries = self.commit_to_ldap()
syslog("%(parsed_lines)s ligne(s) traitée(s)" % locals())
syslog("%(updated_entries)s entrée(s) mise(s) à jour dans la base LDAP" % locals())
syslog("%(parsed_lines)s ligne(s) traitée(s)" % locals())
syslog("%(updated_entries)s entrée(s) mise(s) à jour dans la base LDAP" % locals())
if parsed_lines == 0 or updated_entries == 0:
sys.stderr.write("""Erreur lors de la mise à jour de la base LDAP :
%(parsed_lines)s ligne(s) traitée(s)
%(updated_entries)s entrée(s) mise(s) à jour dans la base LDAP
sys.stderr.write("""Erreur lors de la mise à jour de la base LDAP :
%(parsed_lines)s ligne(s) traitée(s)
%(updated_entries)s entrée(s) mise(s) à jour dans la base LDAP
""" % locals())
def do_dump(self):
"""
Affiche la liste des dernières connexions, triées par date.
Affiche la liste des dernières connexions, triées par date.
"""
liste = self.search('derniereConnexion=*')
liste = [(x.derniereConnexion(), x.compte()) for x in liste]
@ -157,15 +157,15 @@ class ComptesInactifs(object):
liste = [(x[1], strftime('%d/%m/%Y %H:%M', localtime(x[0])))
for x in liste]
cprint(tableau(liste,
titre = (u'Login', u'Dernière connexion'),
titre = (u'Login', u'Dernière connexion'),
largeur = (20, 20)))
cprint(u"Total : %d" % len(liste))
def get_idle_accounts(self, since=32*24*3600):
"""
Renvoie la liste des objets Adherent de ceux qui ne se sont pas
connectés depuis since secondes, par défaut un mois (32 jours,
pour être sûr).
connectés depuis since secondes, par défaut un mois (32 jours,
pour être sûr).
"""
limit = int(time()) - since
liste = self.search("derniereConnexion<=%d" % limit)
@ -176,20 +176,20 @@ class ComptesInactifs(object):
def do_summary(self):
"""
Envoie à disconnect un résume des comptes inactifs depuis plus d'un
Envoie à disconnect un résume des comptes inactifs depuis plus d'un
mois.
"""
modele = u"""*Membres inscrits ne s'étant pas connectés depuis plus d'un mois*
modele = u"""*Membres inscrits ne s'étant pas connectés depuis plus d'un mois*
%(inscrits)s
Total : %(inscrits_total)d
*Anciens membres ne s'étant pas connectés depuis plus d'un mois*
*Anciens membres ne s'étant pas connectés depuis plus d'un mois*
%(anciens)s
Total : %(anciens_total)d
Légende :
Légende :
- F : existence d'un .forward
- M : existence de mails non lus
@ -219,7 +219,7 @@ comptes_inactifs.py
else:
anciens.append(ligne)
titres = (u'aid', u'Login', u'Nom', u'Dernière connexion', u'F', u'M')
titres = (u'aid', u'Login', u'Nom', u'Dernière connexion', u'F', u'M')
largeurs = (6, 15, 20, 20, 1, 1)
alignements = ('d', 'g', 'c', 'c', 'c', 'c')
@ -237,9 +237,9 @@ comptes_inactifs.py
def do_spam(self):
"""
Envoie un mail explicatif aux possesseurs de compte inactif
(doit être exécuté en tant que root).
(doit être exécuté en tant que root).
"""
# Nombre de personnes concernées, en expansant de droite à gauche :
# Nombre de personnes concernées, en expansant de droite à gauche :
# inscrit/ancien, avec/sans procmail, avec/sans mail non lu
# Voir aussi template_path
stats = [0, 0, 0, 0, 0, 0, 0, 0]
@ -262,7 +262,7 @@ comptes_inactifs.py
if not os.path.isfile('/home/%s/.forward' % login): i += 2
# a-il-des mails non lus ?
if not mail: i += 1
# on incrémente
# on incrémente
stats[i] += 1
if i == 1:
# on laisse tranquilles les membres inscrits sans mails non
@ -303,7 +303,7 @@ comptes_inactifs.py
""" % total
send_email(mail_sender,
mail_report,
u"Récapitulatif des comptes inactifs",
u"Récapitulatif des comptes inactifs",
recapitulatif,
server = smtp,
debug = debug)