RSS

Eureka

Environnement Citrix / Windows RDP - Eureka à la rescousse

Afin de gérer les déploiements de la DevBox-Santé dans des environnements type Windows RDP (Remote Desktop Protocol) / Citrix, nous avons créé le projet Eureka. Eureka est l’annuaire des devbox-santé branchés sur les différents lecteurs de carte PC/SC:

Dans notre post du 20 septembre 2021, nous expliquions qu’il était difficile de faire le lien entre un partage de port USB (spécifique à chaque session utilisateur RDP) et un partage de port HTTP.

Chaque session utilisateur devait être associé à une DevBox-Santé sur un port http spécifique.

Eureka service

C’est pourquoi un service dédié, nommé Eureka peut être lancé sur le serveur RDP. Ce service Eureka joue le rôle d’annuaire des différentes sessions utilisateurs devbox-santé :

!theme aws-orange
!define DEVBOX_COLOR #278ef5
!define DMP_COLOR #35D9C0
!define MSS_COLOR #DE5D80
!define INS_COLOR #07A2CF
!define CPS_COLOR #D34A3C
!define VITALE_COLOR #5FD67A
!define PSC_COLOR #ff7765
!define APCV_COLOR #c6e66d
!define ANNUAIRE_COLOR #7613e0
!define DATA_COLOR #ffa800

node "Serveur RDP" {
  package "Eureka" as eureka {
        [DevBox-Santé1:9999] as devbox1 DEVBOX_COLOR
        [DevBox-Santé2:9998] as devbox2 DEVBOX_COLOR
  }
}

node "Poste utilisateur 1" {
   [Application Intégrateur Front/Lourd] as int1
   [Lecteur USB / Utilisateur 1] as usb1
}
node "Poste utilisateur 2" {
   [Application Intégrateur Front/Lourd] as int2
   [Lecteur USB / Utilisateur 2] as usb2
}
int1 --> eureka 
devbox1 -- usb1 : mapping port USB
int2 --> eureka 
devbox2 -- usb2 : mapping port USB

Ce service Windows est lancé au démarrage de serveur RDP et attend que les devbox-santé à leur démarrage s’enregistrent auprès de lui:

eureka service

Ainsi, il suffit à l’application intégrateur de faire un appel à eureka pour connaître le numéro de port http d’écoute qui lui est spécifique.

Diagrammes de séquence

Du point de vue de l’intégrateur

!theme aws-orange
!define DEVBOX_COLOR #278ef5
!define DMP_COLOR #35D9C0
!define MSS_COLOR #DE5D80
!define INS_COLOR #07A2CF
!define CPS_COLOR #D34A3C
!define VITALE_COLOR #5FD67A
!define PSC_COLOR #ff7765
!define APCV_COLOR #c6e66d
!define ANNUAIRE_COLOR #7613e0
!define DATA_COLOR #ffa800
hide footbox
actor Utilisateur1 
box "Serveur RDP"
participant Eureka
end box
box "Session utilisateur 1"
participant "DBX:8081" as DBX_8081 DEVBOX_COLOR
participant "Application Intégrateur" as AppInt1
participant "Application Web Intégrateur (front)" as WebApp1
end box

== Cas 1 : client lourd ==
...

group Démarrage application intégrateur (cas du client lourd)
    Utilisateur1 -> AppInt1: Démarre l'applicationIntégrateur
    activate AppInt1
    AppInt1 -> AppInt1 : Appel système pour récupérer utilisateur windows
    AppInt1 -> Eureka : GET /user/Utilisateur1
    Eureka -> AppInt1 : {user: Utilisateur1, port: 8081}
    AppInt1 -> DBX_8081 : GET localhost:8081/cps/readCps...
    deactivate AppInt1
end 
...

== Cas 2 : client web ==

group Démarrage application intégrateur (cas de l'application web)
    Utilisateur1 -> WebApp1 : Accède depuis un navigateur http://superapp.integrateur 
    activate WebApp1
    note over WebApp1 : Il n'est pas possible depuis un contexte web \nde récupérer le username windows
    WebApp1 -> DBX_8081 : Lance une DevBox-sante par l'url devbox-sante://config?sessionId:12345
    WebApp1 -> Eureka : GET /user/12345
    Eureka -> WebApp1 : {user: Utilisateur1, sessionId: 12345, port: 8081}
    WebApp1 -> DBX_8081 : GET localhost:8081/cps/readCps...
end
...

Ces diagrammes paraissent un peu magiques pour l’intégrateur. C’est pourquoi, voici un diagramme de séquence détaillant ce qui se passe dans les coulisses de la DevBox-santé, afin de faire le lien entre Utilisateur windows, session web utilisateur et port http des DevBox-Santé :

!theme aws-orange
!define DEVBOX_COLOR #278ef5
!define DMP_COLOR #35D9C0
!define MSS_COLOR #DE5D80
!define INS_COLOR #07A2CF
!define CPS_COLOR #D34A3C
!define VITALE_COLOR #5FD67A
!define PSC_COLOR #ff7765
!define APCV_COLOR #c6e66d
!define ANNUAIRE_COLOR #7613e0
!define DATA_COLOR #ffa800
hide footbox
actor Utilisateur1 
box "Serveur RDP"
participant ServeurRDP
participant Eureka
end box
box "Session utilisateur 1"
participant SessionRDP1
participant "DBX:8081" as DBX_8081 DEVBOX_COLOR
participant "Application Intégrateur" as AppInt1
participant "WebApp Intégrateur\n(front)" as WebApp1
participant "Devbox temporaire" as DBX_TMP DEVBOX_COLOR
end box

== Démarrage serveur RDP ==
ServeurRDP -> Eureka : Démarrage service\nEureka
...
== Connexion utilisateur ==
Utilisateur1 -> SessionRDP1 : Se connecte
activate SessionRDP1
ServeurRDP <- SessionRDP1 : Démarre une nouvelle session
SessionRDP1 <-> ServeurRDP : Mapping port USB
SessionRDP1 -> DBX_8081 : Démarrage automatique\nd'une instance DevBox-Santé\n(port 8081 par exemple)
activate DBX_8081
DBX_8081 -> ServeurRDP : accés au port USB (pour lectures cartes)
DBX_8081 -> Eureka : POST {user: Utilisateur1, port:8081}
...

group Démarrage application intégrateur (cas du client lourd)
    Utilisateur1 -> AppInt1: Démarre l'applicationIntégrateur
    activate AppInt1
    AppInt1 -> Eureka : GET /user/Utilisateur1
    Eureka -> AppInt1 : {user: Utilisateur1, port: 8081}
    AppInt1 -> DBX_8081 : GET localhost:8081/cps/readCps...
    deactivate AppInt1
end 
...

group Démarrage application intégrateur (cas de l'application web)
    Utilisateur1 -> WebApp1 : Accède depuis un navigateur http://superapp.integrateur 
    activate WebApp1
    WebApp1 -> DBX_TMP : devbox-sante://config?sessionId:12345
    activate DBX_TMP
    DBX_TMP -> DBX_8081 : healthcheck (is alive ?)
    DBX_8081 -> DBX_TMP : 200 OK
    DBX_TMP -> Eureka : POST {user: Utilisateur1, sessionId : 12345, port: 8081}
    deactivate DBX_TMP
    WebApp1 -> Eureka : GET /user/12345
    Eureka -> WebApp1 : {user: Utilisateur1, sessionId: 12345, port: 8081}
    WebApp1 -> DBX_8081 : GET localhost:8081/cps/readCps...
end
...