Promjena postavki programa uz čuvanje ličnih parametara

prapovijest

Jedna medicinska organizacija implementirala je rješenja bazirana na Orthanc PACS serverima i Radiant DICOM klijentu. Tokom podešavanja smo saznali da svaki DICOM klijent mora biti opisan u PACS serverima na sledeći način:

  • Ime klijenta
  • AE naziv (mora biti jedinstven)
  • TCP port koji se automatski otvara na strani klijenta i prima DICOM ankete od PACS servera (tj. server ih gura prema klijentu - prvo pokreće vezu)
  • IP adresa

Nakon postavljanja Radianta, klijenti su dobili sljedeću hranu za razmišljanje: za svakog klijenta, postavljanje softvera s gore navedenim parametrima rezultiralo je popunjavanjem datoteke pacs.xml, koji se nalazio u korisničkom profilu (put: %APPDATA%RadiantViewerpacs.xml). Istovremeno, konfiguracija jednog klijenta se razlikovala od drugog u najmanje dva parametra (naziv AE je različit za sve, a port je u osnovi isti, osim za terminalske klijente koji rade na istom serveru - tu su i portovi imali biti dodijeljen različitim).

Primjer pacs.xml datoteke od link:

Otprilike šest meseci sve je bilo u redu, sistem je počeo da radi... a onda je došlo do nas “pod vodom kamenje"

  • Moramo pustiti u rad nekoliko novih PACS servera koji će zamijeniti stare (gdje je prostor na disku počeo da ponestaje). PACS serveri u virtuelnim mašinama, ali to nije ono o čemu govorimo;
  • Moramo nekako centralno promijeniti jedinstvene konfiguracije (sa dva različita parametra) na 200 mašina (njihov broj se redovno povećavao);
  • S obzirom na stopu rasta obima istraživanja, rješenje je potrebno ne samo jednom, već replicirano i redovno (na primjer, jednom u 1-3 mjeseci).

Rješenje je u nastavku.

Odabir alata za rješavanje problema

U početku je bilo pokušaja da se pronađe neko rešenje koje bi modifikovalo datoteku pacs.xml na strani klijenta i izvršilo promene na listi PACS servera bez uticaja na AE ime i postavke TCP porta. Windows klijenti su u to vreme bili bazirani i na Windows XP i na Windows 7 - pa je bilo pokušaja da se ovako nešto napiše na VBScript-u. Ali nažalost, takav zadatak nije bilo moguće savladati, zbog potpunog nedostatka iskustva u pisanju bilo čega složenog i složenog na ovom jeziku. Pokušaji pronalaženja i prepisivanja također su bili neuspješni (treba napomenuti da sam već imao drugačiji plan u glavi, pa se nisam petljao po VBScript-u duže od 3-4 sata).

Na kraju sam se odlučio na sledeće rešenje:

  • Koristeći politiku grupe, prikupite sve pacs.xml datoteke na jednom mjestu na bilo kojem serveru 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 grupnih politika

Najjednostavniji dio je da kada se klijent prijavi na svoj profil, on sa svojim pravima izvršava određeni .bat fajl koji kaže:

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

Dakle, datoteke pacs.xml će se akumulirati na serveru u skrivenom resursu, čije ime sadrži informacije sa kojeg računara i od kog korisnika je ova konfiguracija kopirana.

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

Promjena konfiguracija pomoću Perl skripte

Trebat će nam Active Perl za Windows iz ActiveState, kao i XML::Writer modul koji se može instalirati pomoću naredbe ppm instalirajte XML-Writer.

Sama skripta se pokazala prilično 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 stavljamo listu datoteka u niz skalara (@report_files);
  • U petlji obrađujemo jednu po jednu datoteku i čitamo je red po red;
  • Koristeći split, svaki red smo podijelili na 5 dijelova, koristeći navodnike kao separator;
  • Pronalazimo red sa rečju slušalac i stavljamo podatke jedinstvene za svaki fajl (AE ime klijenta i broj TCP porta) u dve varijable;
  • Nakon toga jednostavno generišemo novu XML datoteku, u nju unosimo jedinstvene parametre i zatim ubacujemo potreban broj PACS servera sa njihovim parametrima - one. zbog čega je sve počelo)
  • Prepisujemo novi XML fajl na staru.

Treba napomenuti da u stvari, ja ne koristim ovu skriptu potpuno automatski - zapravo, 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 mašine.

Distribucija modificiranih pacs.xml datoteka klijentima

Najjednostavnije što mi je palo na pamet je da izvršite promjene u već radnom .bat fajlu koji prikuplja konfiguracije od klijenata i dodate red:

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”koleno"rešenje. Probali smo ga već dva puta (u septembru 2018. i februaru 2019.), do sada je let normalan. Naravno, ne ažurira se 100% klijenata, ali je blizu ove vrijednosti - ostalo dovršavamo daljinski. Script by link.

izvor: www.habr.com

Dodajte komentar