Le nettoyeur TSE (NET_TSE)

Introduction

Ce nettoyeur est un outil qui permet de pallier à un problème induit par un paramétrage de la couche Citrix d'un serveur TSE : la réinitialisation des sessions à leur fermeture.

Sur un TSE classique, lorsqu'un utilisateur ferme une session, les binaires qu'il avait activé continuent de tourner sur le serveur. Lorsqu'il se connectera à nouveau, cette même session lui sera automatiquement proposée et il retrouvera l'affichage précédent. En fait, on n'a fait qu'interrompre momentanément le déport de l'affichage.

Citrix doit se voir comme une surcouche d'un TSE et permet notamment de mieux gérer les sessions et d'inclure de nouveaux paramétrages. L'un d'entre eux est l'activation d'un mode dit de "réinitialisation" au niveau des connexions. Il permet de supprimer tous les exécutables activés dans une session dès qu'on la ferme.

Ce paramétrage est extrêmement problématique pour l'architecture d’ACE puisqu'en cas de fermeture "brutale" d'une session dans laquelle tournait encore ACE (le menu et des fonctions) :

Sur le poste client (TSE) :

Les binaires sont détruits mais ils restent référencés en mémoire partagée.

Sur le poste serveur (traitement) :

Les binaires (bdd_serveur et serveur_rpc) restent référencés et parfois même actifs sur la machine. Le nombre de licences utilisées n'étant pas décrémenté, on atteint rapidement la limite du nombre autorisé et toute connexion devient impossible .

Le rôle de ce nettoyeur est donc de scruter périodiquement les éléments d’ACE et de vérifier qu'ils sont associés à des sessions toujours actives. Sinon un nettoyage s'impose !

1.Liste des sources et génération :

ap$c:net_tse.c

ap$c:net_tse_init.c

ap$c:net_tse_service.c

ap$c:net_tse_verifie.c

ap$c:net_tse_kill.c

ap$inc:net_tse.inc

Le binaire (net_tse.exe) est générable (flags client) sur tous les environnements d’ACE depuis la 4.2.0. Par contre, il ne se lancera convenablement que sur un poste Windows ayant un paramétrage ACE TSE. Dans les autres cas, un message d'explication explicite est écrit dans un fichier trace pour indiquer une tentative de démarrage dans un mauvais contexte. (cf point 5 de ce document).

Important :

Pour que ce nettoyeur s'exécute correctement, il faut que le binaire "u_net" (nettoyeur des connexions client-serveur) tourne sur le serveur de traitement. On s'appuie en effet sur sa partie serveur pour demander tous les nettoyages à distance.

Mode d'activation possibles :

Lancement direct

Il est possible de lancer le binaire directement en ligne de commande. Sur le poste TSE, il faut se placer dans le répertoire contenant le "Generix.ini" et activer la commande :

"rep_executable\net_tse.exe –manuel" où "rep_executable" est le répertoire contenant le binaire.

Cette utilisation permet surtout de prévoir le lancement depuis un fichier de commande (".bat") ou de réaliser un test momentané.

Lancement par service

C'est le mode préconisé pour ce nettoyeur qui a avant tout été conçu pour se lancer au démarrage de la machine et s'exécuter en continu.

Pour installer le nettoyeur en tant que service, vous devez utiliser l'utilitaire "u_inst_srv.exe", binaire généré sur tous les environnements mais seulement valide sur les machines Windows.

Utilisation :

  • en ligne de commande et n'importe où puisqu'il n'est pas nécessaire d'ouvrir le "Generix.ini".
  • Installation d'un service :

u_inst_srv <nom service> <chemin complet> [<repertoire lancement>]

Suppression d'un service :

u_inst_srv remove <nom service>

Dans notre cas, il faut passer la ligne de commande suivante :

u_inst_srv net_tse rep_exe_gnx \net_tse.exe rep_ini_gnx

avec rep_exe_gnx le chemin (complet !) dans lequel est placé le binaire.

rep_ini_gnx le chemin (complet !) dans lequel est placé le "Generix.ini"

A l'issue de cette commande, on doit avoir :

  • les messages suivants affichés :

Creation du service net_tse OK.

Creation de la clef designant le repertoire de demarrage.

Valeur de la clef : rep_ini_gnx

  • la création d'un service "net_tse" visible depuis votre panneau de configuration, icône service.
  • la création d'une clef dans votre base de registre. Pour vérifier, lancer l'éditeur de registre (regedit.exe) et déployer l'arborescence :

    "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\net_tse"

Le service est programmé pour démarrer automatiquement au "boot" de la machine mais il est possible de l'activer manuellement depuis votre panneau de configuration.

Algorithme principal

Sans rentrer volontairement dans les détails, voici un aperçu du fonctionnement global du nettoyeur. Il vous permettra de mieux comprendre les possibilités de paramétrage (cf. point 4) et les traces écrites dans un fichier de résultat (cf. point 5).

Phase 1 : Initialisation du service et vérification du contexte d'activation (serveur TSE ?)

Boucle infinie

{

Phase 2 : Démarrage du travail de nettoyage s'il est possible de se connecter à un superviseur local.

Phase 3 : Si connecté, phase de travail :

Phase 3-A-1:

Récupération des session vues par le serveur TSE en ne référençant que les sessions qui sont actives ou momentanément déconnectées. L'outil "u_cnx_tse" vous permet de récupérer l'équivalent.

Comparaison avec les sessions référencées en mémoire partagée et marquage des sessions suspectes.

Phase 3-A-2:

Période de courte inactivité pour laisser le temps au système de se stabiliser si nécessaire.

Phase 3-A-3:

Phase 3-A-1 à l'identique.

Phase 3-B : Suppression des sessions ACE déterminées "zombies".

Phase 4 : Période d'inactivité.

Phase 5 : Réveil et test si superviseur toujours actif, sinon arrêt du travail de nettoyage.

}

Paramétrage du Generix.ini

Une section [Nettoyeur_TSE] peut être ajoutée au "Generix.ini" du serveur TSE pour paramétrer son fonctionnement. Ces clefs possèdent cependant toutes des valeurs par défaut.

Libellé Clef Signification Valeur par défaut
Nb Tentatives Connexion Nombre de tentative de création d'une socket avec le serveur de traitement 5
Duree Repos Temps en secondes de repos du nettoyeur (phase 4) 1800
Duree Controle Temps en seconde entre deux séries de vérification.(phase 3-A-2) 60
Detail Trace Trace dans le fichier "net_tse.log" plus ou moins détaillée. NON

Remarques :

  • La valeur de toutes ces clefs peut être changée dynamiquement pendant l'exécution du nettoyeur. A l'issue de chaque période d'inactivité, ce dernier va en effet recharger toutes les valeurs
  • La clef "Nb Tentatives Connexion" n'existe que pour pallier à un "bug" référencé sur certains systèmes lors de la création de socket. Il est conseillé dans la majeure partie des cas de conserver la valeur par défaut.

Explications des messages du fichier trace

Cette partie détaille les messages que l'on peut trouver dans le fichier trace "net_tse.log" écrit dans le répertoire du "Generix.ini". Ce fichier est remplacé à chaque nouvelle activation, à l'image du "superviseur.log".

Pour mieux comprendre les éventuels problèmes remontés, en plus des messages classiques détaillés ici, on affiche aussi les messages d'erreurs retournées par les API standards de Windows et de TSE. On affiche aussi le plus souvent la date système pour pouvoir reconstituer un historique précis.

Dans les paragraphes suivants, les messages affichés en gras sont ceux qui apparaissent si tout se déroule correctement.

Initialisation et démarrage du service

Pour les 3 erreurs suivantes, le fichier trace s'écrit dans le répertoire de base des services de Windows, à savoir souvent "C:\WinNT\system32"

"Erreur service : Echec d'ouverture de la cle dans la base de registre"

"Erreur service : Echec de récupération de la valeur de la cle dans la base de registre"

"Erreur service : Echec lors du déplacement vers le répertoire de démarrage"

Raisons :

L'installation du service n'a pas été effectué correctement, le paramètre indiquant le répertoire de lancement est manquant ou erroné. Pour le vérifier, lancer le "regedit" et vérifier les valeurs des clefs de "net_tse" (HKEY_LOCAL_MACHINE\SYSTEM\SetCurrent\Services). Si besoin, vous pouvez supprimer le service (commande : u_inst_srv remove net_tse) et le recréer.

Dernier point, le répertoire de démarrage spécifié est éventuellement inaccessible.

"Debut de l'initialisation du service Nettoyeur"

"Erreur service : Echec de démarrage du controleur"

"Erreur service : Echec d'enregistrement du controleur"

"Erreur service : Echec de création du thread"

"Erreur service : Echec de création de l'évènement"

"Erreur service : Echec de la mise à jour du statut"

"Fin de l'initialisation du service Nettoyeur"

Les erreurs précédentes sont des erreurs systèmes graves qui indiquent que le service n'a pu se lancer correctement. Les droits d'accès du compte ou l'installation du système d'exploitation sont probablement en cause.

Vérification du contexte d'activation du nettoyeur (phase 1)

A ce stade, les traces sont identiques pour une activation en mode "service" ou "manuel".

"Démarrage impossible : GENERIX.INI non trouvé"

"Démarrage impossible : Ce n'est pas un serveur TSE"

"Contrôles préliminaires d'activation OK"

Au lancement, on vérifie en effet que la clef "Serveur TSE" de la section [Systeme] est à "OUI". Dans les autres cas, l'activation du nettoyeur est inutile.

Activation du travail de nettoyage (phase 2)

"Démarrage impossible : Erreur initialisation socket"

"Démarrage impossible : Il n'y a pas de serveur de TRT"

