Ändra programinställningar samtidigt som personliga parametrar sparas

förhistoria

En medicinsk organisation implementerade lösningar baserade på Orthanc PACS-servrar och Radiant DICOM-klient. Under installationen fick vi reda på att varje DICOM-klient måste beskrivas i PACS-servrar enligt följande:

  • Kundnamn
  • AE-namn (måste vara unikt)
  • En TCP-port som automatiskt öppnas på klientsidan och tar emot DICOM-undersökningar från PACS-servern (dvs servern skjuter dem mot klienten - initierar anslutningen först)
  • IP-adress

Efter att ha ställt in Radiant fick kunderna följande tankeställare: för varje klient resulterade inställning av programvaran med ovanstående parametrar i att filen fylldes i pacs.xml, som fanns i användarprofilen (sökväg: %APPDATA%RadiantViewerpacs.xml). Samtidigt skiljde sig konfigurationen för en klient från en annan på minst två parametrar (AE-namnet är olika för alla, och porten är i princip densamma, förutom terminalklienter som körs på samma server - där hade portarna också tilldelas olika).

Exempel pacs.xml-fil av länk:

I ungefär ett halvår var allt bra, systemet började fungera... och sedan kom det till oss "undervattens- stenar»:

  • Vi behöver sätta i drift flera nya PACS-servrar som kommer att ersätta de gamla (där diskutrymmet har börjat ta slut). PACS-servrar i virtuella maskiner, men det är inte vad vi pratar om;
  • Vi måste på något sätt centralt ändra unika konfigurationer (med två olika parametrar) på 200 maskiner (deras antal ökade regelbundet);
  • Med tanke på ökningstakten för undersökningsvolymer behövs en lösning inte bara en gång, utan replikeras och regelbundet (till exempel en gång var 1-3 månad).

Lösningen finns nedan.

Att välja verktyg för att lösa ett problem

Först gjordes försök att hitta någon lösning som skulle ändra pacs.xml-filen på klientsidan och göra ändringar i listan över PACS-servrar utan att påverka AE-namnet och TCP-portinställningarna. Windows-klienter på den tiden var baserade på både Windows XP och Windows 7 - så det gjordes försök att skriva något liknande baserat på VBScript. Men tyvärr var det inte möjligt att bemästra en sådan uppgift, på grund av den totala bristen på erfarenhet av att skriva något komplext och komplext på detta språk. Försök att hitta och skriva om var också misslyckade (det bör noteras att jag redan hade en annan plan i mitt huvud, så jag pillade inte med VBScript i mer än 3-4 timmar).

Till slut bestämde jag mig för följande lösning:

  • Med hjälp av grupppolicy, samla alla pacs.xml-filer på ett ställe på valfri server i en nätverksresurs;
  • Ändra filer en masse (jag hade redan erfarenhet av att lösa sådana problem med Perl);
  • Använd även grupppolicyer för att uppdatera klientinställningar.

Samla filer med hjälp av gruppolicy

Det enklaste är att när en klient loggar in på sin profil, kör han, med sina rättigheter, en viss .bat-fil, som säger:

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

Således kommer pacs.xml-filer att samlas på servern i en dold resurs, vars namn innehåller information från vilken dator och från vilken användare denna konfiguration kopierades.

Det svåraste var att vänta tills denna policy fungerade för alla användare.

Ändra konfigurationer med ett Perl-skript

Vi kommer att behöva Aktiv Perl för Windows från ActiveState, samt XML::Writer-modulen, som kan installeras med kommandot ppm installera XML-Writer.

Själva skriptet visade sig vara ganska enkelt:

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

Principen för dess funktion:

  • Vi öppnar katalogen där vi har samlat pacs.xml-konfigurationer från klienter och placerar listan med filer i en array av skalärer (@report_files);
  • I en loop bearbetar vi en fil i taget och läser den rad för rad;
  • Genom att använda split delar vi upp varje rad i 5 delar, med citattecken som avgränsare;
  • Vi hittar en rad med ordet lyssnare och placerar data unik för varje fil (AE-klientnamn och TCP-portnummer) i två variabler;
  • Efter detta skapar vi helt enkelt en ny XML-fil, anger unika parametrar i den och infogar sedan det erforderliga antalet PACS-servrar med deras parametrar - de där. vad det hela började för)
  • Vi skriver om den nya XML-filen ovanpå den gamla.

Det bör noteras att jag faktiskt inte använder det här skriptet helt automatiskt - i själva verket kopierar jag de insamlade konfigurationerna till en separat katalog och kör sedan skriptet och ändrar dem alla en masse. Därefter en slumpmässig kontroll - och konfigurationerna kan distribueras tillbaka till maskinerna.

Distribuera modifierade pacs.xml-filer till klienter

Det enklaste som kom att tänka på var att göra ändringar i den redan fungerande .bat-filen som samlar in konfigurationer från klienter och lägga till raden:

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

Den sista .bat-filen ser ut så här:

@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

Slutsats

Det är så här "knä"lösning. Vi har redan provat det två gånger (i september 2018 och februari 2019), än så länge är flygningen normalt. Naturligtvis uppdaterar inte 100 % av klienterna, men det är nära detta värde - vi slutför resten på distans. Manus av länk.

Källa: will.com

Lägg en kommentar