diff --git a/surveillance/deconnexion.py b/surveillance/deconnexion.py index 3c0ee563..1a128791 100755 --- a/surveillance/deconnexion.py +++ b/surveillance/deconnexion.py @@ -15,6 +15,19 @@ from ldap_crans import crans_ldap, crans, invite, base_classes_crans from time import * +# quelques fonctions +#################### + +def machine_online(machine) : + """ + Retourne True si la machine est connectée au réseau et False si elle ne l'est pas + """ + # les wifi sont toujours online + if machine.ipsec() : + return True + # arping pour les fixes + return not commands.getstatusoutput('/usr/sbin/arping -c 3 %s' % machine.mac())[0] + # Connections : ############### pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans') @@ -234,6 +247,7 @@ if veroles: machine = ldap.search('ipHostNumber=%s' % ip,'w' )['machine'][0] hostname = machine.nom() proprio = machine.proprietaire() + bl = proprio.blacklist() # Inscription dans la table des infectes requete="INSERT INTO avertis_virus (ip_crans,date) VALUES ('%s','now')" % ip1 curseur.execute(requete) @@ -241,11 +255,21 @@ if veroles: curseur.execute(requete) infectes = curseur.fetchall() # Blacklistage - date = time() - debut = localtime(date) - proprio.blacklist(["%d/%d/%d %d:%d" % (debut[2],debut[1],debut[0],debut[3],debut[4]),'-','virus',"Virus (auto)"]) - proprio.save() - + for ligne in bl: + # On réédite si possible les lignes existantes pour ne pas charger la blackliste + if ',virus,' in ligne : + liste=ligne.split(',') + argument=['now','-',virus,hostname] + print argument,IP + index = bl.index(ligne) + proprio.blacklist((index,argument)) + proprio.save() + else : + date = time() + debut = localtime(date) + proprio.blacklist(["%d/%d/%d %d:%d" % (debut[2],debut[1],debut[0],debut[3],debut[4]),'-','virus',hostname]) + proprio.save() + # Flood ######## @@ -283,8 +307,9 @@ if veroles: # Blacklistage date = time() debut = localtime(date) - proprio.blacklist(["%d/%d/%d %d:%d" % (debut[2],debut[1],debut[0],debut[3],debut[4]),'-','virus',"Virus_flood (auto)"]) - proprio.save() + proprio.blacklist(["%d/%d/%d %d:%d" % (debut[2],debut[1],debut[0],debut[3],debut[4]),'-','virus',hostname) + proprio.save() + # Reconnexion si le virus a disparu @@ -302,25 +327,29 @@ for i in range(1,len(infectes)): curseur.execute(requete2) nb_flood = curseur.fetchall() # On traite que les IP qui sont descendues en dessoys des seuils - if nb_virus[0][0] < virus.virus and nb_flood[0][0] < virus.flood: - machine = ldap.search('ipHostNumber=%s' % IP,'w' )['machine'][0] - proprio = machine.proprietaire() - bl = proprio.blacklist() - hostname = machine.nom() - # On stoppe la sanction pour une ligne existante de la blackliste - # En prenant en compte le fait que d'autres lignes de blackliste - # ont pu s'ajouter. - for ligne in bl: - if ',-,virus,' in ligne: - liste=ligne.split(',') - argument=[liste[0],'now',liste[2],liste[3]] - print argument,IP - index = bl.index(ligne) - proprio.blacklist((index,argument)) - proprio.save() - requete="DELETE FROM avertis_virus where ip_crans='%s'"%IP - curseur.execute(requete) + if nb_virus[0][0] < virus.virus and nb_flood[0][0] < virus.flood : + machine = ldap.search('ipHostNumber=%s' % IP,'w' )['machine'][0] + # si la machine n'est pas online, on ne reconnecte pas + if not machine_online(machine) : + continue + proprio = machine.proprietaire() + bl = proprio.blacklist() + hostname = machine.nom() + # On stoppe la sanction pour une ligne existante de la blackliste + # En prenant en compte le fait que d'autres lignes de blackliste + # ont pu s'ajouter. + for ligne in bl: + if ',-,virus,%s'%hostname in ligne: + liste=ligne.split(',') + argument=[liste[0],'now',liste[2],liste[3]] + print argument,IP + index = bl.index(ligne) + proprio.blacklist((index,argument)) + proprio.save() + requete="DELETE FROM avertis_virus where ip_crans='%s'"%IP + curseur.execute(requete) + # Gestion du P2P : ################## # Dans le table virus on sélectionne les ip_src qui appartiennent au reseau @@ -353,7 +382,7 @@ if pair : curseur.execute(requete) protocole = curseur.fetchall() protocole=protocole[0][0] - corps = p2p.avertissement % { 'From': upload.expediteur, + corps = p2p.avertissement % { 'From': upload.expediteur, 'To': upload.expediteur, 'protocole': protocole, 'hostname':hostname} @@ -371,7 +400,7 @@ if pair : # 7 jours fin = localtime(date+60*60*24*7) # proprio.blacklist(["%d/%d/%d %d:%d" % (debut[2],debut[1],debut[0],debut[3],debut[4]),"%d/%d/%d %d:%d" % (fin[2],fin[1],fin[0],fin[3],fin[4]),'p2p',"P2P (auto)" % protocole]) - # proprio.save() + # proprio.save() mail.quit()