Zmena nastavení programu pri ukladaní osobných parametrov

pravek

Jedna zdravotnícka organizácia implementovala riešenia založené na serveroch Orthanc PACS a klientovi Radiant DICOM. Počas nastavovania sme zistili, že každý DICOM klient musí byť na serveroch PACS opísaný takto:

  • Meno klienta
  • Názov AE (musí byť jedinečný)
  • TCP port, ktorý sa automaticky otvára na strane klienta a prijíma prieskumy DICOM zo servera PACS (t. j. server ich posúva smerom ku klientovi – najprv iniciuje pripojenie)
  • IP adresa

Po nastavení Radiantu dostali klienti nasledujúce podnety na zamyslenie: pre každého klienta nastavenie softvéru s vyššie uvedenými parametrami viedlo k vyplneniu súboru pacs.xml, ktorý sa nachádzal v používateľskom profile (cesta: %APPDATA%RadiantViewerpacs.xml). Zároveň sa konfigurácia jedného klienta od druhého líšila minimálne v dvoch parametroch (názov AE je pre každého iný a port je v podstate rovnaký, okrem terminálových klientov bežiacich na rovnakom serveri - tam mali porty tiež byť pridelené iné).

Príklad súboru pacs.xml od odkaz:

Asi šesť mesiacov bolo všetko v poriadku, systém začal fungovať... a potom nám to prišlo “podvodné kamene»:

  • Potrebujeme uviesť do prevádzky niekoľko nových PACS serverov, ktoré nahradia tie staré (kde sa začalo míňať miesto na disku). servery PACS vo virtuálnych strojoch, ale o tom nehovoríme;
  • Potrebujeme nejako centrálne zmeniť jedinečné konfigurácie (s dvoma rôznymi parametrami) na 200 strojoch (ich počet sa pravidelne zvyšoval);
  • Vzhľadom na tempo rastu objemov prieskumov je potrebné riešenie nielen raz, ale opakovane a pravidelne (napríklad raz za 1-3 mesiacov).

Riešenie je uvedené nižšie.

Výber nástrojov na vyriešenie problému

Najprv boli pokusy nájsť nejaké riešenie, ktoré by upravilo súbor pacs.xml na strane klienta a vykonalo zmeny v zozname serverov PACS bez ovplyvnenia názvu AE a nastavenia portu TCP. Klienti Windows v tej dobe boli založené na Windows XP aj Windows 7 - takže boli pokusy napísať niečo také na základe VBScript. Bohužiaľ, nebolo možné zvládnuť takúto úlohu kvôli úplnému nedostatku skúseností s písaním čohokoľvek zložitého a zložitého v tomto jazyku. Pokusy o nájdenie a prepísanie boli tiež neúspešné (treba podotknúť, že som už mal v hlave iný plán, takže som sa s VBScriptom nehrabal dlhšie ako 3-4 hodiny).

Nakoniec som sa rozhodol pre nasledujúce riešenie:

  • Pomocou skupinovej politiky zhromaždite všetky súbory pacs.xml na jednom mieste na ľubovoľnom serveri v sieťovom prostriedku;
  • Hromadne meniť súbory (už som mal skúsenosti s riešením takýchto problémov pomocou Perlu);
  • Na aktualizáciu nastavení klienta použite aj skupinové zásady.

Zhromažďovanie súborov pomocou skupinovej politiky

Najjednoduchšia časť je, že keď sa klient prihlási do svojho profilu, so svojimi právami spustí určitý súbor .bat, ktorý hovorí:

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

Súbory pacs.xml sa teda budú hromadiť na serveri v skrytom zdroji, ktorého názov obsahuje informácie, z ktorého počítača a od ktorého používateľa bola táto konfigurácia skopírovaná.

Najťažšie bolo počkať, kým táto politika nebude fungovať pre všetkých používateľov.

Zmena konfigurácií pomocou skriptu Perl

Budeme potrebovať Aktívny Perl pre Windows od ActiveState, ako aj modul XML::Writer, ktorý je možné nainštalovať pomocou príkazu ppm nainštalovať XML-Writer.

Samotný skript sa ukázal byť celkom jednoduchý:

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

Princíp jeho fungovania:

  • Otvoríme adresár, v ktorom sme zhromaždili konfigurácie pacs.xml od klientov a umiestnime zoznam súborov do poľa skalárov (@report_files);
  • V slučke spracovávame jeden súbor po druhom a čítame ho riadok po riadku;
  • Pomocou rozdelenia rozdelíme každý riadok na 5 častí, pričom ako oddeľovač použijeme úvodzovky;
  • Nájdeme riadok so slovom poslucháč a údaje jedinečné pre každý súbor (názov klienta AE a číslo portu TCP) umiestnime do dvoch premenných;
  • Potom jednoducho vytvoríme nový XML súbor, zadáme doň unikátne parametre a následne vložíme požadovaný počet PACS serverov s ich parametrami - tie. čím to všetko začalo)
  • Nový súbor XML prepíšeme na starý súbor.

Treba si uvedomiť, že v skutočnosti tento skript nepoužívam úplne automaticky – v skutočnosti skopírujem zozbierané konfigurácie do samostatného adresára a následne skript spustím a všetky hromadne zmením. Ďalej náhodná kontrola - a konfigurácie môžu byť distribuované späť do počítačov.

Distribúcia upravených súborov pacs.xml klientom

Najjednoduchšia vec, ktorá ma napadla, bolo vykonať zmeny v už fungujúcom súbore .bat, ktorý zhromažďuje konfigurácie od klientov, a pridať riadok:

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

Výsledný súbor .bat vyzerá takto:

@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

Záver

Je to takto"koleno" Riešenie. Skúšali sme to už dvakrát (v septembri 2018 a februári 2019), zatiaľ je let normálny. Samozrejme, nie 100 % klientov sa aktualizuje, ale k tejto hodnote sa to blíži – zvyšok dotvárame na diaľku. Autor scenára odkaz.

Zdroj: hab.com

Pridať komentár