Sprememba nastavitev programov ob ohranjanju osebnih parametrov

Pozadina

V eni medicinski organizaciji so uvedli rešitve na osnovi PACS strežnikov Orthanc in DICOM odjemalca Radiant. Med nastavitvijo se je izkazalo, da mora biti vsak DICOM odjemalec opisan na PACS strežnikih na naslednji način:

  • Ime odjemalca
  • AE-ime (mora biti edinstveno)
  • TCP vrata, ki se samodejno odprejo na strani odjemalca in sprejmejo DICOM preiskave iz PACS strežnika (t.j. strežnik jih kot bi potiska proti odjemalcu – prvi vzpostavi povezavo)
  • IP naslov

Po nastavitvi Radiant odjemalcev smo dobili naslednje informacije za razmislek – pri vsakem odjemalcu je nastavitve programske opreme z zgoraj navedenimi parametri povzročilo, da je bil napolnjen fajl pacs.xml, ki se je nahajal v uporabniškem profilu (pot: %APPDATA%RadiantViewerpacs.xml). Pri tem se je konfiguracija enega odjemalca od drugega razlikovala vsaj po dveh parametrih (AE-ime je bilo pri vseh različno, vrata pa so bila v glavnem enaka, razen pri terminalskih odjemalcih, ki delujejo na istem strežniku – tam so bila vrata prav tako dodeljena drugače).

Primer fajla pacs.xml po linku:

Približno pol leta je vse dobro delovalo, sistem je zaživel ... in takrat so nas dosegli "skriti podvigi»:

  • Moramo vključiti več novih PACS strežnikov, ki bodo zamenjali stare (kjer je zmanjkalo prostora na diskih). PACS strežniki so v virtualnih strojih, vendar tu ne gre za to;
  • Na nek način moramo centralizirano spremeniti edinstvene konfiguracije (z dvema različnima parametroma) na 200 strojih (njihovo število se je redno povečevalo);
  • Glede na hitrost rasti obsega preiskav rešitev ne sme biti enkratna, temveč prenosna in redna (na primer, enkrat na 3-5 mesecev).

Rešitev je opisana spodaj.

Izbira orodij za reševanje naloge

Sprva so bila prizadevanja najti rešitev, ki bi na strani odjemalca spremenila fajl pacs.xml in vanj vnesti spremembe v seznam PACS strežnikov, ne da bi se dotikali nastavitev AE-ime in TCP vrat. Windows odjemalci so bili takrat na osnovi Windows XP in Windows 7 – zato so bila prizadevanja napisati kaj takšnega na osnovi VBScript. Toda žal – te naloge ni bilo mogoče izvesti, zaradi popolnega pomanjkanja izkušenj pri pisanju česarkoli kompleksnega v tem jeziku. Prizadevanja, da bi našli in predelali prav tako niso obrodila sadov (tu je treba omeniti, da je bil v mislih že drug načrt, zato se nisem ukvarjal z VBScript več kot 3-4 ure).

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

  • Zberite skupinsko politiko vse datoteke pacs.xml na enem mestu na katerem koli strežniku v omrežnem viru;
  • Spremenite datoteke množično (izkušnje z reševanjem takih nalog so že bile – z uporabo Perla);
  • Prav tako z uporabo skupinskih politik posodobite nastavitve odjemalcev.

Zbiranje datotek s pomočjo skupinske politike

Najlažji del – ob vstopu stranke v svoj profil izvede nek .bat datoteko, v kateri je zapisano:

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

Tako bodo na strežniku v skrito viru kopičene datoteke pacs.xml, v imenu katerih je informacija, s katerega računalnika in katerega uporabnika je bila kopirana ta konfiguracija.

Najtežje je bilo – počakati, da ta politika deluje pri vseh uporabnikih.

Sprememba konfiguracij s pomočjo Perl skripta

Potrebovali bomo Active Perl za Windows podjetja ActiveState, ter modul XML::Writer, ki ga lahko namestite s pomočjo ukaza ppm install XML-Writer.

Skripta sama pa je postala dokaj preprosta:

use XML::Writer;
 
# Odpremo mapo z poročili, obdelamo seznam (odstranimo odvečne):
	$report_dir = "C:Perl64WORKPACS-xml3";
	opendir(DIR, "$report_dir") or die "Ne morem odpreti mape z poročili!";
	@report_files = readdir DIR;
	shift (@report_files); # odstranimo piko iz elementov polja (.)
	shift (@report_files); # odstranimo dve piki iz elementov polja (..)
#	print "@report_files";
	closedir(DIR);
 
# Začnemo obdelovati datoteke - eno za drugo. Treba je prebrati parameter AET in številko vrata v spremenljivke.
foreach $analiz_file (@report_files) 
{
	$full_path_to_file="C:Perl64WORKPACS-xml3".$analiz_file;
	open (INFO, $full_path_to_file);
 
	while ($line = )
	{
		# Spremenljivke $aet in $port vsebujejo edinstvene podatke za vsako XML datoteko:
		my ($other1, $aet, $other2, $port, $other3) = split /"/, $line, 5;
		# Če srečamo vrstico listener - smo prišli do želene vrstice in lahko oblikujemo novo XML:
		if ($other1 =~ 'listener')
			{
				# Oblikujemo novo XML z potrebnimi polji in podatki:
				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');
 
				# Shranimo končni XML v spremenljivko:
				my $xml = $writer->end();
				# Pripravimo datoteko za prepis:
				$rewritexml = $full_path_to_file;
				# Prepišemo XML datoteke z novimi podatki:
				open (NEWXML, "> $rewritexml");
				print NEWXML $xml;
				close (NEWXML);				
			}
	}
 
}

Načelo delovanja:

  • Odprite katalog, kjer so zbrane konfiguracije pacs.xml strank in shranite seznam datotek v polje skalarjev (@report_files);
  • V zanki obdelamo vsako datoteko posebej in jo preberemo vrstico po vrstici;
  • Z uporabo split razdelimo vsako vrstico na 5 delov, pri čemer uporabimo narekovaje kot ločilo;
  • Poiščemo vrstico s besedo listener in shranimo v dve spremenljivki edinstvene podatke za vsako datoteko (AE-ime naročnika in številko TCP vrata);
  • Nato oblikujemo novo XML datoteko, vanjo zapišemo edinstvene parametre in nato dodamo potrebno število PACS strežnikov s svojimi parametri - torej, to je glavni namen vsega tega)
  • Napisali bomo novo XML datoteko preko stare.

Treba je omeniti, da v resnici ne uporabljam tega skripte popolnoma avtomatsko - v bistvu kopiram zbrane konfiguracije v ločen katalog in nato, ko zaženem skript, jih vse skupaj spremenim. Nato sledi selektivna kontrola - in konfiguracije lahko razdelimo nazaj po napravah.

Distribucija spremenjenih pacs.xml datotek strankam

Najprej se mi je porodila najpreprostejša ideja - spremeniti že delujoči .bat datoteko, ki zbira konfiguracije iz strank, in dodati vrstico:

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

Končna .bat datoteka izgleda 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

Takšna je «ročno narejena» rešitev. Preizkusili smo jo že dvakrat (septembra 2018 in februarja 2019), doslej ni bilo težav. Seveda ne posodobi 100% strank, ampak je blizu te vrednosti - preostale popravimo na daljavo. Skript po linku.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster