Eellugu
Ăhes meditsiiniorganisatsioonis rakendati lahendusi PACS-serverite Orthanc ja DICOM-klient Radiant alusel. Seadistamise kĂ€igus selgus, et iga DICOM-klient peab olema PACS-serverites kirjeldatud jĂ€rgmist moodi:
- Kliendi nimi
- AE-nimi (peab olema unikaalne)
- TCP-port, mis avatakse automaatselt kliendi poolel ja aktsepteerib DICOM-uurimisi PACS-serverilt (st server tĂ”ukab neid kliendi suunas â alustades ĂŒhendust esimesena)
- IP-aadress
PĂ€rast Radiant'i klientide seadistamist saadi jĂ€rgmine teave mĂ”tlemiseks â iga kliendi tarkvara seadistamine ĂŒlaltoodud parameetritega viis faili tĂ€itmiseks pacs.xml, mis asus kasutajaprofiilis (tee: %APPDATA%RadiantViewerpacs.xml). Samas erines ĂŒhe kliendi konfiguraatsioon vĂ€hemalt kahe parameetri poolest (AE-nimi oli kĂ”ikidel erinev, samas oli port enamasti sama, vĂ€lja arvatud terminali kliendid, mis töötasid samas serveris â seal pidi ka portide mÀÀramine olema erinev).
NĂ€ide failist pacs.xml :
Umbes kuue kuu jooksul oli kĂ”ik hĂ€sti, sĂŒsteem töötas⊠ja siis jĂ”udsid meieni "allveelaevad ja»:
- karid
- Peame kasutusele vĂ”tma mitu uut PACS-serverit, mis asendavad vanad (kus hakkas kettaruumi otsa saama). PACS-serverid on virtuaalmasinates, kuid sellest ei ole nĂŒĂŒd juttu;
- Peame kuidagi keskelt muudma unikaalseid konfiguratsioone (kaks erinevat parameetrit) 200 masinal (nende arv suurenes pidevalt);
Kuna uuringute mahu kasv on kiire, peab lahendus olema mitte ĂŒhekordne, vaid korduv ja regulaarne (nĂ€iteks 1 kord 3-5 kuu jooksul).
Allpool on lahendus.
Tööriistade valimine probleemi lahendamiseks
Esialgu olid katsed leida mingi lahendus, mis kliendi poolel muudetaks faili pacs.xml ja lisaks muudaks PACS-serverite nimekirja, puudutamata AE-nime ja TCP-porti seadeid. Windowsi kliendid olid sel hetkel nii Windows XP kui ka Windows 7 baasil â seega olid katsed kirjutada midagi VBScripti alusel. Kuid kahjuks ei Ă”nnestunud sellist ĂŒlesannet lahendada, kuna mul puudus tĂ€ielikult kogemus millegi keerulise ja komplekse kirjutamisel sellel keelel. Katsetused leida ja ĂŒmber kirjutada ei kroonitud samuti eduga (siinkohal tuleks mĂ€rkida, et peas oli juba teine plaan, seega ei viibinud ma VBScripti kallal enam kui 3-4 tundi).
- Koguda kĂ”ik pacs.xml failid gruppipoliitika abil ĂŒhte kohta mingil serveril vĂ”rguresursis;
- Muuda faile massiliselt (selliste probleemide lahendamise kogemus on juba olemas - Perl'i kasutades);
- Samuti uuenda klientide seadeid grupipoliitikate abil.
Failide kogumine grupipoliitika abil
KĂ”ige lihtsam osa â kui klient siseneb oma profiili, kĂ€ivitab ta oma Ă”igustega mingisuguse .bat faili, milles on kirjas:
echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Nii kogunevad serveri varjatud ressursis pacs.xml failid, mille nimedes on teave, millisest arvutist ja kellelt kasutajalt see konfiguratsioon kopeeriti.
KÔige keerulisem osa oli oodata, kuni see poliitika rakendub kÔigil kasutajatel.
Konfiguratsioonide muutmine Perl'i skripti abil
Me vajame Windowsi jaoks ActiveState'ilt, samuti moodulit XML::Writer, mille saab installida kÀsuga ppm install XML-Writer.
Isegi skript osutus ĂŒsna lihtsaks:
use XML::Writer;
# Avame aruandete kaust, töötleme nimekirja (eemaldame liigsed):
$report_dir = "C:Perl64WORKPACS-xml3";
opendir(DIR, "$report_dir") or die "Ei saa aruandete kausta avada!";
@report_files = readdir DIR;
shift (@report_files); # eemaldame massiivi elementidest punkti (.)
shift (@report_files); # eemaldame massiivi elementidest kaks punkti (..)
# print "@report_files";
closedir(DIR);
# Alustame failide töötlemist - ĂŒks mees kord. Peame lugema AET parameetri ja pordi numbri muutujatesse.
foreach $analiz_file (@report_files)
{
$full_path_to_file="C:Perl64WORKPACS-xml3".$analiz_file;
open (INFO, $full_path_to_file);
while ($line = )
{
# Muutujad $aet ja $port sisaldavad unikaalseid andmeid iga XML faili jaoks:
my ($other1, $aet, $other2, $port, $other3) = split /"/, $line, 5;
# Kui leitakse rida listener - oleme jÔudnud soovitud reale ja saame luua uue XML:
if ($other1 =~ 'listener')
{
# Loome uue XML soovitud vÀljade ja andmetega:
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');
# Asetame valmis XML muutuja:
my $xml = $writer->end();
# Valmistame faili ĂŒmberkirjutamiseks ette:
$rewritexml = $full_path_to_file;
# Kirjutame XML failid uute andmetega:
open (NEWXML, "> $rewritexml");
print NEWXML $xml;
close (NEWXML);
}
}
}
Töö pÔhimÔte:
- Avame katalooge, kus on kogutud pacs.xml konfiguratsioonid klientidelt, ja paigutame failide loendi skalaartesse (@report_files);
- TsĂŒklis töötleme ĂŒksikfaili ja loeme seda ridade kaupa;
- Kasutades split, jagame iga rea 5 osaks, kasutades tĂŒhikuid eraldajana;
- Leiame rea, kus on sÔna listener, ja salvestame kaks muutujaid, mis on iga faili jaoks unikaalsed (AE-klienti nimi ja TCP-port);
- PĂ€rast seda loome lihtsalt uue XML-faili, kirjutame sellesse unikaalsed parameetrid ja seejĂ€rel lisame vajalikud PACS-serverid koos nende parameetritega â st see, miks kĂ”ik see algas)
- Kirjutame uue XML-faili ĂŒle vana.
On oluline mĂ€rkida, et tegelikult ei kasuta ma seda skripti tĂ€ielikult automaatselt â pĂ”himĂ”tteliselt kopeerin kogutud konfiguratsioonid eraldi katalooge ja seejĂ€rel muudatuste tegemiseks kĂ€itan skripti. Edasi toimub valikuline kontroll â ja konfiguratsioonid saab masinatele tagasi jagada.
Muudetud pacs.xml failide levitamine klientide seas
Lihtsaim mĂ”te, mis pĂ€he tuli â teha muudatusi juba töötavas .bat failis, mis kogub konfiguratsioone klientidelt ja lisada rida:
If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml
LÔplik .bat fail nÀeb vÀlja jÀrgmine:
@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
KokkuvÔte
Selline "kokku pandud" lahendus. Oleme seda katsetanud juba kaks korda (septembris 2018 ja veebruaris 2019), praegu on kĂ”ik okei. Loomulikult ei uuenda see 100% kliente, kuid see on sellele lĂ€hedane â ĂŒlejÀÀnud teeme kaugelt. Skript .
Allikas: habr.com
