Promjena postavki programa uz spremanje osobnih parametara

prapovijest

Jedna medicinska organizacija implementirala je rješenja temeljena na Orthanc PACS poslužiteljima i Radiant DICOM klijentu. Tijekom postavljanja saznali smo da svaki DICOM klijent mora biti opisan u PACS poslužiteljima na sljedeći način:

  • Ime klijenta
  • AE naziv (mora biti jedinstven)
  • TCP priključak koji se automatski otvara na strani klijenta i prima DICOM ankete od PACS poslužitelja (tj. poslužitelj ih gura prema klijentu - prvo započinje vezu)
  • IP adresa

Nakon postavljanja Radianta, klijenti su dobili sljedeću temu za razmišljanje: za svakog klijenta, postavljanje softvera s gornjim parametrima rezultiralo je popunjavanjem datoteke pacs.xml, koji se nalazio u korisničkom profilu (put: %APPDATA%RadiantViewerpacs.xml). U isto vrijeme, konfiguracija jednog klijenta razlikovala se od druge u najmanje dva parametra (naziv AE je različit za sve, a port je u osnovi isti, osim za terminal klijente koji rade na istom poslužitelju - tamo su portovi također imali biti dodijeljen drugačiji).

Primjer pacs.xml datoteke autora link:

Nekih šest mjeseci sve je bilo u redu, sustav je proradio... a onda je došao do nas”pod vodom kamenje'

  • Moramo pustiti u rad nekoliko novih PACS servera koji će zamijeniti stare (na kojima je počelo ponestajati prostora na disku). PACS poslužitelji u virtualnim strojevima, ali to nije ono o čemu govorimo;
  • Moramo nekako centralno promijeniti jedinstvene konfiguracije (s dva različita parametra) na 200 strojeva (njihov broj se redovno povećavao);
  • S obzirom na stopu rasta volumena istraživanja, rješenje nije potrebno samo jednom, već replicirano i redovito (na primjer, jednom u 1-3 mjeseci).

Rješenje je ispod.

Odabir alata za rješavanje problema

U početku je bilo pokušaja da se pronađe neko rješenje koje bi modificiralo datoteku pacs.xml na strani klijenta i izvršilo izmjene na popisu PACS poslužitelja bez utjecaja na AE naziv i postavke TCP porta. Windows klijenti su u to vrijeme bili bazirani i na Windows XP i na Windows 7 - pa je bilo pokušaja da se ovako nešto napiše na temelju VBScripta. Ali nažalost, nije bilo moguće svladati takav zadatak, zbog potpunog nedostatka iskustva u pisanju bilo čega složenog i sveobuhvatnog na ovom jeziku. Pokušaji pronalaska i prepisivanja također su bili neuspješni (treba napomenuti da sam već imao drugačiji plan u glavi, pa nisam petljao po VBScriptu duže od 3-4 sata).

Na kraju sam se odlučio za sljedeće rješenje:

  • Koristeći pravila grupe, sakupite sve pacs.xml datoteke na jednom mjestu na bilo kojem poslužitelju u mrežnom resursu;
  • Masovno mijenjati datoteke (već sam imao iskustva u rješavanju takvih problema koristeći Perl);
  • Također koristite pravila grupe za ažuriranje postavki klijenta.

Prikupljanje datoteka pomoću pravila grupe

Najjednostavnije je da kada se klijent prijavi na svoj profil, on sa svojim pravima izvrši određenu .bat datoteku koja glasi:

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

Stoga će se datoteke pacs.xml akumulirati na poslužitelju u skrivenom izvoru, čiji naziv sadrži informacije s kojeg je računala i od kojeg korisnika ova konfiguracija kopirana.

Najteže je bilo čekati da ova politika proradi za sve korisnike.

Promjena konfiguracija pomoću Perl skripte

Mi ćemo trebati Aktivni Perl za Windows iz ActiveState-a, kao i modul XML::Writer koji se može instalirati pomoću naredbe ppm instalirajte XML-Writer.

Sama skripta se pokazala vrlo jednostavnom:

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

Princip njegovog rada:

  • Otvaramo direktorij u kojem smo prikupili pacs.xml konfiguracije od klijenata i smještamo popis datoteka u niz skalara (@report_files);
  • U petlji obrađujemo jednu po jednu datoteku i čitamo je red po red;
  • Koristeći split, svaki redak dijelimo na 5 dijelova, koristeći navodnike kao separator;
  • Pronalazimo liniju s riječi slušatelj i postavljamo podatke jedinstvene za svaku datoteku (naziv AE klijenta i broj TCP porta) u dvije varijable;
  • Nakon toga jednostavno generiramo novu XML datoteku, u nju unesemo jedinstvene parametre i zatim ubacimo potreban broj PACS poslužitelja s njihovim parametrima - oni. zbog čega je sve počelo)
  • Ponovno pišemo novu XML datoteku na staru.

Treba napomenuti da zapravo ovu skriptu ne koristim potpuno automatski - dapače, kopiram prikupljene konfiguracije u poseban direktorij i zatim pokrenem skriptu i sve ih masovno mijenjam. Zatim, nasumična provjera - i konfiguracije se mogu distribuirati natrag na strojeve.

Distribucija modificiranih pacs.xml datoteka klijentima

Najjednostavnije što mi je palo na pamet bilo je promijeniti već radnu .bat datoteku koja prikuplja konfiguracije od klijenata i dodati redak:

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

Konačna .bat datoteka izgleda ovako:

@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čak

Ovako je"koljeno" riješenje. Probali smo već dva puta (rujan 2018. i veljača 2019.), za sada je let normalan. Naravno, ne ažurira se 100% klijenata, ali je blizu ove vrijednosti - ostatak dovršavamo na daljinu. Autor scenarija link.

Izvor: www.habr.com

Dodajte komentar