Forsaga
Ein læknastofnun innleiddi lausnir byggðar á Orthanc PACS netþjónum og Radiant DICOM biðlara. Við uppsetningu komumst við að því að hverjum DICOM biðlara verður að lýsa á PACS netþjónum sem hér segir:
- Nafn viðskiptavinar
- AE nafn (verður að vera einstakt)
- TCP tengi sem opnast sjálfkrafa á biðlarahlið og tekur á móti DICOM könnunum frá PACS þjóninum (þ.e. þjónninn ýtir þeim í átt að biðlaranum - byrjar tenginguna fyrst)
- IP tölu
Eftir uppsetningu Radiant fengu viðskiptavinir eftirfarandi umhugsunarefni: fyrir hvern viðskiptavin, uppsetning hugbúnaðarins með ofangreindum breytum leiddi til þess að skráin var fyllt út pacs.xml, sem var staðsett í notendasniðinu (slóð: %APPDATA%RadiantViewerpacs.xml). Á sama tíma var uppsetning eins biðlara frábrugðin öðrum í að minnsta kosti tveimur breytum (AE nafnið er mismunandi fyrir alla, og gáttin er í grundvallaratriðum sú sama, nema fyrir útstöðvarbiðlara sem keyra á sama netþjóni - þar höfðu portin líka til að úthluta öðruvísi).
Dæmi um pacs.xml skrá eftir
Í um það bil hálft ár var allt í lagi, kerfið fór að virka... og svo kom það til okkar “neðansjávar steinar'
- Við þurfum að taka í notkun nokkra nýja PACS netþjóna sem munu leysa þá gömlu af hólmi (þar sem pláss er farið að klárast). PACS netþjónar í sýndarvélum, en það er ekki það sem við erum að tala um;
- Við þurfum einhvern veginn að breyta einstökum stillingum miðlægt (með tveimur mismunandi breytum) á 200 vélum (fjöldi þeirra jókst reglulega);
- Með hliðsjón af vexti könnunarmagns þarf lausn ekki bara einu sinni heldur endurtaka og reglulega (til dæmis einu sinni á 1-3 mánaða fresti).
Að velja verkfæri til að leysa vandamál
Í fyrstu var reynt að finna einhverja lausn sem myndi breyta pacs.xml skránni á biðlarahlið og gera breytingar á listanum yfir PACS netþjóna án þess að hafa áhrif á AE nafn og TCP tengistillingar. Windows biðlarar á þeim tíma voru byggðir á bæði Windows XP og Windows 7 - svo það voru tilraunir til að skrifa eitthvað svona byggt á VBScript. En því miður, það var ekki hægt að ná tökum á slíku verkefni, vegna algjörs skorts á reynslu í að skrifa eitthvað flókið og yfirgripsmikið á þessu tungumáli. Tilraunir til að finna og endurskrifa voru líka árangurslausar (það skal tekið fram að ég var þegar með aðra áætlun í hausnum á mér, svo ég var ekki að fikta í VBScript í meira en 3-4 klukkustundir).
Að lokum ákvað ég að finna eftirfarandi lausn:
- Með því að nota hópstefnu, safnaðu öllum pacs.xml skrám á einum stað á hvaða netþjóni sem er í nettilföngum;
- Breyta skrám í massavís (ég hafði þegar reynslu af því að leysa slík vandamál með Perl);
- Notaðu einnig hópstefnur til að uppfæra biðlarastillingar.
Að safna skrám með því að nota hópstefnu
Einfaldast er að þegar viðskiptavinur skráir sig inn á prófílinn sinn, keyrir hann, með réttindi sín, ákveðna .bat skrá sem segir:
echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Þannig munu pacs.xml skrár safnast fyrir á þjóninum í falinni auðlind, nafnið á henni inniheldur upplýsingar frá hvaða tölvu og frá hvaða notanda þessi stilling var afrituð.
Það erfiðasta var að bíða þar til þessi stefna virkaði fyrir alla notendur.
Breyting á stillingum með Perl skriftu
Við munum þurfa
Handritið sjálft reyndist frekar einfalt:
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);
}
}
}
Meginreglan um starfsemi þess:
- Við opnum möppuna þar sem við höfum safnað pacs.xml stillingum frá viðskiptavinum og setjum lista yfir skrár í fjölda mælikvarða (@report_files);
- Í lykkju vinnum við eina skrá í einu og lesum hana línu fyrir línu;
- Með því að nota skipt skiptum við hverri línu í 5 hluta og notum gæsalappir sem skilju;
- Við finnum línu með orðinu hlustandi og setjum gögn einstök fyrir hverja skrá (AE viðskiptavinarheiti og TCP gáttarnúmer) í tvær breytur;
- Eftir þetta búum við einfaldlega til nýja XML skrá, sláum inn einstaka færibreytur inn í hana og setjum svo inn nauðsynlegan fjölda PACS netþjóna með breytum þeirra - þeim. til hvers þetta byrjaði)
- Við endurskrifum nýju XML skrána ofan á þá gömlu.
Það skal tekið fram að í rauninni nota ég þetta script ekki alveg sjálfkrafa - í raun afrita ég safnaðar stillingar í sérstaka möppu og keyri svo scriptið og breyti þeim öllum í massavís. Næst, slembiskoðun - og hægt er að dreifa stillingunum aftur á vélarnar.
Að dreifa breyttum pacs.xml skrám til viðskiptavina
Það einfaldasta sem mér datt í hug var að gera breytingar á .bat skránni sem þegar virkar sem safnar stillingum frá viðskiptavinum og bæta við línunni:
If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml
Loka .bat skráin lítur svona út:
@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
Ályktun
Þetta er svona"hné"lausn. Við höfum þegar reynt það tvisvar (í september 2018 og febrúar 2019), hingað til er flugið eðlilegt. Auðvitað, ekki 100% viðskiptavina uppfæra, en það er nálægt þessu gildi - við klárum afganginn lítillega. Handrit eftir
Heimild: www.habr.com