Promjena postavki programa uz zadržavanje osobnih parametara

Povijest

U jednoj medicinskoj organizaciji implementirali su rješenja temeljena na PACS poslužiteljima Orthanc i DICOM klijentu Radiant. Tijekom postavke otkrili smo da svaki DICOM klijent mora biti opisan na PACS poslužiteljima na sljedeći način:

  • Ime klijenta
  • AE-ime (mora biti jedinstveno)
  • TCP port koji se automatski otvara na strani klijenta i prima DICOM pretrage od PACS poslužitelja (tj. poslužitelj ih zapravo gura prema klijentu – inicirajući vezu prvi)
  • IP adresa

Nakon postavljanja Radiant klijenata dobili smo sljedeće informacije za razmišljanje – svaki klijent imao je postavke softvera s navedenim parametrima što je rezultiralo ispunjavanjem datoteke pacs.xml, koja se nalazila u korisničkom profilu (put: %APPDATA%RadiantViewerpacs.xml). Pri tome se konfiguracija jednog klijenta razlikovala od druge po najmanje dva parametra (AE-ime je svima različito, a port je uglavnom bio isti, osim terminalnih klijenata koji rade na istom poslužitelju – tu je također bilo potrebno dodijeliti različite portove).

Primjer datoteke pacs.xml prema vezi:

Otprilike pola godine sve je bilo dobro, sustav je radio… a onda su nam došle "podmorske stjene»:

  • Moramo uvesti nekoliko novih PACS poslužitelja koji će zamijeniti stare (gdje je prostor na diskovima postao ograničen). PACS poslužitelji su u virtualnim strojema, ali o tome se ne radi;
  • Moramo na neki način centralizirano promijeniti jedinstvene konfiguracije (dva različita parametra) na 200 strojeva (njihov broj se redovito povećavao);
  • S obzirom na brzinu rasta volumnog pregleda, rješenje ne smije biti jednokratno, nego prenosivo i redovito (npr. jednom u 3-5 mjeseci).

Rješenje u nastavku.

Odabir alata za rješavanje zadatka

Na početku su postojali pokušaji da se pronađe neko rješenje koje bi na strani klijenta promijenilo datoteku pacs.xml i unijelo promjene u popis PACS poslužitelja, ne dodirujući postavke AE-imena i TCP porta. Windows klijenti tada su bili na Windows XP i Windows 7 – stoga su postojali pokušaji napisati nešto temeljeno na VBScriptu. No, nažalost – nismo uspjeli svladati zadatak zbog potpune odsutnosti iskustva u pisanju nečega složenog na tom jeziku. Pokušaji da se pronađe i prepiše također nisu urodili plodom (ovdje treba napomenuti da mi je već bila na pameti druga ideja, pa se s VBScriptom nisam bavio više od 3-4 sata).

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

  • Skupite sve pacs.xml datoteke na jednom poslužitelju u mrežnom resursu pomoću grupne politike;
  • Izmijenite datoteke masovno (već imamo iskustva u rješavanju takvih zadataka - koristeći Perl);
  • Također, putem grupnih politika ažurirajte postavke klijenata.

Prikupljanje datoteka pomoću grupne politike

Najlakši dio - kada se klijent prijavi u svoj profil, sa svojim pravima pokreće određenu .bat datoteku, koja sadrži:

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

Na taj način, na poslužitelju u skrivenom resursu, nakupljat će se pacs.xml datoteke, u imenu kojih se nalazi informacija s kojeg računala i kojeg korisnika je ova konfiguracija kopirana.

Najteži dio bio je čekati da ova politika završi za sve korisnike.

Promjena konfiguracija pomoću Perl skripte

Bit će nam potrebno Active Perl za Windows od tvrtke ActiveState, kao i modul XML::Writer, koji se može instalirati pomoću naredbe ppm install XML-Writer.

Sama skripta ispala je prilično jednostavna:

use XML::Writer;
 
# Otvaramo mapu s izvještajima, obrađujemo popis (uklanjamo suvišno):
	$report_dir = "C:Perl64WORKPACS-xml3";
	opendir(DIR, "$report_dir") or die "Ne mogu otvoriti mapu s izvještajima!";
	@report_files = readdir DIR;
	shift (@report_files); # uklanjamo točku iz elemenata niza (.)
	shift (@report_files); # uklanjamo dvije točke iz elemenata niza (..)
#	print "@report_files";
	closedir(DIR);
 
# Počinje obrada datoteka - jedna po jedna. Potrebno je učitati parametar AET i broj porta u varijable.
foreach $analiz_file (@report_files) 
{
	$full_path_to_file="C:Perl64WORKPACS-xml3".$analiz_file;
	open (INFO, $full_path_to_file);
 
	while ($line = )
	{
		# Varijable $aet i $port sadrže jedinstvene podatke za svaku XML datoteku:
		my ($other1, $aet, $other2, $port, $other3) = split \/"\/, $line, 5;
		# Ako se naiđe na string listener - došli smo do potrebnog reda i možemo formirati novi XML:
		if ($other1 =~ 'listener')
			{
				# Formiramo novi XML s potrebnim poljima i podacima:
				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');
 
				# Smještamo gotov XML u varijablu:
				my $xml = $writer->end();
				# Pripremamo datoteku za prepisivanje:
				$rewritexml = $full_path_to_file;
				# Prepisujemo XML datoteke novim podacima:
				open (NEWXML, "> $rewritexml");
				print NEWXML $xml;
				close (NEWXML);				
			}
	}
 
}

Način rada:

  • Otvaramo katalog u kojem su prikupljene konfiguracije pacs.xml od klijenata i stavljamo popis datoteka u niz skalarnih (@report_files);
  • U petlji obrađujemo jednu po jednu datoteku i očitavamo je liniju po liniju;
  • Pomoću split dijelimo svaku liniju na 5 dijelova, koristeći navodnike kao razdvajač;
  • Pronalazimo liniju sa slovom listener i stavljamo u dvije varijable koje su jedinstvene za svaku datoteku (AE-ime klijenta i broj TCP porta);
  • Nakon toga jednostavno formiramo novu XML datoteku, upisujemo u nju jedinstvene parametre, a zatim dodajemo potrebno broj PACS poslužitelja s njihovim parametrima – tj. to je bio cilj cijele procedure)
  • Prepisujemo novu XML datoteku preko stare.

Treba napomenuti da ovaj skript zapravo ne koristim potpuno automatski – u suštini, kopiram prikupljene konfiguracije u poseban katalog i potom pokrećem skript mijenjajući ih sve odjednom. Slijedi selektivna provjera – i konfiguracije se mogu ponovno rasporediti po strojevima.

Distribucija izmijenjenih pacs.xml datoteka klijentima

Najjednostavnije što mi je palo na pamet – unijeti izmjene u već postojeći .bat datoteku koja prikuplja konfiguracije s 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

Takvo je "rješenje s koljena". Testirali smo ga već dva puta (u rujnu 2018. i u veljači 2019.), dok je let normalan. Naravno, ne ažurira 100% klijenata, ali blizu je toj vrijednosti — ostale završavamo udaljeno. Skript vezano uz vezi.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster