[scripts] Going to utf-8
This commit is contained in:
parent
c4a19a88ed
commit
a1bf0a4547
54 changed files with 676 additions and 573 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue