• v1.6.26 eb109cc86a

    emitlinks released this 2026-10-26 14:20:36 +00:00 | 28 commits to main since this release

    AirWatch Sync 1.6.26

    1.6.26 — alignement des appels API avec les specs OpenAPI de la console UEM (mdmv1)

    Appels API vérifiés et corrigés contre les specs officielles

    • GET /devices/search : enveloppe DeviceSearchResultExtended (Total, Page,
      PageSize, Devices[]) ; pagination 0-based confirmée. Un tableau nu reste
      accepté pour les vieilles consoles.
    • GET /devices/{id} : objet Device complet ; fallback sur la recherche
      paginée en cas de 404 (certaines consoles ne servent que la recherche).
    • PUT /devices/{id} : corps DeviceRequestModel (champs writables :
      AssetNumber, Ownership, DeviceFriendlyName) ; la console répond
      204 No Content — tout 2xx sans corps est désormais traité comme succès.
    • GET /devices/{id}/apps : enveloppe DeviceAppsResult (DeviceApps[]).
    • GET /devices/{uuid}/apps/search : AppV1PagedSearchResultsModel
      (app_items[], TotalResults) en fallback, avec pagination.
    • Statuts d'app AirWatch : les valeurs numériques (1-5) sont converties en
      libellés (Installed, Downloaded, ... ; 4 « Removed » exclue des liens
      applications GLPI).
    • Architecture OS : ProcessorArchitecture 0 → ARM64, 9 → x86-64.

    Correspondance de champs

    • Nouvelle option de mapping Ownership (3e champ writable de
      DeviceRequestModel), en plus de DeviceFriendlyName et AssetNumber.

    Documentation et outillage

    • README : section « UEM console API (reference) » alignée sur l'export
      OpenAPI (endpoints, formes de réponse, champs writables, 204, statuts d'app).
    • Mock AirWatch réécrit aux champs exacts de la console actuelle ; le script
      e2e nettoie désormais les processus orphelins sur le port 9000.

    E2E vérifié de bout en bout : 8/8 appareils, 9 liens d'apps (Removed exclue),
    8 write-backs PUT 204, fallback paginé opérationnel.

    Downloads
  • v1.6.25 e0c85fa0be

    emitlinks released this 2026-10-24 17:34:25 +00:00 | 31 commits to main since this release

    AirWatch Sync 1.6.25

    1.6.25 — icône d'onglet

    • L'onglet « Synchronisation AirWatch » des fiches d'actifs (Téléphone,
      Ordinateur, Périphérique, Imprimante) affiche désormais une icône de
      synchronisation (ti ti-refresh) à gauche du libellé, comme les autres
      onglets des fiches GLPI 11.
    Downloads
  • v1.6.24 e0c85fa0be

    emitlinks released this 2026-10-24 16:03:03 +00:00 | 31 commits to main since this release

    AirWatch Sync 1.6.24

    1.6.24 — champs du plugin « Fields », synchro des systèmes d'exploitation, durcissement de l'upload

    Synchronisation des systèmes d'exploitation (smartphones / tablettes)

    • L'OS récupéré d'AirWatch (Android, Apple iOS, Apple macOS, Windows) est
      écrit dans glpi_items_operatingsystems pour les smartphones/tablettes,
      que l'asset soit de type Téléphone ou Ordinateur (vérifié sur GLPI 10 et 11 :
      l'onglet « Systèmes d'exploitation » existe sur tous les types d'actifs).
    • Pour les ordinateurs, l'OS n'est jamais écrit par AirWatch dès que l'asset
      porte un agent d'inventaire (les infos Windows restent pilotées par l'agent
      GLPI).
    • Architecture : Arch 0 → ARM64, 9 → x86-64.
    • Vraie version Windows : 10.0.22621 → 11 22H2, 10.0.19045.3073 →
      10 22H2 (build exact ou intégré), builds inconnus laissés tels quels.
    • Nouveau(s) jeton(s) de nom composé : {airwatch:OSVersion} (et {airwatch:OS}).
    • Miroir : colonnes aw_os, aw_os_version, aw_os_arch ; stat os_written.

    Champs du plugin « Fields »

    • Les champs du plugin GLPI « Fields » (conteneurs actifs sur Ordinateur et
      Téléphone) apparaissent automatiquement dans la correspondance de champs,
      dans un groupe dédié « Fields plugin ».
    • Les valeurs sont lues et écrites dans les tables de valeurs générées par le
      plugin (colonnes exactes : clé étrangère pour les dropdown, y compris
      dropdown-{Classe}), avec les transforms dropdown/statut/date/nombre/texte.
    • Si le plugin Fields n'est pas installé, aucun champ n'apparaît (pas de crash).

    Statuts : uniquement des statuts existants côté GLPI

    • La correspondance « Statuts AirWatch → état GLPI » et le champ « état par
      défaut » ne proposent que les statuts réellement présents dans glpi_states.
    • Tout champ mappé sur states_id est forcé en transform « status » et résolu
      via stateId() : un état introuvable est ignoré, jamais inventé.

    Durcissement de l'upload certificat / clé privée

    • Rejet explicite des noms . / .. / vides, et contrôle realpath que le
      fichier final est bien dans le répertoire certs/ (anti path traversal).
    Downloads
  • v1.6.23 f24a628416

    emitlinks released this 2026-10-23 21:57:00 +00:00 | 32 commits to main since this release

    AirWatch Sync 1.6.23

    1.6.23 — write-back du nom via DeviceFriendlyName

    Correction du champ poussé lors du renommage de l'appareil dans la console
    AirWatch/UEM : le plugin pousse désormais le champ DeviceFriendlyName
    (v0) au lieu du champ Name (légacy), comme le fait l'API legacy
    (PUT /API/mdm/devices/{id} avec le corps {"DeviceFriendlyName": ...}).

    Le nom composé (template {glpi:...} / {airwatch:...}) est comparé au
    DeviceFriendlyName actuel avant d'être poussé, pour ne pas réécrire un nom
    que la console porte déjà.

    Vérifié en E2E dans le conteneur de référence : sync réelle → 8 write-back,
    le mock reçoit PUT /api/mdm/devices/{id} avec le champ
    DeviceFriendlyName portant le nom composé.

    Downloads
  • v1.6.22 db7be02070

    emitlinks released this 2026-10-23 15:49:33 +00:00 | 34 commits to main since this release

    AirWatch Sync 1.6.22

    1.6.22 — synchronisation des applications installées vers GLPI

    Les applications installées sur chaque appareil dans AirWatch sont maintenant
    récupérées (GET /api/mdm/devices/{id}/apps, avec repli sur le nouvel endpoint
    /apps/search) et peuplent la liste « Élément > Logiciels » de la fiche asset
    dans GLPI. Les entrées logiciel/version GLPI sont créées à la volée si elles
    n'existent pas, puis liées à l'appareil.

    Activable par type d'appareil dans le profil de synchronisation :

    • Include computers (assets Computer)
    • Include smartphones and tablets (assets Phone)
    • Unlink applications no longer listed in AirWatch (opt-in)
    • Platform filter (ex. ios,Android,win32nt, vide = toutes)

    Les statuts de synchronisation affichent désormais les compteurs d'applications
    (apps, apps_linked, apps_software_created, apps_removed).

    Note technique : la liaison utilise le modèle GLPI 11
    (glpi_softwareversions + glpi_items_softwareversions) — incompatible avec
    les versions antérieures de GLPI qui n'exposent pas ces tables.

    Downloads
  • v1.6.21 ab7129580f

    emitlinks released this 2026-10-23 08:32:38 +00:00 | 36 commits to main since this release

    AirWatch Sync 1.6.21

    1.6.21 — chemin par défaut du lien vers l'appareil modifié

    Le lien profond vers l'appareil dans la console Workspace ONE UEM (nom de
    l'appareil sur l'onglet « Synchronisation AirWatch » d'une fiche asset, et
    liste des appareils synchronisés sur la page de configuration) utilisait par
    défaut le chemin :

    {base}/airwatch/manage/device/{device_id}/summary
    

    Il est désormais :

    {base}/AirWatch/Device/Details/Summary/{device_id}
    
    • Seule la valeur par défaut change : le champ « Device link template » reste
      entièrement surchargeable par profil ({base}, {device_id}, {tenant}).
    • Si un profil a un template personnalisé, il n'est pas modifié.
    Downloads
  • v1.6.20 97d3af1673

    emitlinks released this 2026-10-23 07:59:48 +00:00 | 40 commits to main since this release

    AirWatch Sync 1.6.20

    1.6.20 — même chemin de récupération pour la synchro d'un seul appareil et la synchro complète

    La synchronisation lancée depuis l'onglet « Synchronisation AirWatch » d'une fiche
    asset utilisait d'abord l'endpoint GET /api/mdm/devices/{id} de la console
    Workspace ONE UEM. Les consoles qui n'exposent pas cette route (uniquement la
    liste via search) faisaient échouer la synchro unitaire — « appareil non
    trouvé » — alors que la page de configuration listait bien l'appareil.

    • La détection d'un appareil passe désormais par le scan paginé de la liste
      search
      par numéro de série, exactement comme la synchro complète
      (même contrat de pagination : pages 1..N, pagesize du profil, max 1000 pages).
    • runDevice (asset déjà lié à un DeviceID) retombe sur le scan paginé de la
      liste quand la route individuelle est indisponible : les deux points d'entrée
      partagent un seul chemin de récupération.
    • Outils de test : le mock accepte MOCK_NO_SINGLE (console sans route
      individuelle) ; script e2e e2e_sync_one_v2.sh (page_size=3, route
      individuelle en 404) qui prouve que la synchro unitaire trouve les appareils
      non liés et liés.
    Downloads
  • v1.6.19 f34eda8b47

    emitlinks released this 2026-10-22 20:19:40 +00:00 | 42 commits to main since this release

    AirWatch Sync 1.6.19

    Contenu

    1.6.18 (composée dans cette release)

    • Nom d'appareil AirWatch composé avec des variables {glpi:champ} / {airwatch:champ}.
    • Détection de l'appareil dans l'onglet « Synchronisation AirWatch » de la fiche asset
      (scan complet de la console par numéro de série).
    • Correspondance des statuts : tableau avec liste déroulante des états GLPI réels.
    • Correspondance des plateformes : tableau, champ texte AirWatch + type d'asset GLPI.
    • État GLPI par défaut : vide par défaut (plus de « In use » imposé).
    • Boutons supprimer au style GLPI ; résultat de synchro toujours sous les boutons.
    • Suppression de l'entrée « Appareils AirWatch » du menu Parc.

    1.6.19

    • Retrait de la ligne de statut « Authentification Basic : » sous le
      formulaire de configuration. La clé d'API continue d'être envoyée dans l'en-tête
      aw-tenant-code (comportement inchangé).
    Downloads
  • v1.6.17 5b4a37d84f

    emitlinks released this 2026-10-22 15:12:21 +00:00 | 45 commits to main since this release

    AirWatch Sync 1.6.17

    Correctif : plus aucun renommage forcé du poste

    Le repli sur le nom de la console AirWatch s'appliquait à chaque fois que la
    correspondance du champ name ne produisait pas de valeur — c'est-à-dire
    toujours quand le champ name est désactivé dans la correspondance des
    champs. Le plugin « voulait donc toujours changer le nom du poste ».

    • Le nom de la console n'est maintenant utilisé que pour les assets créés
      sans nom (asset neuf, GLPI oblige un nom).
    • Un asset GLPI qui a déjà un nom n'est plus jamais renommé de force : la
      désactivation de la correspondance name est respectée.
    • Si la correspondance name est activée, le nom console reste synchronisé
      (comportement attendu, inchangé).

    Note d'environnement

    Le test e2e dans le conteneur GLPI n'a pas pu être refait : l'hyperviseur
    Windows (WSL2) est inactif sur la machine après un redémarrage, ce qui
    empêche Docker Desktop de démarrer. Un redémarrage de la machine (et
    éventuellement bcdedit /set hypervisorlaunchtype Auto en administrateur)
    restaurera l'environnement de test.

    Downloads
  • v1.6.16 84a99e85e3

    emitlinks released this 2026-10-22 13:10:08 +00:00 | 47 commits to main since this release

    AirWatch Sync 1.6.16

    Compatibilité API réelle Workspace ONE UEM (devices/search v0)

    Le plugin était codé pour un format de réponse théorique ; les appareils renvoyés
    par /api/mdm/devices/search dans les consoles réelles utilisaient d'autres noms
    de champs, ce qui faisait échouer la détection par numéro de série.

    Identifiants des appareils

    • L'identifiant console est lu dans Id.Value (format réel de l'API) au lieu du
      champ fictif DeviceID ; Uuid est accepté en repli.
    • Imei (nom réel du champ dans la réponse) est désormais lu, en plus des
      alias IMEI et MEID.
    • Udid, MacAddress et AssetNumber sont exposés dans le catalogue de
      correspondance de champs.

    Détection par numéro de série

    • Le matching compare maintenant, insensiblement à la casse, tous les
      identifiants AirWatch (SerialNumber, Imei/IMEI, MEID,
      InternalDeviceIdentifier, Udid) contre le champ serial et le champ
      otherserial des tables Computer et Phone.
    • Un appareil AirWatch est lié à l'asset GLPI existant (son type prime sur le
      type déduit de la plateforme) au lieu d'être recréé en doublon.

    Plateformes

    • Le champ plateforme est lu dans Platform (ex. WinRT, Apple, Android) ;
      WinRT est mappé sur Computer. Les valeurs Apple/Android restent mappées
      sur Phone.
    • EnrollmentStatus, ManagedBy et Ownership sont disponibles dans le
      catalogue de correspondance (statut d'enrôlement, gestionnaire,
      propriété C/U).

    Vérification

    • 53 assertions unitaires sur des payloads capturés de vraies consoles
      (tools/v0_field_test.php).
    • Test e2e via l'endpoint front/sync.php (login → jeton CSRF → dry run
      form-encoded) : réponse 200 avec JSON propre.
    Downloads