#!/usr/bin/python 
# Dis, emacs, c'est du -*- python -*-, ça !
#
# C.Chépélov, 19 janvier 1999. Suite à discussion avec Olivier DALOY, et
# des trucs louches dans ses logs. Merci, merci ARP !!

import config
import pickle,string,os

# Phase 1 : lire les données théoriques, les retrier pour être exploitables.

ZONEDB = pickle.load(open(config.CFG_FILE_ROOT+"Zone.db","r"))

THicn_by_mac = {} # ip, comment, name by MAC (théorique)
THncm_by_ip = {}  # name, comment, MAC by IP (théorique)

for name in ZONEDB.keys():
    (IP,comment,MAC) = ZONEDB[name]
    THicn_by_mac[MAC] = (IP,comment,name)
    THncm_by_ip[IP] = (name,comment,MAC)

# Phase 2 : Lire les données réelles, les mettres dans des dicos pour être
# exploitables.

arp = os.popen("arp -n","r")
arp.readline()

ip_by_mac = {}
mac_by_ip = {}
while 1:
    s = arp.readline()
    if not s: break
    sl = string.split(s)
    try:
        ip = sl[0]
        
        mac = ""
        if (sl[1] != "ether") or (sl[2] == "(incomplete)"): raise "incomplete"
        for c in string.lower(sl[2]):
            if c in "0123456789abcdef":
                mac = mac + c
        if not ip or not mac: break
        ip_by_mac[mac] = ip
        mac_by_ip[ip] = mac
        
    except:
        pass
                
# Phase 3 : en fonction des gens qu'on a vus, faire une comparaison...
# d'abord, par IP vues :

try:
    problems = open("/var/log/arpanoid","r").readlines()
except:
    problems = []
    # la liste des problèmes. Sera triée par ordre alphabétique
    # et les problèmes rendus uniques.
    # note: on récupère les vieux problèmes, on génèrera le même message
    # plusieurs fois (pas grave, on virera les messages identiques)

def log(s):
    s = s + '\n'
    if not s in problems: problems.append(s)
    
for ip,mac in mac_by_ip.items():
    
    if THicn_by_mac.has_key(mac):
        thIP,comment,name = THicn_by_mac[mac]
        if thIP == ip: pass # print name,' est clair (IP by MAC)'
        else:
            if THncm_by_ip.has_key(ip): victim,t1,t2 = THncm_by_ip[ip]
            else: victim = "(inconnu)"
            log("%s (%s) usurpe une adresse IP !!! (normal=%s,actuel=%s[%s])" % (name,comment,thIP,ip,victim))
    else:
        log("MACHINE INCONNUE (intruse ?) MAC=%s !" % mac)

    if THncm_by_ip.has_key(ip):
        name,comment,thMAC = THncm_by_ip[ip]
        if thMAC == mac: pass # print name,' est clair (MAC by IP)'
        else:
            if THicn_by_mac.has_key(mac): t1,t2,name = THicn_by_mac[mac]
            else: victim = "(inconnu)"
            log("%s (%s) utilise une autre carte réseau !!! (normal=%s,actuel=%s[%s]" % (name,comment,thMAC,mac,victim))
    else:
        diag = "(intruse ?)"
        if THicn_by_mac.has_key(mac):
            THip,comment,name = THicn_by_mac[mac]
            diag = "%s de %s" % (name,comment)
        log("MACHINE AVEC FAUX IP=%s (%s)!" % (ip,diag))
problems.sort()

print string.join(problems,"")
                
