Sync iTop: import IPs dans server_ips + traceback sur erreur sync

This commit is contained in:
Pierre & Lumière 2026-04-11 03:54:45 +02:00
parent 322fa71324
commit 66eeff99e8
2 changed files with 37 additions and 2 deletions

View File

@ -501,8 +501,12 @@ def itop_sync_from(request: Request, db=Depends(get_db)):
if not itop_url or not itop_user:
return RedirectResponse(url="/referentiel?tab=domains&msg=itop_noconfig", status_code=303)
try:
stats = sync_from_itop(db, itop_url, itop_user, itop_pass)
msg = f"itop_from_{stats['servers_created']}_{stats['servers_updated']}_{stats['contacts_created']}_{stats['contacts_updated']}"
msg = f"itop_from_{stats['servers_created']}_{stats['servers_updated']}_{stats['contacts']}_{stats['domains']}"
except Exception as e:
import traceback; traceback.print_exc()
msg = f"itop_error"
return RedirectResponse(url=f"/referentiel?tab=domains&msg={msg}", status_code=303)

View File

@ -42,6 +42,22 @@ class ITopClient:
return self._call("core/create", **{"class": cls, "fields": fields, "comment": "PatchCenter sync"})
def _upsert_ip(db, server_id, ip):
"""Insert or update IP in server_ips"""
if not ip:
return
existing = db.execute(text(
"SELECT id FROM server_ips WHERE server_id=:sid AND ip_address=:ip"),
{"sid": server_id, "ip": ip}).fetchone()
if not existing:
try:
db.execute(text(
"INSERT INTO server_ips (server_id, ip_address, ip_type, is_ssh, description) VALUES (:sid, :ip, 'primary', true, 'itop')"),
{"sid": server_id, "ip": ip})
except Exception:
pass
def sync_from_itop(db, itop_url, itop_user, itop_pass):
"""Import complet depuis iTop: contacts, domaines, envs, zones, serveurs"""
client = ITopClient(itop_url, itop_user, itop_pass)
@ -239,6 +255,9 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
WHERE id=:sid
"""), {**vals, "sid": existing.id})
stats["servers_updated"] += 1
# Update IP
if vals["ip"] and existing:
_upsert_ip(db, existing.id, vals["ip"])
else:
try:
db.execute(text("""
@ -253,6 +272,12 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
:patch_freq, :patch_excludes, :domain_ltd,
:pref_jour, :pref_heure)
"""), vals)
db.flush()
# Get new server ID and insert IP
if vals["ip"]:
new_srv = db.execute(text("SELECT id FROM servers WHERE hostname=:h"), {"h": hostname}).fetchone()
if new_srv:
_upsert_ip(db, new_srv.id, vals["ip"])
stats["servers_created"] += 1
except Exception as e:
db.rollback()
@ -280,6 +305,12 @@ def sync_from_itop(db, itop_url, itop_user, itop_pass):
"osv": s.get("osversion_id_friendlyname", ""),
"resp": resp, "desc": s.get("description", ""),
})
db.flush()
ip = s.get("managementip", "")
if ip:
new_srv = db.execute(text("SELECT id FROM servers WHERE hostname=:h"), {"h": hostname}).fetchone()
if new_srv:
_upsert_ip(db, new_srv.id, ip)
stats["servers_created"] += 1
except Exception as e:
db.rollback()