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 :
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 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 .
Forrás: habr.com
