Ændring af programindstillinger, mens personlige parametre gemmes

forhistorie

En medicinsk organisation implementerede løsninger baseret på Orthanc PACS-servere og Radiant DICOM-klient. Under opsætningen fandt vi ud af, at hver DICOM-klient skal beskrives i PACS-servere som følger:

  • Kundenavn
  • AE-navn (skal være unikt)
  • En TCP-port, der automatisk åbner på klientsiden og modtager DICOM-undersøgelser fra PACS-serveren (dvs. serveren skubber dem mod klienten - starter forbindelsen først)
  • IP-adresse

Efter opsætning af Radiant fik kunderne følgende stof til eftertanke: For hver klient resulterede opsætning af softwaren med ovenstående parametre i, at filen blev udfyldt pacs.xml, som var placeret i brugerprofilen (sti: %APPDATA%RadiantViewerpacs.xml). Samtidig adskilte konfigurationen af ​​en klient sig fra en anden på mindst to parametre (AE-navnet er forskelligt for alle, og porten er stort set den samme, bortset fra terminalklienter, der kører på den samme server - der havde portene også skal tildeles anderledes).

Eksempel pacs.xml fil af link:

I omkring seks måneder var alt fint, systemet begyndte at fungere... og så kom det til os "undersøiske sten»:

  • Vi skal sætte flere nye PACS-servere i drift, som skal erstatte de gamle (hvor diskplads er begyndt at løbe tør). PACS-servere i virtuelle maskiner, men det er ikke det, vi taler om;
  • Vi skal på en eller anden måde centralt ændre unikke konfigurationer (med to forskellige parametre) på 200 maskiner (deres antal var jævnligt stigende);
  • I betragtning af vækstraten for undersøgelsesvolumener er der behov for en løsning, ikke bare én gang, men replikeres og regelmæssigt (for eksempel én gang hver 1.-3. måned).

Løsningen er nedenfor.

Valg af værktøjer til at løse et problem

Først var der forsøg på at finde en løsning, der kunne ændre pacs.xml-filen på klientsiden og foretage ændringer i listen over PACS-servere uden at påvirke AE-navnet og TCP-portindstillingerne. Windows-klienter på det tidspunkt var baseret på både Windows XP og Windows 7 - så der var forsøg på at skrive sådan noget baseret på VBScript. Men desværre var det ikke muligt at mestre en sådan opgave på grund af den fuldstændige mangel på erfaring med at skrive noget komplekst og omfattende på dette sprog. Forsøg på at finde og omskrive var også mislykkede (det skal bemærkes, at jeg allerede havde en anden plan i mit hoved, så jeg fik ikke rodet med VBScript i mere end 3-4 timer).

Til sidst besluttede jeg mig for følgende løsning:

  • Brug gruppepolitik til at samle alle pacs.xml-filer på ét sted på enhver server i en netværksressource;
  • Skift filer i massevis (jeg havde allerede erfaring med at løse sådanne problemer ved hjælp af Perl);
  • Brug også gruppepolitikker til at opdatere klientindstillinger.

Indsamling af filer ved hjælp af gruppepolitik

Den enkleste del er, at når en klient logger på sin profil, udfører han med sine rettigheder en bestemt .bat-fil, som siger:

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

Således vil pacs.xml-filer akkumuleres på serveren i en skjult ressource, hvis navn indeholder information fra hvilken computer og fra hvilken bruger denne konfiguration blev kopieret.

Det sværeste var at vente, indtil denne politik virkede for alle brugere.

Ændring af konfigurationer ved hjælp af et Perl-script

Vi får brug for Aktiv Perl til Windows fra ActiveState, samt XML::Writer-modulet, som kan installeres ved hjælp af kommandoen ppm installere XML-Writer.

Selve scriptet viste sig at være ret simpelt:

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

Princippet om dets funktion:

  • Vi åbner mappen, hvori vi har indsamlet pacs.xml-konfigurationer fra klienter og placerer listen over filer i en række skalarer (@report_files);
  • I en loop behandler vi én fil ad gangen og læser den linje for linje;
  • Ved at bruge split opdeler vi hver linje i 5 dele, ved at bruge anførselstegn som en separator;
  • Vi finder en linje med ordet lytter og placerer data unikke for hver fil (AE-klientnavn og TCP-portnummer) i to variable;
  • Herefter genererer vi simpelthen en ny XML-fil, indtaster unikke parametre i den og indsætter derefter det nødvendige antal PACS-servere med deres parametre - de der. hvad det hele startede for)
  • Vi omskriver den nye XML-fil oven på den gamle.

Det skal bemærkes, at jeg faktisk ikke bruger dette script helt automatisk - faktisk kopierer jeg de indsamlede konfigurationer til en separat mappe og kører derefter scriptet og ændrer dem alle i massevis. Dernæst et tilfældigt tjek - og konfigurationerne kan distribueres tilbage til maskinerne.

Distribution af modificerede pacs.xml-filer til klienter

Den enkleste ting, der kom til at tænke på, var at foretage ændringer i den allerede fungerende .bat-fil, der indsamler konfigurationer fra klienter og tilføje linjen:

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

Den endelige .bat-fil ser sådan ud:

@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

Konklusion

Det er sådan her"knæ" løsning. Vi har allerede prøvet det to gange (i september 2018 og februar 2019), indtil videre er flyvningen normal. Selvfølgelig opdaterer ikke 100% af klienterne, men det er tæt på denne værdi - vi fuldfører resten eksternt. Manuskript af link.

Kilde: www.habr.com

Tilføj en kommentar