Pristoria
Una urganizazione medica hà implementatu soluzioni basate nantu à i servitori Orthanc PACS è u cliente Radiant DICOM. Durante a stallazione, avemu scupertu chì ogni cliente DICOM deve esse descrittu in i servitori PACS cum'è seguente:
- Nome di u cliente
- Nome AE (deve esse unicu)
- Un portu TCP chì si apre automaticamente da u latu di u cliente è riceve indagini DICOM da u servitore PACS (vale à dì, u servitore li spinge versu u cliente - iniziendu a cunnessione prima)
- Indirizzu IP
Dopu a stallazione di Radiant, i clienti anu ricevutu u seguente alimentu per u pensamentu: per ogni cliente, a stallazione di u software cù i paràmetri di sopra hà risultatu in u schedariu esse pienu. pacs.xml, chì era situatu in u prufilu d'utilizatore (path: %APPDATA%RadiantViewerpacs.xml). À u listessu tempu, a cunfigurazione di un clientu differisce da l'altru in almenu dui paràmetri (u nome AE hè diversu per tutti, è u portu hè basicamente u stessu, eccettu per i clienti di terminal chì funzionanu in u stessu servitore - quì i porti avianu ancu da esse attribuiti diversi).
Esempiu pacs.xml file by
Per circa sei mesi tuttu andava bè, u sistema hà cuminciatu à travaglià ... è dopu ci hè ghjuntu "sott'acqua i petri»:
- Avemu bisognu di mette in opera parechji novi servitori PACS chì rimpiazzaranu i vechji (induve u spaziu di discu hà cuminciatu à esce). Servitori PACS in macchine virtuali, ma ùn hè micca ciò chì avemu parlatu;
- Avemu bisognu di cambià in modu cintrali cunfigurazioni uniche (cù dui parametri diffirenti) nantu à e macchine 200 (u so numeru era regularmente in crescita);
- In cunsiderà u ritmu di crescita di i volumi di l'indagine, una suluzione hè necessariu micca solu una volta, ma replicata è regularmente (per esempiu, una volta ogni 1-3 mesi).
Scelta di strumenti per risolve un prublema
À u principiu, ci sò stati tentativi di truvà una suluzione chì mudificà u schedariu pacs.xml da u cliente è fà cambiamenti à a lista di i servitori PACS senza affettà u nome AE è i paràmetri di u portu TCP. I clienti Windows in quellu tempu eranu basati nantu à Windows XP è Windows 7 - cusì ci sò stati tentativi di scrive qualcosa cusì basatu in VBScript. Ma sfurtunatamente, ùn era micca pussibule di ammaistrà un tali compitu, per via di a mancanza cumpleta di sperienza in scrive qualcosa cumplessu è cumpletu in questa lingua. I tentativi di truvà è riscrittura ùn anu micca successu (si deve esse nutatu chì aghju digià avutu un pianu diversu in a mo testa, perchè ùn aghju micca fiddle cù VBScript per più di 3-4 ore).
In fine, aghju stabilitu nantu à a seguente suluzione:
- Utilizendu a pulitica di u gruppu, cullà tutti i schedari pacs.xml in un locu in ogni servitore in una risorsa di rete;
- Cambia i fugliali in massa (aghju digià avutu sperienza in risolve tali prublemi cù Perl);
- Aduprate ancu e pulitiche di gruppu per aghjurnà i paràmetri di u cliente.
Raccolta di fugliali utilizendu a Politica di Gruppu
A parte più simplice hè chì quandu un cliente accede à u so prufilu, ellu, cù i so diritti, eseguisce un certu schedariu .bat, chì dice:
echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Cusì, i schedari pacs.xml s'acumuleranu nantu à u servitore in una risorsa oculta, u nome di quale cuntene infurmazione da quale computer è da quale utilizatore sta cunfigurazione hè stata copiata.
A cosa più difficiule era d'aspittà finu à chì sta pulitica hà travagliatu per tutti l'utilizatori.
Cambia a cunfigurazione cù un script Perl
Averemu bisognu
U script stessu hè diventatu abbastanza simplice:
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);
}
}
}
U principiu di u so funziunamentu:
- Avemu apertu u repertoriu in quale avemu cullatu cunfigurazioni pacs.xml da i clienti è mette a lista di i schedari in un array di scalari (@report_files);
- In un ciclu, processemu un schedariu à un tempu è leghjimu linea per linea;
- Utilizendu split, spartemu ogni linea in 5 parti, usendu quotes cum'è separatore;
- Truvemu una linea cù a parolla listener è postu dati unichi per ogni schedariu (nome di cliente AE è numeru di portu TCP) in dui variàbili;
- Dopu questu, simpricimenti generà un novu schedariu XML, inserite paràmetri unichi in questu è poi inserite u numeru necessariu di servitori PACS cù i so paràmetri - quelli. per ciò chì tuttu hà cuminciatu)
- Riscrivemu u novu schedariu XML sopra u vechju.
Hè da nutà chì, in fattu, ùn aghju micca aduprà stu script in modu completamente automaticamente - in fattu, copiu i cunfigurazioni cullate in un repertoriu separatu è poi eseguite u script è cambiassi tutti in massa. In seguitu, un verificatu aleatoriu - è e cunfigurazioni ponu esse distribuite à e macchine.
Distribuzione di fugliali pacs.xml mudificati à i clienti
A cosa più sèmplice chì hè vinutu in mente era di fà cambiamenti à u schedariu .bat chì hè digià travagliatu chì recullà cunfigurazioni da i clienti è aghjunghje a linea:
If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml
U schedariu .bat finali s'assumiglia cusì:
@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
cunchiusioni
Hè cusì "ghjinochju"soluzione. Avemu digià pruvatu duie volte (in settembre 2018 è ferraghju 2019), finu à quì u volu hè normale. Di sicuru, micca 100% di i clienti aghjurnà, ma hè vicinu à stu valore - compie u restu remotamente. Sceneggiatura da
Source: www.habr.com