diff --git a/app/services/itop_service.py b/app/services/itop_service.py index 2285a76..d5afc08 100644 --- a/app/services/itop_service.py +++ b/app/services/itop_service.py @@ -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