Ací et deixe el codi d'un script Python que hem afegit al gestor de ticketing Mantis Bug Tracker perquè, quan els usuaris s'equivoquen el Mantis, el seu compte queda bloquejat.
La idea és fer l'script desbloquejar_mantis.py i que s'execute cada 5 minuts. Per a fer-ho, l'he afegit al Crontab de la següent manera:
## Cada 5 minuts executem l'script que desbloqueja els usuaris de Mantis
*/5 * * * * /usr/bin/python /var/www/asistencias-25/desbloquejar_mantis.py >> /var/log/desbloquejar_mantis-cron.log 2>&1
I ací el codi de l'script:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Desbloqueig automatic d'usuaris de MantisBT 2.25.4
Compatible amb Python 2.7
"""
from __future__ import print_function
import sys
import logging
import MySQLdb
# Configuracio de la base de dades
DB_CONFIG = {
"host": "localhost",
"user": "admindb",
"passwd": "lacasitos",
"db": "mantisbt_2_25_db",
"charset": "utf8"
}
# Maxim d'intents fallits
MAX_INTENTS = 2
# Fitxer de registre
LOG_FILE = "/var/log/desbloquejar_mantis.log"
logging.basicConfig(
filename=LOG_FILE,
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
def main():
conn = None
cursor = None
try:
conn = MySQLdb.connect(**DB_CONFIG)
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
# Buscar usuaris bloquejats
cursor.execute("""
SELECT id, username, failed_login_count
FROM mantis_user_table
WHERE enabled = 1
AND failed_login_count >= %s
ORDER BY username
""", (MAX_INTENTS,))
usuaris = cursor.fetchall()
if not usuaris:
print("No hi ha usuaris bloquejats.")
return 0
print("Usuaris bloquejats: {}".format(len(usuaris)))
for usuari in usuaris:
print(
"Desbloquejant: {} (intents: {})".format(
usuari["username"],
usuari["failed_login_count"]
)
)
# Reiniciar comptadors
cursor.execute("""
UPDATE mantis_user_table
SET failed_login_count = 0
WHERE enabled = 1
AND failed_login_count >= %s
""", (MAX_INTENTS,))
modificats = cursor.rowcount
conn.commit()
for usuari in usuaris:
logging.info(
"Desbloquejat: %s (ID=%s, intents=%s)",
usuari["username"],
usuari["id"],
usuari["failed_login_count"]
)
print("Total usuaris desbloquejats: {}".format(modificats))
logging.info(
"Execucio completada. Total desbloquejats: %s",
modificats
)
return 0
except MySQLdb.Error as error:
if conn:
conn.rollback()
print("ERROR de base de dades: {}".format(error))
logging.error("Error de base de dades: %s", error)
return 1
except Exception as error:
if conn:
conn.rollback()
print("ERROR: {}".format(error))
logging.exception("Error inesperat")
return 1
finally:
if cursor:
cursor.close()
if conn:
conn.close()
if __name__ == "__main__":
sys.exit(main())





