Historia e mëparshme
Në një organizatë mjekësore, janë zbatuar zgjidhje të bazuara në serverat PACS Orthanc dhe klientin DICOM Radiant. Gjatë konfigurimit u përcaktua se çdo klient DICOM duhet të përshkruhet në serverat PACS në këtë mënyrë:
- Emri i klientit
- Emri AE (duhet të jetë unik)
- Porti TCP, i cili hapet automatikisht nĂ« anĂ«n e klientit dhe merr ekzaminimet DICOM nga serveri PACS (dmth, serveri i 'dĂ«rgon' ato nĂ« drejtim tĂ« klientit â duke iniciuar lidhjen i pari)
- Adresa IP
Pas konfigurimit tĂ« klientĂ«ve Radiant, morĂ«m informacionin e mĂ«poshtĂ«m pĂ«r reflektim â çdo klient, kur konfigurohej me parametrat e pĂ«rmendur mĂ« sipĂ«r, çonte nĂ« plotĂ«simin e skedarit pacs.xml, i cili ndodhej nĂ« profilin e pĂ«rdoruesit (rruga: %APPDATA%RadiantViewerpacs.xml). MegjithatĂ«, konfigurimi i njĂ« klienti ishte ndryshe nga tjetri me tĂ« paktĂ«n dy parametra (Emri AE ishte ndryshe pĂ«r tĂ« gjithĂ«, ndĂ«rsa porta kryesisht ishte e njĂ«jtĂ«, pĂ«rveç klientĂ«ve terminalĂ« qĂ« punonin nĂ« tĂ« njĂ«jtin server â atje portat gjithashtu duhej tĂ« caktuheshin ndryshe).
Shembulli i skedarit pacs.xml sipas :
Pas rreth gjashtë muajve, gjithçka shkoi mirë, sistemi funksionoi⊠dhe papritmas e kuptuam se kishte "pengesa të fshehura»:
- Duhet të prezantojmë disa servera të rinj PACS, të cilët do të zëvendësojnë të vjetrin (ku vendi në disqe po mbaronte). Serverat PACS në makina virtuale, por kjo nuk është tema;
- Na nevojitet të ndryshojmë ndryshe konfigurimet unike (me dy parametra të ndryshëm) në 200 makina (numri i të cilave rregullisht po rritej);
- Duke marrë parasysh ritmin e rritjes së volumeve të ekzaminimeve, zgjidhja duhet të jetë jo një herë, por e ripërsëritur dhe e rregullt (p.sh., 1 herë në 3-5 muaj).
Zgjidhja më poshtë.
Zgjedhja e veglave për zgjidhjen e problemit
NĂ« fillim, ishin pĂ«rpjekje pĂ«r tĂ« gjetur ndonjĂ« zgjidhje qĂ« nĂ« anĂ«n e klientit do tĂ« ndryshonte skedarin pacs.xml dhe do tĂ« bĂ«nte ndryshime nĂ« listĂ«n e serverĂ«ve PACS, pa prekur konfigurimet e emrit AE dhe portit TCP. KlientĂ«t e Windows nĂ« atĂ« kohĂ« ishin nĂ« bazĂ« tĂ« Windows XP si dhe Windows 7 â prandaj ishin pĂ«rpjekje pĂ«r tĂ« shkruar diçka tĂ« tillĂ« nĂ« bazĂ« tĂ« VBScript. Por fatkeqĂ«sisht â nuk arritĂ«m tĂ« pĂ«rballonim njĂ« detyrĂ« tĂ« tillĂ«, pĂ«r shkak tĂ« mungesĂ«s totale tĂ« eksperiencĂ«s nĂ« shkruarjen e ndonjĂ« gjĂ«je komplekse dhe tĂ« sofistikuar nĂ« kĂ«tĂ« gjuhĂ«. PĂ«rpjekjet pĂ«r tĂ« gjetur dhe riprogramuar gjithashtu nuk kishin sukses (duhet tĂ« theksohet se nĂ« mendje kishte njĂ« plan tjetĂ«r, pĂ«r kĂ«tĂ« arsye nuk vazhdova mĂ« shumĂ« se 3-4 orĂ« me VBScript).
Si përfundim, u ndala në zgjidhjen e mëposhtme:
- Mbledhni të gjitha skedarët pacs.xml në një vend të caktuar në ndonjë server në burimin e rrjetit;
- Ndryshoni skedarët masivisht (ka pasur përvojë në zgjidhjen e këtij problemi - duke përdorur Perl);
- Gjithashtu me ndihmën e politikave grupore përmirësoni cilësimet e klientëve.
Koleksionimi i skedarëve me anë të politikës grupore
Pjesa më e thjeshtë - kur klienti hyn në profilin e tij me të drejtat e tij ai ekzekuton një skedar .bat, në të cilin është shkruar:
echo off
Nëse ekziston %APPDATA%RadiantViewerpacs.xml kopjoni %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Kështu, në serverin në burimin e fshehtë do të grumbullohen skedarët pacs.xml, në emrin e të cilëve do të ketë informacion se nga cili kompjuter dhe nga cili përdorues është kopjuar ky konfig.
Pjesa më e vështirë ishte - të prisni që kjo politikë të zbatohet për të gjithë përdoruesit.
Ndryshimi i konfigurations me anë të skriptit Perl
Na nevojitet për Windows nga kompania ActiveState, si dhe moduli XML::Writer, i cili mund të instalohet me komandën ppm install XML-Writer.
Skripti vetë doli mjaft i thjeshtë:
use XML::Writer;
# Hapni dosjen me raportet, procesoni listën (hiqni të tepërt):
$report_dir = "C:Perl64WORKPACS-xml3";
opendir(DIR, "$report_dir") or die "Nuk mund të hap dosjen me raportet!";
@report_files = readdir DIR;
shift (@report_files); # hiqni pikën nga elementet e masës (.)
shift (@report_files); # hiqni dy pikat nga elementet e masës (..)
# print "@report_files";
closedir(DIR);
# Filloni të përpunoni skedarët - një nga një. Duhet të lexoni parametrin AET dhe numrin e portit në variablat.
foreach $analiz_file (@report_files)
{
$full_path_to_file="C:Perl64WORKPACS-xml3".$analiz_file;
open (INFO, $full_path_to_file);
while ($line = )
{
# Variablat $aet dhe $port përmbajnë të dhëna unike për çdo skedar XML:
my ($other1, $aet, $other2, $port, $other3) = split /"/, $line, 5;
# Nëse hasim rreshtin listener - atëherë kemi arritur në rreshtin e duhur dhe mund të formojmë një XML të ri:
if ($other1 =~ 'listener')
{
# Formojmë XML të ri me fushat dhe të dhënat e nevojshme:
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');
# Vendosim XML të përfunduar në variablen:
my $xml = $writer->end();
# Përgatitim skedarin për rishkrim:
$rewritexml = $full_path_to_file;
# Rishkruajmë skedarët XML me të dhëna të reja:
open (NEWXML, "> $rewritexml");
print NEWXML $xml;
close (NEWXML);
}
}
}
Parimi i funksionimit të tij:
- Hapim katalogun në të cilin kemi mbledhur konfigurimet pacs.xml nga klientët dhe e vendosim listën e skedarëve në një varg skalar (@report_files);
- Në një cikël procesojmë një skedar të vetëm dhe e lexojmë atë rresht pas rreshti;
- Me ndihmën e split e ndajmë çdo rresht në 5 pjesë, duke përdorur thonjëza si ndarës;
- Gjejmë rreshtin me fjalën listener dhe e vendosim në dy variabla të veçantë për çdo skedar të dhënat unike (emri i klientit AE dhe numri i portës TCP);
- Pas kësaj thjesht formojmë një skedar të ri XML, e shkruajmë në të parametrat unike dhe më pas vendosim numrin e nevojshëm të serverëve PACS me parametrat e tyre - dmth, ajo për të cilën u bë krejt kjo)
- Rishkruajmë skedarin e ri XML mbi atë të vjetër.
Duhet theksuar se në të vërtetë unë e përdor këtë skenar jo plotësisht automatikisht - në thelb unë kopjoj konfigurimet e mbledhura në një katalog të veçantë dhe pastaj, duke e nisur skenarin, i ndryshoj ato të gjithë së bashku. Më tej kontrolli selektiv - dhe konfigurimet mund të shpërndahen përsëri në makina.
Shpërndarja e skedarëve të ndryshuar pacs.xml te klientët
Më e thjeshta që më erdhi në mendje - të bëj ndryshime në skedarin ekzistues .bat, i cili mbledh konfigurimet nga klientët dhe të shtoj këtë rresht:
Nëse ekziston %APPDATA%RadiantViewerpacs.xml kopjo /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml
Skedari përfundimtar .bat duket kështu:
@echo off
Nëse ekziston %APPDATA%RadiantViewerpacs.xml kopjo %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Nëse ekziston %APPDATA%RadiantViewerpacs.xml kopjo /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml
Përfundim
Kjo Ă«shtĂ« âzgjidhja e ândĂ«rmjetmeâMĂ« shumĂ« se dy herĂ« (nĂ« shtator 2018 dhe nĂ« shkurt 2019), deri tani funksionon normalisht. Sigurisht qĂ« nuk pĂ«rditĂ«son tĂ« gjithĂ« klientĂ«t 100%, por afĂ«r kĂ«saj vlerĂ«s - tĂ« tjerĂ«t i pĂ«rfundojmĂ« nĂ« distancĂ«. Skripti nga .
Burimi: habr.com
