[surveillance/] Migration de pgsql
Et passage rapide en UTF-8 parce que c'est mieux pour les requetes envoyees a PostGreSQL ... darcs-hash:20090421142755-ddb99-5540951e07f5d88c0ccff940b6fb9862c8c24b07.gz
This commit is contained in:
parent
94a780c50b
commit
ca191d8a27
4 changed files with 60 additions and 59 deletions
|
@ -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()
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
#################################################################
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue