Eelalugu
Ühes meditsiiniasutuses rakendati PACS-serverite Orthanc ja DICOM-klient Radiant lahendusi. Seadistamise käigus selgus, et iga DICOM-klient peab olema PACS-serverites kirjeldatud järgmiselt:
- Kliendi nimi
- AE-nimi (peab olema ainulaadne)
- TCP-port, mis avatakse automaatselt kliendi poolel ja see võtab vastu DICOM-uuringud PACS-serverilt (st server tõukab need kliendi poole, alustades esimesena ühendust)
- IP-aadress
Pärast Radiant klientide seadistamist saadi järgmine info – iga kliendi tarkvara seadistamine ülaltoodud parameetritega viis faili täitumiseni pacs.xml, mis asus kasutaja profiilis (rada: %APPDATA%RadiantViewerpacs.xml). Samuti erines ühe kliendi konfi teine vähemalt kahe parameetri poolest (AE-nimi on kõigil erinev ning port on enamasti ühesugune, välja arvatud terminalide kliendid, mis töötavad ühel ja samal serveril – seal tuli portidele ka erinevad numbrid määrata).
pacs.xml faili näidis :
Umbes poole aasta vältel oli kõik hästi, süsteem toimis... ja siis jõudsid meieni "alused kalad»:
- Meie peame käivitama mitu uusi PACS-serverit, mis asendavad vanad (kus on täitumas ketasruum). PACS-serverid on virtuaalmasinates, aga sellest ei ole jutt;
- Me peame kuidagi tsentraliseeritult muutma unikaalseid konfiguratsioone (kahe erineva parameetriga) 200 masinal (nende arv suureneb pidevalt);
- Arvestades uuringute mahu kasvu, peab lahendus olema mitte ühekordne, vaid skaleeritav ja regulaarne (näiteks kord 3-5 kuu jooksul).
Allpool on lahendus.
Tööriistade valik ülesande lahendamiseks
Alguses prooviti leida mingit lahendust, mis muudaks kliendi poolel faili pacs.xml ja tooks sisse muudatused PACS-serverite loendisse, ilma et mõjutataks AE-nime ja TCP-porti seadistusi. Windowsi kliendid olid tol hetkel nii Windows XP kui ka Windows 7 peal – seega prooviti kirjutada midagi VBScripti baasil. Kuid kahjuks ei õnnestunud sellist ülesannet täita, kuna mul puudus täielikult kogemus keerukate ja komplekssete asjade kirjutamisel sellel keelel. Samuti ei olnud edusamme leidmine ja ümberkirjutamine edukas (siinkohal tuleb märkida, et peas oli juba teine plaan, seega ma ei viibinud VBScriptiga rohkem kui 3-4 tundi).
Lõpuks valisin järgmise lahenduse:
- Koguda grupipoliitika abil kõik pacs.xml failid ühte kohta mingil serveril võrguressursis;
- Muutke faile korraga (järgmise probleemiga tegelemiseks oli juba varasem kogemus – kasutades Perl);
- Samuti uuendada grupipoliitikate abil klientide seadistusi.
Failide kogumine grupipoliitika kaudu
Lihtsaim osa – kliendi sisenemisel oma profiili täidab ta oma õigustega mingit .bat faili, milles on kirjas:
echo off
Kui %APPDATA%RadiantViewerpacs.xml eksisteerib, kopeeri %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Nii kogunevad serveris varjatud ressursis failid pacs.xml, mille nimedes on teave selle kohta, milliselt arvutilt ja milliselt kasutajalt see konfigureeriti.
Kõige keerulisem oli oodata, kuni kõigil kasutajatel see poliitika toimib.
Konfiguratsioonide muutmine Perl skripti abil
Meile on vajalik Windowsi jaoks ettevõttelt ActiveState, ning ka moodul XML::Writer, mille saab paigaldada käsuga ppm install XML-Writer.
Isegi skript sai üsna lihtne:
use XML::Writer;
# Avame aruande kaust, töötleme failide loendit (eemaldame ebavajaliku):
$report_dir = "C:Perl64WORKPACS-xml3";
opendir(DIR, "$report_dir") or die "Ei saa avada aruande kausta!";
@report_files = readdir DIR;
shift (@report_files); # eemaldame massiivi elementidest punkti (.)
shift (@report_files); # eemaldame massiivi elementidest kahe punkti (..)
# print "@report_files";
closedir(DIR);
# Alustame failide töötlemist - ükshaaval. Peame lugema parameetri AET ja porti numbrit 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 igas XML failis unikaalseid andmeid:
my ($other1, $aet, $other2, $port, $other3) = split /"/, $line, 5;
# Kui leiame rea listener - oleme jõudnud õige reale ja saame luua uue XML:
if ($other1 =~ 'listener')
{
# Loome uue XML vajalike 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');
# Paigutame kogu valmis XML muutujasse:
my $xml = $writer->end();
# Valmistame faili ümberkirjutamiseks:
$rewritexml = $full_path_to_file;
# Kirjutame XML failid uute andmetega üle:
open (NEWXML, "> $rewritexml");
print NEWXML $xml;
close (NEWXML);
}
}
}
Tööpõhimõte:
- Avame katalooge, kuhu oleme kogunud klientide pacs.xml konfiguratsioonid, ja paigutame failide loendi massiivi skalaare (@report_files);
- Töötleme iga faili tsüklis ja loeme selle ridade kaupa;
- Kasutame split funktsiooni, et jagada iga rida viieks osaks, kasutades tsitaate eraldajana;
- Otsime rida, kus on sõna listener, ja salvestame kahte eraldi muutuja, mis on igale failile unikaalsed andmed (AE-kliendi nimi ja TCP-port);
- Seejärel vormistame lihtsalt uue XML-faili, kirjutame sellesse unikaalsed parameetrid ja seejärel lisame vajalikku hulka PACS-servereid koos nende parameetritega – st see, mille pärast kogu seda tehti)
- Kirjutame uue XML-faili vanale peale.
Pean märkima, et tegelikult kasutan seda skripti mitte täielikult automaatselt – põhimõtteliselt kopeerin kogutud konfiguratsioonid eraldi katalooge ning seejärel, skripti käivitades, muutmine toimub kogu ulatuses. Edasi on valikuline kontroll – ja konfiguratsioonid võib tagasi masinatele jaotada.
Muudetud pacs.xml failide levitamine klientidele
Lihtsaim, mis pähe tuli – teha muudatusi juba töötavas .bat failis, mis kogub klientidelt konfigureerimisi 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 "ülestõusnud" lahendus. Proovisime seda juba kaks korda (septembris 2018 ja veebruaris 2019), seni on kõik normaalne. Loomulikult ei uuenda see 100% kliente, kuid see on sellele väärtusele lähedal – ülejäänud teeme kaugtööd. Skript on .
Allikas: habr.com
