import_sanef_ips: CAST inet + hostname multi-source + skip doublons

This commit is contained in:
Pierre & Lumière 2026-04-14 19:50:40 +02:00
parent b66ef0a122
commit c905ab6db3

View File

@ -39,8 +39,13 @@ def main():
skipped = 0
for r in rows:
vm_name = (r.get("Machine virtuelle->Nom") or "").strip()
ip = (r.get("Adresse IP") or "").strip()
# Hostname peut venir de Machine virtuelle / Serveur / Nom selon l'export iTop
vm_name = (r.get("Machine virtuelle->Nom") or r.get("Machine virtuelle")
or r.get("Serveur->Nom") or r.get("Serveur")
or r.get("Système->Nom") or r.get("Nom") or "").strip()
if vm_name:
vm_name = vm_name.split(".")[0].lower()
ip = (r.get("Adresse IP") or r.get("IP") or "").strip()
gw = (r.get("Passerelle") or "").strip() or None
mask = (r.get("Masque de sous réseau") or "").strip() or None
vrf = (r.get("VRF") or "").strip() or None
@ -56,21 +61,19 @@ def main():
continue
try:
existing = conn.execute(text(
"SELECT id FROM server_ips WHERE server_id=:sid AND ip_address=CAST(:ip AS inet)"
), {"sid": srv.id, "ip": ip}).fetchone()
if existing:
skipped += 1
continue
conn.execute(text("""
INSERT INTO server_ips (server_id, ip_address, is_primary, gateway, netmask, vrf)
VALUES (:sid, :ip, true, :gw, :mask, :vrf)
VALUES (:sid, CAST(:ip AS inet), true, :gw, :mask, :vrf)
"""), {"sid": srv.id, "ip": ip, "gw": gw, "mask": mask, "vrf": vrf})
linked += 1
except Exception as e:
# colonnes optionnelles peut-être absentes, fallback minimal
try:
conn.execute(text("""
INSERT INTO server_ips (server_id, ip_address, is_primary)
VALUES (:sid, :ip, true)
"""), {"sid": srv.id, "ip": ip})
linked += 1
except Exception as e2:
print(f" [ERR] {vm_name} {ip}: {str(e2)[:150]}")
print(f" [ERR] {vm_name} {ip}: {str(e)[:150]}")
skipped += 1
conn.close()