diff --git a/surveillance/deconnexion.py b/surveillance/deconnexion.py index bc932fac..55fab1ae 100644 --- a/surveillance/deconnexion.py +++ b/surveillance/deconnexion.py @@ -2,13 +2,13 @@ # -*- coding: iso-8859-15 -*- """ -Script de déconnection automatique des machines du crans pour les raisons : +Script de déconnection automatique des machines du crans pour les raisons : - upload - p2p - flood - virus -Copyright (C) Xavier Pessoles, Étienne Chové, Vincent Bernat, Nicolas Salles +Copyright (C) Xavier Pessoles, Étienne Chové, Vincent Bernat, Nicolas Salles Licence : GPL v2 """ @@ -25,8 +25,8 @@ import smtplib from ldap_crans import crans_ldap from ldap_crans import MachineWifi from time import * -import locale -locale.setlocale(locale.LC_TIME, 'fr_FR') +#import locale +#locale.setlocale(locale.LC_TIME, 'fr_FR') import lock sys.path.append('/usr/scripts/surveillance/fiche_deconnexion') from generate import generate_ps @@ -39,7 +39,7 @@ ldap = crans_ldap() def machine_online(machine): """ - Retourne True si la machine est connectée au réseau et False si elle ne l'est pas + Retourne True si la machine est connectée au réseau et False si elle ne l'est pas """ # Les machines wifi sont toujours online if isinstance(machine, MachineWifi): @@ -50,14 +50,14 @@ def machine_online(machine): # Variables utiles ################## -# Création d'une chaine qui ressemble à : +# Création d'une chaine qui ressemble à : # (ip_src<<=inet('138.231.136.0/21') or ip_src<<=inet('138.231.148.0/22')) ip_src_in_crans = '(%s)' % ' or '.join([ "ip_src<<=inet('%s')" % net for net in NETs['all'] ]) # Connections : ############### -# Connection à la base sql via pgsql +# Connection à la base sql via pgsql pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans') pgsql.autocommit = True curseur = pgsql.cursor() @@ -73,10 +73,10 @@ for i in range(5): sys.exit(1) ################################################################################ -# Vérification de l'upload # +# Vérification de l'upload # ################################################################################ -# upload par entité (adhérent/club/machine crans) +# upload par entité (adhérent/club/machine crans) requete = """SELECT sum(total), type, id FROM @@ -85,7 +85,7 @@ FROM sum(total) AS total, ip_crans FROM ( - ( -- upload terminé par ip + ( -- upload terminé par ip SELECT 'upload',round(sum(upload)/1024/1024) AS total, ip_crans FROM @@ -157,17 +157,17 @@ requete = "SELECT type,id FROM avertis_upload_soft where date>timestamp 'now' - curseur.execute(requete) avertis_upload_soft = curseur.fetchall() -# Vérification : +# Vérification : ################ for elupload, eltype, elid in uploadeurs: if elupload >= upload.hard: - # L'adhérent a t il été blacklisté ? + # L'adhérent a t il été blacklisté ? #################################### if [eltype, elid] in avertis_upload_hard: continue - # Propriétaire issu de LDAP + # Propriétaire issu de LDAP ########################### if eltype == 'club': proprio = ldap.search('cid=%d'%elid, 'w')['club'] @@ -177,7 +177,7 @@ for elupload, eltype, elid in uploadeurs: continue if len(proprio) != 1: - print 'Erreur : Proprio non trouvé (%s) %d'%(eltype, elid) + print 'Erreur : Proprio non trouvé (%s) %d'%(eltype, elid) continue proprio = proprio[0] @@ -189,37 +189,37 @@ for elupload, eltype, elid in uploadeurs: ############### debut = int(time()) fin = debut + 24*3600 - proprio.blacklist([debut, fin, 'autodisc_upload', "Déconn auto. %s Mo" % elupload]) + proprio.blacklist([debut, fin, 'autodisc_upload', "Déconn auto. %s Mo" % elupload]) proprio.save() - # On envoie un mail à l'adhérent + # On envoie un mail à l'adhérent ################################ corps = upload.message_hard % {'from': upload.expediteur, 'to': proprio.email(), 'upload': elupload, 'proprio': proprio.Nom()} corps = corps.encode('utf-8') mail.sendmail(upload.expediteur, proprio.email(), corps) - # On envoie un mail à disconnect + # On envoie un mail à disconnect ################################ if upload.disconnect_mail_hard: corps = upload.message_disconnect_hard % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom()} corps = corps.encode('utf-8') mail.sendmail(upload.expediteur, upload.expediteur, corps) - # Vérification du nombre de déconnexions + # Vérification du nombre de déconnexions ######################################### nb_decos = len([ x for x in proprio.blacklist() if int(x.split('$')[0]) > time()-30*24*3600 and x.split('$')[2] == 'autodisc_upload' ]) if nb_decos >= 3: - # Génération du fichier postscript + # Génération du fichier postscript fichier_ps = generate_ps('upload', proprio, ldap) - # Envoi du mail à disconnect + # Envoi du mail à disconnect corps = upload.message_disconnect_multi % {'from': upload.expediteur, 'to': upload.expediteur, 'nbdeco': nb_decos, 'proprio': proprio.Nom(), 'ps': fichier_ps} corps = corps.encode('utf-8') mail.sendmail(upload.expediteur, upload.expediteur, corps) elif elupload >= upload.soft: - # L'adhérent a t il été averti + # L'adhérent a t il été averti ############################## if [eltype, elid] in avertis_upload_soft: continue @@ -234,7 +234,7 @@ for elupload, eltype, elid in uploadeurs: continue if len(proprio) != 1: - print 'Proprio non trouvé (%s) %d'%(eltype, elid) + print 'Proprio non trouvé (%s) %d'%(eltype, elid) continue proprio = proprio[0] @@ -242,13 +242,13 @@ for elupload, eltype, elid in uploadeurs: ################################################ curseur.execute("INSERT INTO avertis_upload_soft (type,id,date) VALUES ('%s','%d','now')"%(eltype, elid)) - # On envoie un mail à l'adhérent + # On envoie un mail à l'adhérent ################################ corps = upload.message_soft % {'from': upload.expediteur, 'to': proprio.email(), 'upload': elupload, 'proprio': proprio.Nom()} corps = corps.encode('utf-8') mail.sendmail(upload.expediteur, proprio.email(), corps) - # On envoie un mail à disconnect + # On envoie un mail à disconnect ################################ if upload.disconnect_mail_soft: corps = upload.message_disconnect_soft % {'from': upload.expediteur, 'to': upload.expediteur, 'upload': elupload, 'proprio': proprio.Nom()} @@ -260,15 +260,15 @@ curseur.execute("DELETE FROM avertis_upload_hard WHERE date < timestamp 'now' - curseur.execute("DELETE FROM avertis_upload_soft WHERE date < timestamp 'now' - interval '1 day'") ################################################################################ -# Détection de l'existence de virus # +# Détection de l'existence de virus # ################################################################################ -# Dans la table virus on sélectionne les ip_src qui appartiennent au réseau +# Dans la table virus on sélectionne les ip_src qui appartiennent au réseau requete = "SELECT ip_src,count(ip_src) FROM virus WHERE %s and date > timestamp 'now' - interval '1 hour' group by ip_src" % ip_src_in_crans curseur.execute(requete) infectes = curseur.fetchall() -# Récupération des infectés pour ne pas les reblacklister +# Récupération des infectés pour ne pas les reblacklister requete = "SELECT ip_crans FROM avertis_virus" curseur.execute(requete) infectes_old = curseur.fetchall() @@ -279,7 +279,7 @@ for ip, nombre in infectes: if nombre < virus.virus: continue - # Si on est déja avertis, on laisse passer + # Si on est déja avertis, on laisse passer if [ip] in infectes_old: continue @@ -289,38 +289,38 @@ for ip, nombre in infectes: proprio = machine.proprietaire() blacklist = proprio.blacklist() - # Inscription dans la table des infectés + # Inscription dans la table des infectés requete = "INSERT INTO avertis_virus (ip_crans,date) VALUES ('%s','now')" % ip curseur.execute(requete) - # On récupère les index des lignes de bl où il y a marqué virus + # On récupère les index des lignes de bl où il y a marqué virus index = [blacklist.index(x) for x in blacklist if 'virus' in x ] if index: - # L'adhérent est déjà blacklisté + # L'adhérent est déjà blacklisté proprio.blacklist((index[0], ['now', '-', 'virus', hostname])) proprio.save() else: - # L'adhérent n'est pas encore blacklisté + # L'adhérent n'est pas encore blacklisté proprio.blacklist(['now', '-', 'virus', hostname]) proprio.save() ################################################################################ -# Détection des virus qui floodent # +# Détection des virus qui floodent # ################################################################################ -# Dans la table virus on sélectionne les ip_src qui appartiennent au réseau +# Dans la table virus on sélectionne les ip_src qui appartiennent au réseau requete = "SELECT ip_src,count(ip_src) FROM flood WHERE %s and date > timestamp 'now' - interval '1 hour' GROUP BY ip_src" % ip_src_in_crans curseur.execute(requete) infectes = curseur.fetchall() -# Récupération des infectés pour ne pas les reblacklister +# Récupération des infectés pour ne pas les reblacklister requete = "SELECT ip_crans FROM avertis_virus" curseur.execute(requete) infectes_old = curseur.fetchall() for ip, nombre in infectes: - # Si on est en dessous du seuil, ou qu'on est déjà averti, on laisse passer + # Si on est en dessous du seuil, ou qu'on est déjà averti, on laisse passer if nombre < virus.flood or [ip] in infectes_old: continue @@ -328,25 +328,25 @@ for ip, nombre in infectes: try : machine = ldap.search('ipHostNumber=%s' % ip, 'w' )['machine'][0] except IndexError : - # Dans le cas où l'ip détectée n'est pas enregistrée + # Dans le cas où l'ip détectée n'est pas enregistrée print u"La machine avec l'ip %s n'est pas declaree !" % ip continue hostname = machine.nom() proprio = machine.proprietaire() blacklist = proprio.blacklist() - # Inscription dans la table des infectés + # Inscription dans la table des infectés requete = "INSERT INTO avertis_virus (ip_crans,date) VALUES ('%s','now')" % ip curseur.execute(requete) - # On récupère les index des lignes de bl où il y a marqué virus + # On récupère les index des lignes de bl où il y a marqué virus index = [ blacklist.index(x) for x in blacklist if 'virus' in x ] if index: - # L'adhérent est déjà blacklisté + # L'adhérent est déjà blacklisté proprio.blacklist((index[0], ['now', '-', 'virus', hostname])) proprio.save() else: - # L'adhérent n'est pas encore blacklisté + # L'adhérent n'est pas encore blacklisté proprio.blacklist(['now', '-', 'virus', hostname]) proprio.save() @@ -354,19 +354,19 @@ for ip, nombre in infectes: # Reconnexion si le virus/flood a disparu ######################################### -# Dans la table avertis_virus on récupère la liste des infectés +# Dans la table avertis_virus on récupère la liste des infectés requete = "SELECT ip_crans FROM avertis_virus where date < timestamp 'now' - interval '1 hour'" curseur.execute(requete) infectes = [ x[0] for x in curseur.fetchall() ] for IP in infectes: - # Nombre de requêtes de virus + # Nombre de requêtes de virus requete1 = "SELECT COUNT(ip_src) FROM virus where ip_src='%s' and date > timestamp 'now' - interval '1 hour'" % IP curseur.execute(requete1) nb_virus = curseur.fetchall() - # Nombre de requêtes de flood + # Nombre de requêtes de flood requete2 = "SELECT COUNT(ip_src) FROM flood where ip_src='%s' and date > timestamp 'now' - interval '1 hour'" % IP curseur.execute(requete2) nb_flood = curseur.fetchall() @@ -379,7 +379,7 @@ for IP in infectes: print "Suppression de %s des machines infectees (la machine n'existe plus)"%IP requete = "DELETE FROM avertis_virus where ip_crans='%s'"%IP curseur.execute(requete) - continue # la machine n'existe plus, on passe à l'infecté suivant + continue # la machine n'existe plus, on passe à l'infecté suivant # Si la machine n'est pas online, on reconnecte #if machine_online(machine): proprio = machine.proprietaire() @@ -406,19 +406,19 @@ for IP in infectes: # Gestion du peer to peer # ################################################################################ -# Dans la table p2p on sélectionne les ip_src qui appartiennent au réseau +# Dans la table p2p on sélectionne les ip_src qui appartiennent au réseau requete = "SELECT ip_src,id_p2p,count(ip_src) FROM p2p WHERE %s AND date > timestamp 'now' - interval '2 hours' GROUP BY ip_src,id_p2p ORDER BY ip_src" % ip_src_in_crans curseur.execute(requete) fraudeurs = curseur.fetchall() -# Récupération des fraudeurs pour ne pas les resanctionner +# Récupération des fraudeurs pour ne pas les resanctionner requete = "SELECT ip_crans,protocole FROM avertis_p2p WHERE date > timestamp 'now' - interval '2 hours'" curseur.execute(requete) avertisp2p = curseur.fetchall() for ip, id_p2p, nombre in fraudeurs: - # On récupére le protocole de p2p : + # On récupére le protocole de p2p : requete = "SELECT nom FROM protocole_p2p WHERE id_p2p=%d" % id_p2p curseur.execute(requete) protocole = curseur.fetchall()[0][0] @@ -430,7 +430,7 @@ for ip, id_p2p, nombre in fraudeurs: if id_p2p == 1: continue - # Récupération des ref de la machine + # Récupération des ref de la machine machines = ldap.search('ipHostNumber=%s' % ip, 'w' )['machine'] if len(machines) == 0: # La machine a ete supprimee entre temps @@ -440,7 +440,7 @@ for ip, id_p2p, nombre in fraudeurs: proprio = machine.proprietaire() blacklist = proprio.blacklist() - # Envoi du mail à disconnect + # Envoi du mail à disconnect if p2p.disconnect_mail: requete = "select date from p2p where date > timestamp 'now' - interval '2 hours' and ip_src='%s' order by date limit 1"%ip curseur.execute(requete) @@ -458,7 +458,7 @@ for ip, id_p2p, nombre in fraudeurs: requete = "INSERT INTO avertis_p2p (ip_crans,date,protocole) VALUES ('%s','now','%s')" % (ip, protocole) curseur.execute(requete) - # On envoie un mail a l'adhérent + # On envoie un mail a l'adhérent ################################ corps = p2p.deconnexion % { 'From': p2p.expediteur, 'To': proprio.email(), @@ -467,13 +467,13 @@ for ip, id_p2p, nombre in fraudeurs: corps = corps.encode('utf-8') mail.sendmail(p2p.expediteur, proprio.email(), corps) - # Vérification du nombre de déconnexions + # Vérification du nombre de déconnexions ######################################### nb_decos = len([ x for x in proprio.blacklist() if int(x.split('$')[0]) > time()-365*24*3600 and x.split('$')[2] == 'autodisc_p2p' ]) if nb_decos >= 3: fichier_ps = generate_ps('p2p', proprio, ldap) - # Envoi du mail à disconnect + # Envoi du mail à disconnect corps = p2p.message_disconnect_multi % { 'from': p2p.expediteur, 'to': p2p.expediteur, 'nbdeco': nb_decos, @@ -482,7 +482,7 @@ for ip, id_p2p, nombre in fraudeurs: corps = corps.encode('utf-8') mail.sendmail(p2p.expediteur, p2p.expediteur, corps) - # L'adhérent n'est pas encore blacklisté + # L'adhérent n'est pas encore blacklisté fin = int(time()) + 24*3600 proprio.blacklist(['now', fin, 'autodisc_p2p', hostname]) proprio.save() diff --git a/surveillance/fiche_deconnexion/generate.py b/surveillance/fiche_deconnexion/generate.py index 08825e59..a2ba915a 100644 --- a/surveillance/fiche_deconnexion/generate.py +++ b/surveillance/fiche_deconnexion/generate.py @@ -23,10 +23,11 @@ def log(x): syslog.syslog(x) syslog.closelog() -import crans.utils.exceptions +sys.path.append('/usr/scripts/lib') +import utils.exceptions -import locale -locale.setlocale(locale.LC_TIME, 'fr_FR') +#import locale +#locale.setlocale(locale.LC_TIME, 'fr_FR') sanctions = ['upload', 'p2p'] diff --git a/surveillance/filtrage_firewall.py b/surveillance/filtrage_firewall.py index 937335b9..30a08d4a 100644 --- a/surveillance/filtrage_firewall.py +++ b/surveillance/filtrage_firewall.py @@ -23,7 +23,7 @@ reseau = ["138.231.136.0/21", "138.231.148.0/22"] # Ouverture de la base de données : ################################### -pgsql = PgSQL.connect(host='rouge.adm.crans.org', database='filtrage', user='crans') +pgsql = PgSQL.connect(host='pgsql.adm.crans.org', database='filtrage', user='crans') pgsql.autocommit = True curseur = pgsql.cursor() diff --git a/surveillance/filtrage_netacct.py b/surveillance/filtrage_netacct.py index 23a6b389..c30c2f17 100644 --- a/surveillance/filtrage_netacct.py +++ b/surveillance/filtrage_netacct.py @@ -27,7 +27,7 @@ reseau = config.NETs['all'] # Ouverture de la base de données : ################################### -pgsql = PgSQL.connect(host='rouge.adm.crans.org', database='filtrage', user='crans') +pgsql = PgSQL.connect(host='pgsql.adm.crans.org', database='filtrage', user='crans') pgsql.autocommit = True #################################################################