A programbeállítások módosítása a személyes paraméterek megőrzésével

Háttér

Egy egészségügyi intézményben Orthanc PACS szerverek és Radiant DICOM kliens alapú megoldásokat vezettek be. A beállítás során kiderült, hogy minden DICOM kliensnek a PACS szerverekben a következőképpen kellene szerepelnie:

  • Kliens neve
  • AE-név (egunique-nak kell lennie)
  • TCP-port, amely automatikusan megnyílik a kliensek oldalán, és fogadja a DICOM vizsgálatokat a PACS szervertől (tehát a szerver gyakorlatilag tolja őket a kliens felé - elsőként iniciálva a kapcsolatot)
  • IP-cím

A Radiant kliensek beállítása után a következő információt kaptuk elgondolkodásra – minden kliens szoftverének beállítása a fenti paraméterekkel egy fájl kitöltését eredményezte pacs.xml, amely a felhasználói profilban található (útvonal: %APPDATA%RadiantViewerpacs.xml). Ebben az esetben az egyik kliens konfigurációja a másiktól legalább két paraméterben eltért (az AE-név mindenkinek eltérő, a port pedig általában azonos, kivéve a terminális klienseket, amelyek ugyanazon a szerveren működnek - ott a portokat is másra kellett állítani).

Példa a pacs.xml fájlra linkre kattintva:

Körülbelül hat hónapig minden jól ment, a rendszer működött... és ekkor eljutott hozzánk a "rejtett buktatók»:

  • Be kell vezetnünk néhány új PACS szervert, amelyek helyettesítik a régieket (ahol a lemezen a hely kifogyott). PACS szerverek virtuális gépeken, de erről nem is beszélek;
  • Központosítva kellene valahogy megváltoztatni az egyedi konfigurációkat (két eltérő paraméterrel) 200 gépen (azok száma folyamatosan nő);
  • Figyelembe véve a vizsgálatok növekvő mennyiségét, a megoldásnak nem egyszeri alkalomnak, hanem sokszorosíthatónak és rendszeresnek kell lennie (például 3-5 havonta egyszer).

A megoldás alább.

Eszközválasztás a probléma megoldásához

Kezdetben próbálkoztunk olyan megoldást találni, amely a kliens oldalán módosította a pacs.xml fájlt, és módosításokat vezetett be a PACS szerverek listájában anélkül, hogy a AE-név és TCP-port beállításokat megváltoztatta volna. A Windows kliensek ekkor Windows XP és Windows 7 alapúak voltak - így próbálkoztunk valamit írni VBScript alapú megoldásként. De sajnos – egy ilyen feladatot megvalósítani nem sikerült, mivel teljesen hiányzott a tapasztalat a bármilyen összetett dolog írásában ezen a nyelven. Az is próbálkozások, hogy megtaláljunk és átírjunk valamit szintén nem hoztak sikert (itt érdemes megjegyezni, hogy már volt egy másik terv a fejemben, így nem töltöttem több mint 3-4 órát VBScript-tel).

Végül a következő megoldás mellett döntöttem:

  • Gyűjtsük össze a pacs.xml fájlokat egy csoportházirend segítségével egy helyen, bármelyik szerveren a hálózati erőforrásban;
  • A fájlok csoportos módosítása (már van tapasztalatunk az ilyen feladatok megoldásában – Perl használatával);
  • A kliensek beállításait is frissíthetjük csoportos házirendek segítségével.

Fájlok gyűjtése csoportos házirend segítségével

A legegyszerűbb része – amikor a kliens belép a profiljába, a jogaival végrehajt egy .bat fájlt, amely tartalmazza:

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

Így a szerveren egy rejtett erőforrásban felhalmozódnak a pacs.xml fájlok, amelyek nevében információ található arról, hogy melyik számítógépről és melyik felhasználótól másolták ezt a konfigurációt.

A legnehezebb az volt, hogy megvárjuk, amíg minden felhasználónál érvényesíti ezt a házirendet.