"Démarrage impossible : Pb lors de la création de la connexion RPC "

"Démarrage du travail de nettoyage"

A ce stade, on crée une socket de communication avec le serveur de traitement pour contacter "l'u_net" serveur. Les erreurs indiquent une indisponibilité de la machine ou un paramétrage erroné du "Generix.ini" (N° de prog superviseur par exemple).

Mais dans ce cas, on devrait rencontrer les mêmes problèmes lors du lancement d’ACE.

"Erreur de récupération des parametres licence"

"Erreur de recuperation des services locaux"

Ces deux erreurs indiquent une impossibilité à se connecter à la mémoire partagée locale. Le nettoyeur essayera d'activer le travail de nettoyage à son prochain réveil.

Vérification des sessions TSE (phase 3-A-1)

Selon le mode de trace indiqué dans le "Generix.ini", les affichages seront plus ou moins loquaces :

Mode détaillé :

"Premier passage de vérification des sessions"

"La SI TSE-32 est passée à l'état SUSPECT"

"La SI TSE-xx est cohérente"

"Second passage de vérification des sessions"

"La SI TSE-30 est passée à l'état SUSPECT"

"La SI TSE-32 est passée à l'état ZOMBIE"

"La SI TSE-xx est cohérente"

Les messages sont répétés pour toutes les sessions interactives présentes en mémoire partagée. Dans l'exemple précédent, la session "TSE-32" pose problème. La première vérification la passe à un état suspect et la deuxième à l'état zombie qui signifie qu'il faut la détruire.

Mode non détaillé :

"La SI TSE-32 est passée à l'état SUSPECT"

"La SI TSE-32 est passée à l'état ZOMBIE"

Si la vérification s'est déroulée correctement pour toutes les sessions, on a dans les deux modes le message :

"Contrôle des sessions TSE OK"

Erreurs possibles :

"Erreur TSE lors de la constitution de la liste des SI"

"Erreur TSE : Impossible de récupérer les sessions courantes"

"Erreur TSE : Impossible d'obtenir l'identifiant d'une session"

"Erreur TSE : Impossible d'obtenir l'état de connexion d'une session"

Toutes ces erreurs surviennent lors d'appels aux API de TSE. S'il s'agit d'un problème temporaire rencontré au cours d'un seul passage de vérification, cela ne pose pas de réel problème. Les sessions incriminées seront traitées au prochain passage de vérification. Si ce message est récurrent, le problème est beaucoup plus sérieux et empêche le fonctionnement correct du nettoyeur.

Le message qui apparaît le plus régulièrement est "Fermeture en attente dans la session." Il indique qu'au moment de la récupération de l'état d'une session TSE, cette dernière était en train de s'arrêter.

Nettoyage des sessions "zombies" (phase 3-B)

Mode détaillé :

"Début du travail de destruction des sessions"

"La SI TSE-xx est détruite sur le serveur"

"La SI TSE-xx est détruite sur le poste TSE"

"Fin du travail de destruction des sessions"

Mode non détaillé :

"Destruction de la session TSE-xx détectée zombie"

Erreurs possibles :

"Erreur lors de la requête de destruction serveur"

Si une destruction ne faisait pas convenablement, cela ne poserait pas à priori pas de problème puisque la session sera de nouveau détectée "zombie" au cours de la prochaine phase de vérification.

Par contre, si le message d'erreur précédent apparaît, il faudra intervenir manuellement par VISUCS pour supprimer certains éléments. En effet, cette trace indique qu'on n'a pas reçu de requête positive de la part du nettoyeur installé sur le serveur de traitement. Or comme il n'existe plus de référence sur la partie cliente, ces entités ne seront plus jamais détruites par le nettoyeur !

Messages d'arrêt des traitements

"Arrêt du travail de nettoyage" : Ce message intervient lors d'un passage dans la phase 5 de l'algorithme. Le superviseur du serveur TSE a été arrêté ou relancé pendant la période de sommeil de nettoyeur.

Arrêté : le travail de nettoyage devient inutile. La prochaine activation redémarrera automatiquement le traitement.

Relancé : il faut arrêter le travail et relancer la phase de démarrage pour prendre en compte d'éventuels changement de paramètrage du "Generix.ini".

"Arrêt du service Nettoyeur" : Le service a été explicitement arrêté, le nettoyeur ne tourne plus sur la machine.

Limites diverses :

  • Cet outil n'est pas et ne sera jamais un nettoyeur de l'architecture d’ACE au sens large Il ne réalise qu'un seul et unique contrôle dans le cadre d'une utilisation bien spécifique : celle d'un TSE en mode réinitialisation.
  • Il faut veiller à ne pas faire tourner deux instances du nettoyeur en même temps sur le serveur TSE. La configuration en mode "service" évite ce problème mais pas celui "manuel".

Par contre l'utilisation simultanée de ce nettoyeur et de "l'u_net" client classique ne pose pas de problèmes.