Sync iTop enrichie: responsable_serveur + responsable_domaine + creation VMs

- Import: responsable_serveur_name → responsable_nom, responsable_domaine_name → referent_nom
- Import: environnement iTop synchronise
- Export: cree les VMs manquantes dans iTop (classe VirtualMachine, org MPCZ)
- Export: hostname comme nom (pas fqdn)
This commit is contained in:
Pierre & Lumière 2026-04-11 00:14:09 +02:00
parent 53e59e7305
commit db74111d58

View File

@ -41,7 +41,8 @@ class ITopClient:
"key": f"SELECT {cls}", "key": f"SELECT {cls}",
"output_fields": "name,description,status,managementip,osfamily_id_friendlyname," "output_fields": "name,description,status,managementip,osfamily_id_friendlyname,"
"osversion_id_friendlyname,brand_name,model_name,serialnumber," "osversion_id_friendlyname,brand_name,model_name,serialnumber,"
"org_name,location_name,business_criticity,cpu,ram,contacts_list" "organization_name,location_name,business_criticity,cpu,ram,"
"contacts_list,responsable_serveur_name,responsable_domaine_name,environnement"
}) })
if r.get("code") == 0 and r.get("objects"): if r.get("code") == 0 and r.get("objects"):
for key, obj in r["objects"].items(): for key, obj in r["objects"].items():
@ -67,12 +68,14 @@ class ITopClient:
"brand": f.get("brand_name", ""), "brand": f.get("brand_name", ""),
"model": f.get("model_name", ""), "model": f.get("model_name", ""),
"serial": f.get("serialnumber", ""), "serial": f.get("serialnumber", ""),
"org": f.get("org_name", ""), "org": f.get("organization_name", ""),
"location": f.get("location_name", ""), "location": f.get("location_name", ""),
"criticity": f.get("business_criticity", ""), "criticity": f.get("business_criticity", ""),
"cpu": f.get("cpu", ""), "cpu": f.get("cpu", ""),
"ram": f.get("ram", ""), "ram": f.get("ram", ""),
"responsable_nom": contact_names[0] if contact_names else "", "responsable_nom": f.get("responsable_serveur_name", "") or (contact_names[0] if contact_names else ""),
"responsable_domaine": f.get("responsable_domaine_name", ""),
"environnement": f.get("environnement", ""),
}) })
return servers return servers
@ -188,9 +191,15 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
if s.get("responsable_nom"): if s.get("responsable_nom"):
sets.append("responsable_nom = :resp_nom") sets.append("responsable_nom = :resp_nom")
updates["resp_nom"] = s["responsable_nom"] updates["resp_nom"] = s["responsable_nom"]
if s.get("responsable_domaine"):
sets.append("referent_nom = :ref_nom")
updates["ref_nom"] = s["responsable_domaine"]
if s.get("description"): if s.get("description"):
sets.append("commentaire = :comm") sets.append("commentaire = :comm")
updates["comm"] = s["description"] updates["comm"] = s["description"]
if s.get("ip"):
sets.append("fqdn = :fqdn")
updates["fqdn"] = s["name"]
if sets: if sets:
sets.append("updated_at = NOW()") sets.append("updated_at = NOW()")
db.execute(text(f"UPDATE servers SET {', '.join(sets)} WHERE id = :sid"), updates) db.execute(text(f"UPDATE servers SET {', '.join(sets)} WHERE id = :sid"), updates)
@ -219,7 +228,7 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
def sync_to_itop(db, itop_url, itop_user, itop_pass): def sync_to_itop(db, itop_url, itop_user, itop_pass):
"""Exporte les serveurs PatchCenter vers iTop (mise a jour)""" """Exporte les serveurs PatchCenter vers iTop (mise a jour)"""
client = ITopClient(itop_url, itop_user, itop_pass) client = ITopClient(itop_url, itop_user, itop_pass)
stats = {"updated": 0, "errors": []} stats = {"updated": 0, "created": 0, "errors": []}
# Get current iTop servers for matching # Get current iTop servers for matching
itop_servers = {s["name"].lower(): s for s in client.get_servers()} itop_servers = {s["name"].lower(): s for s in client.get_servers()}
@ -251,5 +260,19 @@ def sync_to_itop(db, itop_url, itop_user, itop_pass):
else: else:
stats["errors"].append(f"{srv.hostname}: {r.get('message')}") stats["errors"].append(f"{srv.hostname}: {r.get('message')}")
else:
# Server not in iTop — create as VirtualMachine
fields = {
"name": srv.hostname,
"org_id": "SELECT Organization WHERE name = 'MPCZ'",
"status": status_map.get(srv.etat, "production"),
"description": srv.commentaire or f"OS: {srv.os_version or 'N/A'}",
}
r = client.create_server("VirtualMachine", fields)
if r.get("code") == 0:
stats["created"] += 1
else:
stats["errors"].append(f"Create {srv.hostname}: {r.get('message')}")
log.info(f"iTop export: {stats}") log.info(f"iTop export: {stats}")
return stats return stats