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}",
"output_fields": "name,description,status,managementip,osfamily_id_friendlyname,"
"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"):
for key, obj in r["objects"].items():
@ -67,12 +68,14 @@ class ITopClient:
"brand": f.get("brand_name", ""),
"model": f.get("model_name", ""),
"serial": f.get("serialnumber", ""),
"org": f.get("org_name", ""),
"org": f.get("organization_name", ""),
"location": f.get("location_name", ""),
"criticity": f.get("business_criticity", ""),
"cpu": f.get("cpu", ""),
"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
@ -188,9 +191,15 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
if s.get("responsable_nom"):
sets.append("responsable_nom = :resp_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"):
sets.append("commentaire = :comm")
updates["comm"] = s["description"]
if s.get("ip"):
sets.append("fqdn = :fqdn")
updates["fqdn"] = s["name"]
if sets:
sets.append("updated_at = NOW()")
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):
"""Exporte les serveurs PatchCenter vers iTop (mise a jour)"""
client = ITopClient(itop_url, itop_user, itop_pass)
stats = {"updated": 0, "errors": []}
stats = {"updated": 0, "created": 0, "errors": []}
# Get current iTop servers for matching
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:
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}")
return stats