Spreminjanje nastavitev programa ob shranjevanju osebnih parametrov

prazgodovina

Ena zdravstvena organizacija je implementirala rešitve, ki temeljijo na strežnikih Orthanc PACS in odjemalcu Radiant DICOM. Med namestitvijo smo ugotovili, da mora biti vsak odjemalec DICOM opisan v strežnikih PACS na naslednji način:

  • Ime stranke
  • Ime AE (mora biti edinstveno)
  • Vrata TCP, ki se samodejno odprejo na strani odjemalca in prejmejo ankete DICOM s strežnika PACS (tj. strežnik jih potisne k odjemalcu – najprej vzpostavi povezavo)
  • IP naslov

Po nastavitvi Radianta so odjemalci prejeli naslednjo snov za razmislek: za vsakega odjemalca je nastavitev programske opreme z zgornjimi parametri povzročila izpolnitev datoteke pacs.xml, ki se nahaja v uporabniškem profilu (pot: %APPDATA%RadiantViewerpacs.xml). Hkrati se je konfiguracija enega odjemalca razlikovala od drugega v vsaj dveh parametrih (ime AE je za vse drugačno, vrata pa so v bistvu enaka, razen pri terminalskih odjemalcih, ki delujejo na istem strežniku - tam so imela tudi vrata biti dodeljen drugače).

Primer datoteke pacs.xml avtorja povezava:

Kakšnih šest mesecev je bilo vse v redu, sistem je začel delovati ... potem pa je prišel do nas "pod vodo kamni»:

  • Zagnati moramo več novih PACS strežnikov, ki bodo nadomestili stare (kjer je začelo zmanjkovati prostora na disku). strežniki PACS v virtualnih strojih, vendar ne govorimo o tem;
  • Nekako moramo centralno spremeniti edinstvene konfiguracije (z dvema različnima parametroma) na 200 strojih (njihovo število se je redno povečevalo);
  • Glede na hitrost rasti obsega ankete rešitev ni potrebna le enkrat, ampak ponovljena in redno (na primer enkrat na 1-3 mesecev).

Rešitev je spodaj.

Izbira orodij za rešitev problema

Sprva so bili poskusi najti neko rešitev, ki bi spremenila datoteko pacs.xml na strani odjemalca in spremenila seznam strežnikov PACS, ne da bi vplivala na ime AE in nastavitve vrat TCP. Windows odjemalci so takrat temeljili na Windows XP in Windows 7 - zato so bili poskusi napisati nekaj takega na podlagi VBScript. A žal, takšne naloge ni bilo mogoče obvladati zaradi popolnega pomanjkanja izkušenj pri pisanju česar koli zapletenega in zapletenega v tem jeziku. Tudi poskusi iskanja in prepisovanja so bili neuspešni (naj povem, da sem imel v glavi že drugačen načrt, zato se z VBScriptom nisem ukvarjal več kot 3-4 ure).

Na koncu sem se odločil za naslednjo rešitev:

  • Z uporabo pravilnika skupine zberite vse datoteke pacs.xml na enem mestu na katerem koli strežniku v omrežnem viru;
  • Množično spreminjajte datoteke (že sem imel izkušnje z reševanjem takšnih težav s Perlom);
  • Za posodobitev nastavitev odjemalca uporabite tudi pravilnike skupine.

Zbiranje datotek s pravilnikom skupine

Najenostavneje je, da ko se stranka prijavi v svoj profil, s svojimi pravicami zažene določeno datoteko .bat, ki pravi:

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

Tako se bodo datoteke pacs.xml kopičile na strežniku v skritem viru, katerega ime vsebuje podatke, iz katerega računalnika in od katerega uporabnika je bila ta konfiguracija kopirana.

Najtežje je bilo čakati, da ta politika deluje za vse uporabnike.

Spreminjanje konfiguracij z uporabo skripta Perl

Potrebovali bomo Aktivni Perl za Windows iz ActiveState, kot tudi modul XML::Writer, ki ga je mogoče namestiti z ukazom ppm namestite XML-Writer.

Sam scenarij se je izkazal za precej preprostega:

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

Načelo njegovega delovanja:

  • Odpremo imenik, v katerem smo zbrali konfiguracije pacs.xml od odjemalcev, in seznam datotek postavimo v matriko skalarjev (@report_files);
  • V zanki obdelujemo eno datoteko naenkrat in jo beremo vrstico za vrstico;
  • Z uporabo split vsako vrstico razdelimo na 5 delov, pri čemer uporabimo narekovaje kot ločilo;
  • Poiščemo vrstico z besedo poslušalec in postavimo edinstvene podatke za vsako datoteko (ime odjemalca AE in številko vrat TCP) v dve spremenljivki;
  • Po tem preprosto ustvarimo novo datoteko XML, vanjo vnesemo edinstvene parametre in nato vstavimo zahtevano število strežnikov PACS z njihovimi parametri - tiste. za kaj se je vse začelo)
  • Novo XML datoteko prepišemo na staro.

Treba je poudariti, da dejansko tega skripta ne uporabljam popolnoma avtomatsko - v resnici zbrane konfiguracije kopiram v ločen imenik in nato poženem skript in jih vse množično spreminjam. Nato sledi naključno preverjanje - in konfiguracije se lahko razdelijo nazaj na stroje.

Distribucija spremenjenih datotek pacs.xml strankam

Najenostavnejša stvar, ki mi je prišla na misel, je bila sprememba že delujoče datoteke .bat, ki zbira konfiguracije strank, in dodajanje vrstice:

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

Končna datoteka .bat je videti takole:

@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

Zaključek

Takole je"koleno"rešitev. Dvakrat smo že poskusili (septembra 2018 in februarja 2019), zaenkrat let poteka normalno. Seveda ne posodablja 100% odjemalcev, vendar je blizu te vrednosti - ostalo opravimo na daljavo. Avtor scenarija povezava.

Vir: www.habr.com

Dodaj komentar