kabla ya historia
Shirika moja la matibabu lilitekeleza masuluhisho kulingana na seva za Orthanc PACS na mteja wa DICOM wa Radiant. Wakati wa kusanidi, tuligundua kuwa kila mteja wa DICOM lazima afafanuliwe katika seva za PACS kama ifuatavyo:
- Jina la mteja
- Jina la AE (lazima liwe la kipekee)
- Lango la TCP ambalo hufunguka kiotomatiki kwa upande wa mteja na kupokea tafiti za DICOM kutoka kwa seva ya PACS (yaani, seva inazisukuma kuelekea kwa mteja - kuanzisha muunganisho kwanza)
- Anwani ya IP
Baada ya kusanidi Radiant, wateja walipokea chakula kifuatacho cha kufikiria: kwa kila mteja, kusanidi programu na vigezo hapo juu ilisababisha faili kujazwa. pacs.xml, ambayo ilikuwa katika wasifu wa mtumiaji (njia: %APPDATA%RadiantViewerpacs.xml) Wakati huo huo, usanidi wa mteja mmoja ulitofautiana na mwingine kwa angalau vigezo viwili (jina la AE ni tofauti kwa kila mtu, na bandari kimsingi ni sawa, isipokuwa kwa wateja wa terminal wanaoendesha kwenye seva moja - hapo bandari pia zilikuwa na kupewa tofauti).
Mfano wa faili ya pacs.xml kwa
Kwa takriban miezi sita kila kitu kilikuwa sawa, mfumo ulianza kufanya kazi ... halafu ukaja kwetu "chini ya maji mawe'
- Tunahitaji kuweka katika operesheni seva kadhaa mpya za PACS ambazo zitachukua nafasi ya zile za zamani (ambapo nafasi ya diski imeanza kuisha). seva za PACS katika mashine za kawaida, lakini sio hivyo tunazungumza;
- Tunahitaji kwa namna fulani kubadilisha usanidi wa kipekee (na vigezo viwili tofauti) kwenye mashine 200 (idadi yao ilikuwa ikiongezeka mara kwa mara);
- Kwa kuzingatia kiwango cha ukuaji wa kiasi cha uchunguzi, suluhisho inahitajika si mara moja tu, lakini kuigwa na mara kwa mara (kwa mfano, mara moja kila baada ya miezi 1-3).
Kuchagua zana za kutatua tatizo
Mwanzoni, kulikuwa na majaribio ya kutafuta suluhisho ambalo lingerekebisha faili ya pacs.xml kwenye upande wa mteja na kufanya mabadiliko kwenye orodha ya seva za PACS bila kuathiri jina la AE na mipangilio ya mlango wa TCP. Wateja wa Windows wakati huo walikuwa msingi wa Windows XP na Windows 7 - kwa hivyo kulikuwa na majaribio ya kuandika kitu kama hiki kulingana na VBScript. Lakini ole, haikuwezekana kusimamia kazi kama hiyo, kwa sababu ya ukosefu kamili wa uzoefu katika kuandika chochote ngumu na kamili katika lugha hii. Majaribio ya kupata na kuandika upya pia hayakufanikiwa (inapaswa kuzingatiwa kuwa tayari nilikuwa na mpango tofauti katika kichwa changu, kwa hiyo sikufanya kazi na VBScript kwa zaidi ya saa 3-4).
Mwishowe nilitulia kwenye suluhisho lifuatalo:
- Kwa kutumia sera ya kikundi, kukusanya faili zote za pacs.xml katika sehemu moja kwenye seva yoyote katika rasilimali ya mtandao;
- Badilisha faili kwa wingi (tayari nilikuwa na uzoefu wa kutatua shida kama hizo kwa kutumia Perl);
- Pia tumia sera za kikundi kusasisha mipangilio ya mteja.
Kukusanya faili kwa kutumia Sera ya Kikundi
Sehemu rahisi zaidi ni kwamba mteja anapoingia katika wasifu wake, yeye, akiwa na haki zake, hutekeleza faili fulani ya .bat, inayosema:
echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Kwa hivyo, faili za pacs.xml zitajilimbikiza kwenye seva katika rasilimali iliyofichwa, jina ambalo lina habari kutoka kwa kompyuta gani na kutoka kwa mtumiaji gani usanidi huu ulinakiliwa.
Jambo gumu zaidi lilikuwa kusubiri hadi sera hii ifanye kazi kwa watumiaji wote.
Kubadilisha usanidi kwa kutumia hati ya Perl
Tutahitaji
Nakala yenyewe iligeuka kuwa rahisi sana:
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);
}
}
}
Kanuni ya uendeshaji wake:
- Tunafungua saraka ambayo tumekusanya usanidi wa pacs.xml kutoka kwa wateja na kuweka orodha ya faili katika safu ya scalars (@report_files);
- Katika kitanzi, tunasindika faili moja kwa wakati mmoja na kuisoma mstari kwa mstari;
- Kutumia mgawanyiko, tunagawanya kila mstari katika sehemu 5, kwa kutumia nukuu kama kitenganishi;
- Tunapata mstari na msikilizaji wa neno na kuweka data ya kipekee kwa kila faili (jina la mteja wa AE na nambari ya bandari ya TCP) katika vigezo viwili;
- Baada ya hayo, tunatoa faili mpya ya XML, ingiza vigezo vya kipekee ndani yake na kisha ingiza nambari inayotakiwa ya seva za PACS na vigezo vyao - hizo. ilianza kwa nini)
- Tunaandika upya faili mpya ya XML juu ya ya zamani.
Ikumbukwe kwamba kwa kweli, situmii hati hii moja kwa moja - kwa kweli, ninakili usanidi uliokusanywa kwenye saraka tofauti na kisha kukimbia hati na kuzibadilisha zote kwa wingi. Ifuatayo, ukaguzi wa nasibu - na usanidi unaweza kusambazwa kwa mashine.
Inasambaza faili za pacs.xml zilizobadilishwa kwa wateja
Jambo rahisi lililokuja akilini ni kufanya mabadiliko kwenye faili ya .bat ambayo tayari inafanya kazi ambayo inakusanya usanidi kutoka kwa wateja na kuongeza laini:
If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml
Faili ya mwisho ya .bat inaonekana kama hii:
@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
Hitimisho
Ni hivi"goti"suluhisho. Tayari tumejaribu mara mbili (Septemba 2018 na Februari 2019), hadi sasa safari ya ndege ni ya kawaida. Kwa kweli, sio 100% ya wateja wanaosasisha, lakini iko karibu na thamani hii - tunakamilisha iliyobaki kwa mbali. Hati kwa
Chanzo: mapenzi.com