diff --git a/app/routers/referentiel.py b/app/routers/referentiel.py index 68e99ae..d97fb8a 100644 --- a/app/routers/referentiel.py +++ b/app/routers/referentiel.py @@ -476,3 +476,55 @@ def dns_delete(request: Request, dns_id: int, db=Depends(get_db)): db.execute(text("DELETE FROM domain_ltd_list WHERE id = :id"), {"id": dns_id}) db.commit() return RedirectResponse(url="/referentiel?tab=dns&msg=deleted", status_code=303) + + +# ========================================================= +# SYNC iTop +# ========================================================= + +@router.post("/referentiel/itop/sync-from") +def itop_sync_from(request: Request, db=Depends(get_db)): + """Importer serveurs et contacts depuis iTop""" + user = get_current_user(request) + if not user: + return RedirectResponse(url="/login") + perms = get_user_perms(db, user) + if not can_edit(perms, "settings"): + return RedirectResponse(url="/referentiel?tab=domains") + + from ..services.secrets_service import get_secret + from ..services.itop_service import sync_from_itop + itop_url = get_secret(db, "itop_url") + itop_user = get_secret(db, "itop_user") + itop_pass = get_secret(db, "itop_pass") + + if not itop_url or not itop_user: + return RedirectResponse(url="/referentiel?tab=domains&msg=itop_noconfig", status_code=303) + + 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']}" + return RedirectResponse(url=f"/referentiel?tab=domains&msg={msg}", status_code=303) + + +@router.post("/referentiel/itop/sync-to") +def itop_sync_to(request: Request, db=Depends(get_db)): + """Exporter serveurs PatchCenter vers iTop""" + user = get_current_user(request) + if not user: + return RedirectResponse(url="/login") + perms = get_user_perms(db, user) + if not can_edit(perms, "settings"): + return RedirectResponse(url="/referentiel?tab=domains") + + from ..services.secrets_service import get_secret + from ..services.itop_service import sync_to_itop + itop_url = get_secret(db, "itop_url") + itop_user = get_secret(db, "itop_user") + itop_pass = get_secret(db, "itop_pass") + + if not itop_url or not itop_user: + return RedirectResponse(url="/referentiel?tab=domains&msg=itop_noconfig", status_code=303) + + stats = sync_to_itop(db, itop_url, itop_user, itop_pass) + msg = f"itop_to_{stats['updated']}" + return RedirectResponse(url=f"/referentiel?tab=domains&msg={msg}", status_code=303) diff --git a/app/templates/referentiel.html b/app/templates/referentiel.html index 3e694a4..74dc22b 100644 --- a/app/templates/referentiel.html +++ b/app/templates/referentiel.html @@ -48,6 +48,31 @@ {% if tab == 'domains' %} + +{% if can_modify %} +