prazgodovina
Ena zdravstvena organizacija je implementirala rešitve, ki temeljijo na strežnikih Orthanc PACS in odjemalcu Radiant DICOM. Med namestitvijo smo ugotovili, da mora biti vsak odjemalec DICOM opisan v strežnikih PACS na naslednji način:
- Ime stranke
- Ime AE (mora biti edinstveno)
- Vrata TCP, ki se samodejno odprejo na strani odjemalca in prejmejo ankete DICOM s strežnika PACS (tj. strežnik jih potisne k odjemalcu – najprej vzpostavi povezavo)
- IP naslov
Po nastavitvi Radianta so odjemalci prejeli naslednjo snov za razmislek: za vsakega odjemalca je nastavitev programske opreme z zgornjimi parametri povzročila izpolnitev datoteke pacs.xml, ki se nahaja v uporabniškem profilu (pot: %APPDATA%RadiantViewerpacs.xml). Hkrati se je konfiguracija enega odjemalca razlikovala od drugega v vsaj dveh parametrih (ime AE je za vse drugačno, vrata pa so v bistvu enaka, razen pri terminalskih odjemalcih, ki delujejo na istem strežniku - tam so imela tudi vrata biti dodeljen drugače).
Primer datoteke pacs.xml avtorja :
Kakšnih šest mesecev je bilo vse v redu, sistem je začel delovati ... potem pa je prišel do nas "pod vodo kamni»:
- Zagnati moramo več novih PACS strežnikov, ki bodo nadomestili stare (kjer je začelo zmanjkovati prostora na disku). strežniki PACS v virtualnih strojih, vendar ne govorimo o tem;
- Nekako moramo centralno spremeniti edinstvene konfiguracije (z dvema različnima parametroma) na 200 strojih (njihovo število se je redno povečevalo);
- Glede na hitrost rasti obsega ankete rešitev ni potrebna le enkrat, ampak ponovljena in redno (na primer enkrat na 1-3 mesecev).
Rešitev je spodaj.
Izbira orodij za rešitev problema
Sprva so poskušali najti rešitev, ki bi spremenila datoteko pacs.xml na strani odjemalca in spremenila seznam strežnikov PACS, ne da bi to vplivalo na ime AE in nastavitve vrat TCP. Windows stranke so bile takrat zasnovane na Windows XP in Windows 7 – zato sem poskusil napisati nekaj podobnega z uporabo VBScripta. Žal pa naloge nisem mogel obvladati zaradi popolnega pomanjkanja izkušenj s pisanjem česar koli kompleksnega in celovitega v tem jeziku. Poskusi, da bi ga našel in prepisal, so bili prav tako neuspešni (velja omeniti, da sem že imel v mislih drug načrt, zato nisem porabil več kot 3-4 ure za delo z VBScriptom).
Na koncu sem se odločil za naslednjo rešitev:
- Z uporabo pravilnika skupine zberite vse datoteke pacs.xml na enem mestu na katerem koli strežniku v omrežnem viru;
- Množično spreminjajte datoteke (že sem imel izkušnje z reševanjem takšnih težav s Perlom);
- Za posodobitev nastavitev odjemalca uporabite tudi pravilnike skupine.
Zbiranje datotek s pravilnikom skupine
Najenostavneje je, da ko se stranka prijavi v svoj profil, s svojimi pravicami zažene določeno datoteko .bat, ki pravi:
echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Tako se bodo datoteke pacs.xml kopičile na strežniku v skritem viru, katerega ime vsebuje podatke, iz katerega računalnika in od katerega uporabnika je bila ta konfiguracija kopirana.
Najtežje je bilo čakati, da ta politika deluje za vse uporabnike.
Spreminjanje konfiguracij z uporabo skripta Perl
Potrebovali bomo pod Windows iz ActiveState, kot tudi modul XML::Writer, ki ga je mogoče namestiti z ukazom ppm namestite XML-Writer.
Sam scenarij se je izkazal za precej preprostega:
use XML::Writer;
# Открываем папку с отчетами, обрабатываем ссписок (удаляем лишнее):
$report_dir = "C:Perl64WORKPACS-xml3";
opendir(DIR, "$report_dir") or die "Не могу открыть папку с отчетами!";
@report_files = readdir DIR;
shift (@report_files); # удаляем точку из элементов массива (.)
shift (@report_files); # удаляем две точки из элементов массива (..)
# print "@report_files";
closedir(DIR);
# Начинаем обрабатывать файлы - по одному за раз. Нужно считать параметр AET и номер порта в переменные.
foreach $analiz_file (@report_files)
{
$full_path_to_file="C:Perl64WORKPACS-xml3".$analiz_file;
open (INFO, $full_path_to_file);
while ($line = <INFO>)
{
# Переменные $aet и $port содержат уникальные данные для каждого XML файла:
my ($other1, $aet, $other2, $port, $other3) = split /"/, $line, 5;
# Если встречается строка listener - то мы дошли до нужной строчки и можно формировать новый XML:
if ($other1 =~ 'listener')
{
# Формируем новый XML c нужными полями и данными:
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');
# Помещаем готовый XML в переменную:
my $xml = $writer->end();
# Подготавливаем файл для перезаписи:
$rewritexml = $full_path_to_file;
# Переписываем XML файлы новыми данными:
open (NEWXML, ">$rewritexml");
print NEWXML $xml;
close (NEWXML);
}
}
}
Načelo njegovega delovanja:
- Odpremo imenik, v katerem smo zbrali konfiguracije pacs.xml od odjemalcev, in seznam datotek postavimo v matriko skalarjev (@report_files);
- V zanki obdelujemo eno datoteko naenkrat in jo beremo vrstico za vrstico;
- Z uporabo split vsako vrstico razdelimo na 5 delov, pri čemer uporabimo narekovaje kot ločilo;
- Poiščemo vrstico z besedo poslušalec in postavimo edinstvene podatke za vsako datoteko (ime odjemalca AE in številko vrat TCP) v dve spremenljivki;
- Po tem preprosto ustvarimo novo datoteko XML, vanjo vnesemo edinstvene parametre in nato vstavimo zahtevano število strežnikov PACS z njihovimi parametri - tiste. za kaj se je vse začelo)
- Novo XML datoteko prepišemo na staro.
Treba je poudariti, da dejansko tega skripta ne uporabljam popolnoma avtomatsko - v resnici zbrane konfiguracije kopiram v ločen imenik in nato poženem skript in jih vse množično spreminjam. Nato sledi naključno preverjanje - in konfiguracije se lahko razdelijo nazaj na stroje.
Distribucija spremenjenih datotek pacs.xml strankam
Najenostavnejša stvar, ki mi je prišla na misel, je bila sprememba že delujoče datoteke .bat, ki zbira konfiguracije strank, in dodajanje vrstice:
If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml
Končna datoteka .bat je videti 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
Takole je"koleno"rešitev. Dvakrat smo že poskusili (septembra 2018 in februarja 2019), zaenkrat let poteka normalno. Seveda ne posodablja 100% odjemalcev, vendar je blizu te vrednosti - ostalo opravimo na daljavo. Avtor scenarija .
Vir: www.habr.com
