Programmeinstellungen ändern und gleichzeitig persönliche Parameter speichern

Vorgeschichte

Eine medizinische Organisation implementierte Lösungen basierend auf Orthanc PACS-Servern und dem Radiant DICOM-Client. Beim Setup haben wir herausgefunden, dass jeder DICOM-Client in PACS-Servern wie folgt beschrieben werden muss:

  • Kundenname
  • AE-Name (muss eindeutig sein)
  • Ein TCP-Port, der sich automatisch auf der Clientseite öffnet und DICOM-Umfragen vom PACS-Server empfängt (d. h. der Server leitet sie an den Client weiter – wobei er zuerst die Verbindung initiiert)
  • IP-Adresse

Nach der Einrichtung von Radiant erhielten die Kunden folgende Denkanstöße: Bei jedem Kunden führte die Einrichtung der Software mit den oben genannten Parametern dazu, dass die Datei gefüllt wurde pacs.xml, die sich im Benutzerprofil befand (Pfad: %APPDATA%RadiantViewerpacs.xml). Gleichzeitig unterschied sich die Konfiguration eines Clients in mindestens zwei Parametern von der eines anderen (der AE-Name ist für jeden unterschiedlich und der Port ist im Grunde derselbe, mit Ausnahme von Terminal-Clients, die auf demselben Server laufen – dort hatten die Ports auch). unterschiedlich zuzuordnen).

Beispieldatei pacs.xml von Link:

Etwa sechs Monate lang war alles in Ordnung, das System fing an zu funktionieren... und dann kam es zu uns“unter Wasser Steine»:

  • Wir müssen mehrere neue PACS-Server in Betrieb nehmen, die die alten ersetzen (wo der Speicherplatz knapp wird). PACS-Server in virtuellen Maschinen, aber das ist nicht das, worüber wir reden;
  • Wir müssen eindeutige Konfigurationen (mit zwei verschiedenen Parametern) auf 200 Maschinen (deren Zahl regelmäßig zunimmt) irgendwie zentral ändern;
  • Angesichts der Wachstumsrate des Umfragevolumens ist eine Lösung erforderlich, die nicht nur einmal, sondern regelmäßig repliziert werden muss (z. B. einmal alle 1–3 Monate).

Die Lösung finden Sie unten.

Auswahl von Werkzeugen zur Lösung eines Problems

Zunächst gab es Versuche, eine Lösung zu finden, die die Datei pacs.xml auf der Clientseite ändert und Änderungen an der Liste der PACS-Server vornimmt, ohne den AE-Namen und die TCP-Porteinstellungen zu beeinträchtigen. Windows-Clients basierten damals sowohl auf Windows XP als auch auf Windows 7 – daher gab es Versuche, so etwas auf Basis von VBScript zu schreiben. Aber leider war es nicht möglich, eine solche Aufgabe zu meistern, da es an Erfahrung im Schreiben komplexer und komplexer Dinge in dieser Sprache mangelte. Versuche, es zu finden und umzuschreiben, blieben ebenfalls erfolglos (anzumerken ist, dass ich bereits einen anderen Plan im Kopf hatte, sodass ich nicht länger als 3-4 Stunden mit VBScript herumgespielt habe).

Am Ende habe ich mich für folgende Lösung entschieden:

  • Sammeln Sie mithilfe von Gruppenrichtlinien alle pacs.xml-Dateien an einem Ort auf einem beliebigen Server in einer Netzwerkressource.
  • Dateien massenhaft ändern (ich hatte bereits Erfahrung mit der Lösung solcher Probleme mit Perl);
  • Verwenden Sie auch Gruppenrichtlinien, um Client-Einstellungen zu aktualisieren.

Sammeln von Dateien mithilfe von Gruppenrichtlinien

Der einfachste Teil besteht darin, dass ein Kunde, wenn er sich in sein Profil einloggt, mit seinen Rechten eine bestimmte .bat-Datei ausführt, die besagt:

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

Somit sammeln sich pacs.xml-Dateien auf dem Server in einer versteckten Ressource an, deren Name Informationen enthält, von welchem ​​Computer und von welchem ​​Benutzer diese Konfiguration kopiert wurde.

Am schwierigsten war es zu warten, bis diese Richtlinie für alle Benutzer funktionierte.

Konfigurationen mit einem Perl-Skript ändern

Wir brauchen Aktives Perl für Windows von ActiveState, sowie das Modul XML::Writer, das mit dem Befehl installiert werden kann ppm XML-Writer installieren.

Das Skript selbst erwies sich als recht einfach:

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);				
			}
	}
 
}

Das Funktionsprinzip:

  • Wir öffnen das Verzeichnis, in dem wir pacs.xml-Konfigurationen von Clients gesammelt haben, und platzieren die Liste der Dateien in einem Array von Skalaren (@report_files);
  • In einer Schleife verarbeiten wir jeweils eine Datei und lesen sie Zeile für Zeile;
  • Mit „split“ teilen wir jede Zeile in fünf Teile auf und verwenden dabei Anführungszeichen als Trennzeichen.
  • Wir finden eine Zeile mit dem Wort Listener und platzieren für jede Datei eindeutige Daten (AE-Clientname und TCP-Portnummer) in zwei Variablen;
  • Danach erstellen wir einfach eine neue XML-Datei, geben darin eindeutige Parameter ein und fügen dann die erforderliche Anzahl an PACS-Servern mit ihren Parametern ein – diese. wofür alles begann)
  • Wir schreiben die neue XML-Datei über die alte neu.

Es sollte beachtet werden, dass ich dieses Skript tatsächlich nicht vollständig automatisch verwende. Tatsächlich kopiere ich die gesammelten Konfigurationen in ein separates Verzeichnis, führe dann das Skript aus und ändere sie alle massenhaft. Als nächstes erfolgt eine Stichprobenprüfung – und die Konfigurationen können wieder an die Maschinen verteilt werden.

Verteilen geänderter pacs.xml-Dateien an Clients

Das einfachste, was mir in den Sinn kam, war, Änderungen an der bereits funktionierenden .bat-Datei vorzunehmen, die Konfigurationen von Clients sammelt, und die Zeile hinzuzufügen:

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

Die endgültige .bat-Datei sieht folgendermaßen aus:

@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

Abschluss

Es ist so“Knie" Lösung. Wir haben es bereits zweimal ausprobiert (im September 2018 und Februar 2019), bisher verläuft der Flug normal. Natürlich werden nicht 100 % der Clients aktualisiert, aber es liegt nahe an diesem Wert – den Rest erledigen wir aus der Ferne. Drehbuch von Link.

Source: habr.com

Kommentar hinzufügen