scripts/surveillance/mac_prises/mac_prise_reperage.py
Pierre-Elliott Bécue 777ba5cd9c [Mac_prise] Modification du wrapper, logging + mail dans analyzer, et mise en place de reperage
* Le wrapper n'envoie plus de mails
    * Analyzer envoie ses mails lui-même, avec en pièce jointe le contenu du logging.
    * Analyzer n'envoit rien si les tableaux sont vide, sauf si hargneux, et sur une demi heure
    * Création de mac_prise_reperage, dont le but est de lister les macs inconnues d'une chambre sur une plage de 24h (script exécuté par cron toutes les heures), et de compter le nombre de minutes pendant lesquelles elles ont été présentes. Si la somme des compteurs pour une chambre dépasse une quantité dans config, on envoie un mail. Pas de logging ici, tout est "limpide". Il faudra bien définir la variable de config sus-citée.
    * Modification de config, on rajoute les deux variables pour mac_prise_reperage.py
2013-02-02 02:02:02 +01:00

125 lines
3.8 KiB
Python
Executable file

#!/usr/bin/env python
# -*- coding: utf8 -*-
import psycopg2
import psycopg2.extras
import sys
import smtplib
sys.path.append('/usr/scripts/gestion')
from config import mac_prise
from affich_tools import tableau
sys.path.append('/usr/scripts/lc_ldap')
import lc_ldap
ldap = lc_ldap.lc_ldap_admin()
membres_actifs = ldap.search('(|(droits=Cableur)(droits=Nounou)(droits=Apprenti)(droits=Bureau))')
chambres_ma = []
for membre_actif in membres_actifs:
try:
chambres_ma.append(str(membre_actif['chbre'][0]).lower())
except:
pass
clubs = ldap.search('cid=*')
chambres_clubs = []
for club in clubs:
try:
chambres_clubs.append(str(club['chbre'][0]).lower())
except:
pass
conn = psycopg2.connect(user='crans', database='mac_prises')
cur = conn.cursor(cursor_factory = psycopg2.extras.DictCursor)
def reperage_mac_inconnue():
"""
Fonction de repérage d'une mac qui ne devrait pas être
dans telle chambre, sur une plage de 24h, suivant un
paramètre de config pour le nombre d'occurrences.
Sans doute le truc le plus important, sera en tête du mail
"""
output = u""
probleme = {}
requete = "SELECT date, chambre, mac FROM correspondance WHERE date >= timestamp 'now' - interval '24 hours' ORDER BY chambre ASC;"
cur.execute(requete)
fetched = cur.fetchall()
liste_parsee = {}
for entry in fetched:
if liste_parsee.has_key(entry['chambre']):
if liste_parsee[entry['chambre']].has_key(entry['mac']):
liste_parsee[entry['chambre']][entry['mac']] += 1
else:
liste_parsee[entry['chambre']][entry['mac']] = 1
else:
liste_parsee[entry['chambre']] = {}
liste_parsee[entry['chambre']][entry['mac']] = 1
for chambre in liste_parsee.keys():
if chambre in chambres_ma + chambres_clubs:
continue
for mac in liste_parsee[chambre].keys():
try:
proprio_associe = ldap.search('macAddress=%s' % mac)[0].proprio()
if str(proprio_associe['chbre'][0]).lower() == chambre.lower():
garbage = liste_parsee[chambre].pop(mac)
except:
pass
number = sum(liste_parsee[chambre].values())
if number >= mac_prise.max_inconnues_par_jour:
probleme[chambre] = (liste_parsee[chambre].keys(), number)
if len(probleme) > 0:
output += mac_prise.titre_mac_inconnue+"\n"
longueur_max = max([len(", ".join(a[0])) for a in probleme.values()] + [len("macs")]) + 2
largeurs = (len('chambre') + 2, longueur_max, len('compteur') + 2, len('seuil') + 2)
data = []
clefs = probleme.keys()
clefs.sort()
for clef in clefs:
data.append([clef, ", ".join(probleme[clef][0]), probleme[clef][1], mac_prise.max_inconnues_par_jour])
output += tableau(data, ('chambre', 'macs', 'compteur', 'seuil'), largeurs, ('c', 'c', 'c', 'c'))
output += u"\n\n\n"
return output
if __name__ == '__main__':
output = u'Repérage de spoof potentiel par comptage'
coupure = len(output)
output += reperage_mac_inconnue()
if len(output) == coupure and not mac_prise.hargneux:
sys.exit(0)
message = """From: %(from)s
To: %(to)s
Subject: %(subject)s
Content-Type: text/plain, charset="UTF-8"
%(contenu)s
--
Script d'analyse mac_prise (en test)
"""
corps = message % { 'from': 'Spoofing watcher <spoof-watcher@crans.org>',
'to': 'test@lists.crans.org',
'subject': 'Analyse horaire du spoofing',
'contenu': output,
}
mail = smtplib.SMTP('localhost')
mailfrom = 'spoof-watcher@crans.org'
mailto = 'test@lists.crans.org'
mail.sendmail(mailfrom, mailto, corps.encode('utf-8'))