Konfigurációk módosítása Perl script segítségével

Szükségünk lesz Active Perl Windows alatt az ActiveState-től, valamint az XML::Writer modulra, amelyet a következő parancs segítségével telepíthetünk ppm install XML-Writer.

A script pedig meglehetősen egyszerű lett:

használj XML::Writer;
 
# Megnyitjuk a jelentések mappáját, feldolgozzuk a listát (eltávolítjuk a feleslegeset):
	$report_dir = "C:Perl64WORKPACS-xml3";
	opendir(DIR, "$report_dir") or die "Nem tudom megnyitni a jelentések mappáját!";
	@report_files = readdir DIR;
	shift (@report_files); # eltávolítjuk a pontot az elemekből (.)
	shift (@report_files); # eltávolítjuk a két pontot az elemekből (..)
#	print "@report_files";
	closedir(DIR);
 
# Elkezdjük feldolgozni a fájlokat - egyet egyszerre. Olvasni kell az AET paramétert és a port számot a változókba.
foreach $analiz_file (@report_files) 
{
	$full_path_to_file="C:Perl64WORKPACS-xml3".$analiz_file;
	open (INFO, $full_path_to_file);
 
	while ($line = )
	{
		# Az $aet és a $port változók egyedi adatokat tartalmaznak minden XML fájlhoz:
		my ($other1, $aet, $other2, $port, $other3) = split /"/,$line, 5;
		# Ha a "listener" sztringgel találkozunk - akkor elértük a szükséges sort, és lehet új XML-t formálni:
		if ($other1 =~ 'listener')
			{
				# Új XML-t alakítunk ki a szükséges mezőkkel és adatokkal:
				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');
 
				# A kész XML-t egy változóba helyezzük:
				my $xml = $writer->end();
				# Előkészítjük a fájlt felülírásra:
				$rewritexml = $full_path_to_file;
				# Az XML fájlokat új adatokkal írjuk felül:
				open (NEWXML, "> $rewritexml");
				print NEWXML $xml;
				close (NEWXML);
			}
	}
 
}

A működési elve:

  • Megnyitjuk a katalógust, amelyben a kliensektől származó pacs.xml konfigurációk gyűjtve vannak, és a fájlok listáját tömbskálárokba helyezzük (@report_files);
  • Ciklusban feldolgozzuk az egyes fájlokat és soronként olvassuk be őket;
  • A split segítségével minden egyes sort öt részre bontunk, idézőjeleket használva elválasztóként;
  • Megkeressük a listener szót tartalmazó sort, és két, minden fájlra egyedülálló változóba helyezzük az adatokat (AE - ügyfél neve és TCP port száma);
  • Ezután egyszerűen elkészítjük az új XML fájlt, beírjuk bele az egyedi paramétereket, majd szükséges számú PACS szervert adunk hozzá a paramétereikkel – azaz ez az, amiért az egész indult.)
  • Az új XML fájlt a régi fölé írjuk.

Meg kell jegyezni, hogy valójában ezt a szkriptet nem teljesen automatikusan használom – alapvetően a gyűjtött konfigurációkat egy külön katalógusba másolom, majd a szkript futtatásakor egyszerre módosítom őket. Ezt követi a szelektív ellenőrzés – és a konfigurációk visszakerülhetnek a gépekre.

A módosított pacs.xml fájlok terjesztése az ügyfelek felé.

A legegyszerűbb, ami eszembe jutott – módosítani a már működő .bat fájlt, amely a konfigurációkat összegyűjti az ügyfelektől, és hozzáadni a sort:

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

A végső .bat fájl így néz ki:

@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

Zárás

Ilyen "házimegoldás. Már kétszer próbáltuk ki (2018 szeptemberében és 2019 februárjában), eddig mindent rendben találtunk. Természetesen nem 100%-ban frissíti az ügyfeleket, de közel áll ehhez az értékhez – a maradékot távolról fejezzük be. A szkript a linkre kattintva.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster