Changement des paramètres des programmes tout en conservant les paramètres personnels

Contexte

Dans une organisation médicale, des solutions basées sur des serveurs PACS Orthanc et le client DICOM Radiant étaient mises en œuvre. Lors de la configuration, il est apparu que chaque client DICOM doit être décrit dans les serveurs PACS comme suit :

  • Nom du client
  • Nom AE (doit être unique)
  • Port TCP, qui est automatiquement ouvert du côté client et reçoit les études DICOM du serveur PACS (c'est-à-dire que le serveur les envoie vers le client - initiant la connexion en premier)
  • Adresse IP

Après avoir configuré les clients Radiant, nous avons obtenu les informations suivantes à prendre en compte – pour chaque client, la configuration du logiciel avec les paramètres mentionnés ci-dessus entraînait le remplissage du fichier pacs.xml, qui se situait dans le profil utilisateur (chemin : %APPDATA%RadiantViewerpacs.xml). Cependant, la configuration d'un client différait d'un autre par au moins deux paramètres (le nom AE étant différent pour tous, et le port étant en général le même, sauf pour les clients terminaux travaillant sur le même serveur – là, les ports devaient également être assignés différemment).

Exemple de fichier pacs.xml selon le lien:

Pendant environ six mois, tout allait bien, le système fonctionnait… et nous avons alors découvert les «pièges sous-marins»:

  • Nous devons mettre en service plusieurs nouveaux serveurs PACS pour remplacer les anciens (où l'espace sur les disques a commencé à manquer). Les serveurs PACS se trouvent dans des machines virtuelles, mais ce n'est pas le sujet ;
  • Nous devons trouver un moyen de modifier de manière centralisée les configurations uniques (avec deux paramètres différents) sur 200 machines (leur nombre augmentait régulièrement) ;
  • Étant donné la rapidité de la croissance du volume des études, la solution doit être durable, pas ponctuelle, et récurrente (par exemple, une fois tous les 3 à 5 mois).

La solution ci-dessous.

Choix des outils pour résoudre la tâche

Au départ, nous avons tenté de trouver une solution qui, côté client, modifie le fichier pacs.xml et y apporte des modifications à la liste des serveurs PACS, sans toucher aux paramètres du nom AE et au port TCP. Les clients Windows à l'époque étaient basés à la fois sur Windows XP et Windows 7 – il y avait donc des tentatives d'écrire quelque chose basées sur VBScript. Mais hélas – je n'ai pas pu réaliser une telle tâche, en raison d'un manque total d'expérience dans l'écriture de quelque chose de complexe avec ce langage. Les tentatives de recherche et de réécriture n'ont également pas abouti (il convient de noter qu'un autre plan était déjà en tête, donc je n'ai pas passé plus de 3-4 heures sur VBScript).

Finalement, je me suis arrêté sur la solution suivante :

  • Rassembler tous les fichiers pacs.xml à un seul endroit sur n'importe quel serveur dans la ressource réseau;
  • Modifier les fichiers en masse (une expérience de résolution de telles tâches a déjà eu lieu – en utilisant Perl);
  • Mettre également à jour les paramètres des clients en utilisant des stratégies de groupe.

Collecte de fichiers à l'aide de la stratégie de groupe

La partie la plus simple – lorsqu'un client se connecte à son profil, il exécute un certain fichier .bat avec ses droits, dans lequel est écrit :

echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml

Ainsi, sur le serveur dans la ressource cachée, les fichiers pacs.xml s'accumuleront, dont le nom contient des informations sur lequel ordinateur et lequel utilisateur a copié cette configuration.

La partie la plus difficile a été d'attendre que cette politique fonctionne pour tous les utilisateurs.

Modification des configurations à l'aide d'un script Perl

Nous aurons besoin de Active Perl pour Windows de la société ActiveState, ainsi que du module XML::Writer, qui peut être installé avec la commande ppm install XML-Writer.

Le script lui-même s'est avéré assez simple :

use XML::Writer;
 
# Ouvrir le dossier avec les rapports, traiter la liste (supprimer les éléments inutiles):
	$report_dir = "C:Perl64WORKPACS-xml3";
	opendir(DIR, "$report_dir") or die "Impossible d'ouvrir le dossier avec les rapports !";
	@report_files = readdir DIR;
	shift (@report_files); # supprimer le point des éléments du tableau (.)
	shift (@report_files); # supprimer les deux points des éléments du tableau (..)
#	print "@report_files";
	closedir(DIR);
 
# Commencer à traiter les fichiers - un à la fois. Il faut lire le paramètre AET et le numéro de port dans des variables.
foreach $analiz_file (@report_files) 
{
	$full_path_to_file="C:Perl64WORKPACS-xml3".$analiz_file;
	open (INFO, $full_path_to_file);
 
	while ($line = )
	{
		# Les variables $aet et $port contiennent des données uniques pour chaque fichier XML:
		my ($other1, $aet, $other2, $port, $other3) = split /"/, $line, 5;
		# Si la ligne "listener" est rencontrée - nous avons atteint la ligne souhaitée et nous pouvons former un nouveau XML:
		if ($other1 =~ 'listener')
			{
				# Créer un nouveau XML avec les champs et données nécessaires:
				my $writer = XML::Writer->new(OUTPUT => 'self', DATA_MODE => 1, DATA_INDENT => 2);
				$writer->xmlDecl('utf-8');
				$writer->startTag('pacs');
				$writer->startTag('listener', ae => $aet, port => $port);
				$writer->endTag();
				$writer->startTag('hosts');
				$writer->startTag('host', name => 'MRT', ae => 'ORTHANC', ip => 'XX.YY.214.17', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0');
				$writer->endTag();
				$writer->startTag('host', name => 'KT', ae => 'ORTHANC2', ip => 'XX.YY.215.253', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0');
				$writer->endTag();
				$writer->startTag('host', name => 'R', ae => 'ORTHANC3', ip => 'XX.YY.215.252', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0');
				$writer->endTag();
				$writer->startTag('host', name => 'KT-20180501-20180831', ae => 'ORTHANC4', ip => 'XX.YY.215.251', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0');
				$writer->endTag();
				$writer->startTag('host', name => 'KT-20180901-20181130', ae => 'ORTHANC5', ip => 'XX.YY.215.250', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0');
				$writer->endTag();
				$writer->endTag('hosts');
				$writer->startTag('presets');
				$writer->endTag();
				$writer->startTag('lastsearch', dt => '4', mfid => '1048592');
				$writer->endTag();
				$writer->endTag('pacs');
 
				# Mettre le XML prêt dans une variable:
				my $xml = $writer->end();
				# Préparer le fichier pour réécriture:
				$rewritexml = $full_path_to_file;
				# Réécrire les fichiers XML avec les nouvelles données:
				open (NEWXML, "> $rewritexml");
				print NEWXML $xml;
				close (NEWXML);				
			}
	}
 
}

Le principe de son fonctionnement :

  • Nous ouvrons le répertoire dans lequel nous avons rassemblé les configurations pacs.xml des clients et plaçons la liste des fichiers dans un tableau de scalaires (@report_files);
  • Nous traitons chaque fichier un par un et le lisons ligne par ligne;
  • Nous découpons chaque ligne en 5 parties à l'aide de split, en utilisant des guillemets comme séparateur;
  • Nous recherchons la ligne contenant le mot listener et plaçons dans deux variables uniques pour chaque fichier les données (nom de client AE et numéro de port TCP);
  • Ensuite, nous formons simplement un nouveau fichier XML, y inscrivant les paramètres uniques et insérons ensuite le nombre nécessaire de serveurs PACS avec leurs paramètres – c'est-à-dire la raison pour laquelle tout cela a été mis en place)
  • Nous réécrivons le nouveau fichier XML par-dessus l'ancien.

Il convient de noter que je n'utilise pas réellement ce script de manière complètement automatique – en fait, je copie les configurations collectées dans un répertoire séparé puis j'exécute le script en modifiant l'ensemble. Ensuite, une vérification sélective – et les configurations peuvent être redistribuées aux machines.

Distribution des fichiers pacs.xml modifiés aux clients

La chose la plus simple qui m'est venue à l'esprit – apporter des modifications au fichier .bat déjà actif, qui collecte les configurations des clients et ajouter une ligne :

If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml

Le fichier .bat final ressemble à :

@echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml

Conclusion

Voici donc une «solution bricolée». Nous l'avons testé deux fois (en septembre 2018 et en février 2019), jusqu'à présent tout fonctionne normalement. Bien sûr, cela ne met pas à jour 100 % des clients, mais cela s'en rapproche — les autres, nous les terminons à distance. Le script a le lien.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster