Modification des paramètres du programme tout en enregistrant les paramètres personnels

Préhistoire

Une organisation médicale a mis en œuvre des solutions basées sur les serveurs Orthanc PACS et le client Radiant DICOM. Lors de l'installation, nous avons découvert que chaque client DICOM doit être décrit dans les serveurs PACS comme suit :

  • Nom du client
  • Nom AE (doit être unique)
  • Un port TCP qui s'ouvre automatiquement côté client et reçoit les enquêtes DICOM du serveur PACS (c'est-à-dire que le serveur les pousse vers le client - initiant d'abord la connexion)
  • Adresse IP

Après avoir configuré Radiant, les clients ont reçu les éléments de réflexion suivants : pour chaque client, la configuration du logiciel avec les paramètres ci-dessus a entraîné le remplissage du fichier. pacs.xml, qui se trouvait dans le profil utilisateur (chemin : %APPDATA%RadiantViewerpacs.xml). Dans le même temps, la configuration d'un client différait d'un autre par au moins deux paramètres (le nom AE est différent pour tout le monde et le port est fondamentalement le même, à l'exception des clients terminaux exécutés sur le même serveur - là, les ports avaient également être attribué différemment).

Exemple de fichier pacs.xml par lien:

Pendant environ six mois, tout allait bien, le système a commencé à fonctionner... et puis il nous est venu »sous l'eau noyaux»:

  • Nous devons mettre en service plusieurs nouveaux serveurs PACS qui remplaceront les anciens (où l'espace disque commence à manquer). Des serveurs PACS dans des machines virtuelles, mais ce n’est pas de cela dont nous parlons ;
  • Nous devons d'une manière ou d'une autre modifier de manière centralisée des configurations uniques (avec deux paramètres différents) sur 200 machines (leur nombre augmentait régulièrement) ;
  • Compte tenu du taux de croissance des volumes d'enquêtes, une solution est nécessaire non seulement une fois, mais répliquée et régulièrement (par exemple, une fois tous les 1 à 3 mois).

La solution est ci-dessous.

Choisir des outils pour résoudre un problème

Au début, il y a eu des tentatives pour trouver une solution permettant de modifier le fichier pacs.xml côté client et d'apporter des modifications à la liste des serveurs PACS sans affecter le nom AE et les paramètres du port TCP. À cette époque, les clients Windows étaient basés à la fois sur Windows XP et Windows 7. Il y a donc eu des tentatives pour écrire quelque chose comme ceci basé sur VBScript. Mais hélas, il n’a pas été possible de maîtriser une telle tâche en raison du manque total d’expérience dans l’écriture de quelque chose de complexe et complet dans cette langue. Les tentatives de recherche et de réécriture ont également échoué (il convient de noter que j'avais déjà un plan différent en tête, donc je n'ai pas manipulé VBScript pendant plus de 3-4 heures).

Au final j'ai opté pour la solution suivante :

  • À l'aide de la stratégie de groupe, collectez tous les fichiers pacs.xml en un seul endroit sur n'importe quel serveur d'une ressource réseau ;
  • Modifier des fichiers en masse (j'avais déjà de l'expérience dans la résolution de tels problèmes en utilisant Perl) ;
  • Utilisez également les stratégies de groupe pour mettre à jour les paramètres du client.

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

Le plus simple est que lorsqu'un client se connecte à son profil, il exécute, avec ses droits, un certain fichier .bat, qui dit :

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

Ainsi, les fichiers pacs.xml s'accumuleront sur le serveur dans une ressource cachée dont le nom contient des informations à partir de quel ordinateur et de quel utilisateur cette configuration a été copiée.

Le plus difficile était d’attendre que cette politique fonctionne pour tous les utilisateurs.

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

Nous aurons besoin Perl actif pour Windows depuis ActiveState, ainsi que le module XML::Writer, qui peut être installé à l'aide de la commande ppm installer XML-Writer.

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

use XML::Writer;
 
# Открываем папку с отчетами, обрабатываем ссписок (удаляем лишнее):
	$report_dir = "C:Perl64WORKPACS-xml3";
	opendir(DIR, "$report_dir") or die "Не могу открыть папку с отчетами!";
	@report_files = readdir DIR;
	shift (@report_files); # удаляем точку из элементов массива (.)
	shift (@report_files); # удаляем две точки из элементов массива (..)
#	print "@report_files";
	closedir(DIR);
 
# Начинаем обрабатывать файлы - по одному за раз. Нужно считать параметр AET и номер порта в переменные.
foreach $analiz_file (@report_files) 
{
	$full_path_to_file="C:Perl64WORKPACS-xml3".$analiz_file;
	open (INFO, $full_path_to_file);
 
	while ($line = <INFO>)
	{
		# Переменные $aet и $port содержат уникальные данные для каждого XML файла:
		my ($other1, $aet, $other2, $port, $other3) = split /"/, $line, 5;
		# Если встречается строка listener - то мы дошли до нужной строчки и можно формировать новый XML:
		if ($other1 =~ 'listener')
			{
				# Формируем новый XML c нужными полями и данными:
				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');
 
				# Помещаем готовый XML в переменную:
				my $xml = $writer->end();
				# Подготавливаем файл для перезаписи:
				$rewritexml = $full_path_to_file;
				# Переписываем XML файлы новыми данными:
				open (NEWXML, ">$rewritexml");
				print NEWXML $xml;
				close (NEWXML);				
			}
	}
 
}

Le principe de son fonctionnement :

  • Nous ouvrons le répertoire dans lequel nous avons collecté les configurations pacs.xml des clients et plaçons la liste des fichiers dans un tableau de scalaires (@report_files) ;
  • Dans une boucle, nous traitons un fichier à la fois et le lisons ligne par ligne ;
  • En utilisant split, nous divisons chaque ligne en 5 parties, en utilisant des guillemets comme séparateur ;
  • Nous trouvons une ligne avec le mot écouteur et plaçons les données uniques pour chaque fichier (nom du client AE et numéro de port TCP) dans deux variables ;
  • Après cela, nous générons simplement un nouveau fichier XML, y entrons des paramètres uniques, puis insérons le nombre requis de serveurs PACS avec leurs paramètres - ceux. pourquoi tout a commencé)
  • Nous réécrivons le nouveau fichier XML par-dessus l'ancien.

Il convient de noter qu'en fait, je n'utilise pas ce script de manière entièrement automatique - en fait, je copie les configurations collectées dans un répertoire séparé, puis j'exécute le script et je les modifie toutes en masse. Ensuite, une vérification aléatoire – 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 était d'apporter des modifications au fichier .bat déjà fonctionnel qui collecte les configurations des clients et d'ajouter la ligne :

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

Le fichier .bat final ressemble à ceci :

@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

C'est comme ça "genou" solution. Nous l'avons déjà essayé deux fois (en septembre 2018 et février 2019), pour l'instant le vol est normal. Bien sûr, 100 % des clients ne mettent pas à jour, mais cette valeur est proche - nous complétons le reste à distance. Scénario par lien.

Source: habr.com

Ajouter un commentaire