Pas historia
Në një organizatë mjekësore, u implementuan zgjidhje të bazuara në serverat PACS Orthanc dhe klientin DICOM Radiant. Gjatë konfigurimit, u zbulua se secili klient DICOM duhet të përshkruhet në serverat PACS si më poshtë:
- Emri i klientit
- Emri AE (duhet të jetë unik)
- Porti TCP, i cili hapet automatikisht në anën e klientit dhe pranoni ekzaminimet DICOM nga serveri PACS (dmth. serveri si të ishte i shtynte ato drejt klientit - duke iniciuar lidhjen i pari)
- IP-adresa
Pas konfigurimit, klientët Radiant morën informacionin e mëposhtëm për reflektim - për secilin klient, konfigurimi i softuerit me parametrat e përmendur lart çonte në plotësimin e skedarit pacs.xml, i cili ndodhej në profilin e përdoruesit (rruga: %APPDATA%RadiantViewerpacs.xml). Duke marrë parasysh këtë, konfiguarimi i një klienti dallohej nga ai i një tjetri me të paktën dy parametra (Emri AE ishte ndryshe për të gjithë, ndërsa porta në thelb ishte e njëjtë, përveç klientëve terminalë që punonin në të njëjtin server - atje portat gjithashtu duhej të emëroheshin ndryshe).
Shembulli i skedarit pacs.xml sipas :
Rreth gjashtë muaj gjithçka shkoi mirë, sistemi filloi të punojë... dhe atëherë na arritën "minat ".»:
- Na necesitamos të vendosim në punë disa serverë të rinj PACS, të cilët do të zëvendësojnë ata të vjetër (ku po mbaronte hapësira në disqe). Serverët PACS ndodhen në makina virtuale, por kjo nuk është tema këtu;
- Na nevojitet ndonjë mënyrë për të ndryshuar në mënyrë qendrore konfiguracionet unike (me dy parametra të ndryshëm) në 200 makina (numri i tyre është rritur rregullisht);
- Duke marrë parasysh ritmin e rritjes së volumit të ekzaminimeve, zgjidhja duhet të jetë jo një herë, por e riprodhueshme dhe e rregullt (p.sh., një herë çdo 3-5 muaj).
Zgjidhja më poshtë.
Zgjedhja e mjeteve për zgjidhjen e problemit
Fillimi ishte pĂ«rpjekja pĂ«r tĂ« gjetur njĂ« zgjidhje qĂ« nĂ« anĂ«n e klientit ndryshonte skedarin pacs.xml, dhe bĂ«nte ndryshime nĂ« listĂ«n e serverĂ«ve PACS, pa prekur cilĂ«simet e emrit AE dhe tĂ« portit TCP. KlientĂ«t Windows nĂ« atĂ« kohĂ« ishin nĂ« bazĂ« tĂ« Windows XP dhe Windows 7 â prandaj ndodhĂ«n pĂ«rpjekjet pĂ«r tĂ« shkruar diçka tĂ« tillĂ« nĂ« bazĂ« tĂ« VBScript. Por, fatkeqĂ«sisht â nuk arrita ta pĂ«rmbush kĂ«tĂ« detyrĂ«, pĂ«r shkak tĂ« mungesĂ«s totale tĂ« pĂ«rvojĂ«s nĂ« shkruarjen e ndonjĂ« gjĂ«je tĂ« ndĂ«rlikuar dhe komplekse nĂ« kĂ«tĂ« gjuhĂ«. PĂ«rshtatjet pĂ«r tĂ« gjetur dhe riprogramuar gjithashtu dĂ«shtuan (kĂ«tu duhet tĂ« theksohet se nĂ« kokĂ« kishte njĂ« plan tjetĂ«r, prandaj nuk e kam humbur mĂ« shumĂ« se 3-4 orĂ« me VBScript).
Si rezultat, unë u ndala në zgjidhjen e mëposhtme:
- Të mbledhësh me politikën e grupit të gjitha skedarët pacs.xml në një vend në ndonjë server në burimin e rrjetit;
- TĂ« ndryshosh skedarĂ«t si njĂ« grup (pĂ«rvoja nĂ« zgjidhjen e kĂ«tyre problemeve tashmĂ« ishte e pranishme â duke pĂ«rdorur Perl);
- Po ashtu, me ndihmën e politikave të grupit të përditësohen cilësimet e klientëve.
Mbledhja e skedarëve me ndihmën e politikës së grupit
Pjesa mĂ« e thjeshtĂ« â kur klienti hyn nĂ« profilin e tij, ai ekzekuton njĂ« skedar .bat, nĂ« tĂ« cilin Ă«shtĂ« shkruar:
echo off
Nëse egziston %APPDATA%RadiantViewerpacs.xml kopjo %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Për këtë arsye, në server do të akumulohen skedarët pacs.xml në burimin e fshehtë, emri i të cilëve përmban informacion se nga cilin kompjuter dhe cilin përdorues është kopjuar ky konfigurim.
Më e vështira ishte të prisja, kur të gjitha përdoruesit të përfundojnë këtë politikë.
Ndryshimi i konfigurimeve me anë të skriptit Perl
Na nevojitet për Windows nga kompania ActiveState, si dhe moduli XML::Writer, i cili mund të instalohet me anë të komandës ppm install XML-Writer.
Skripti vetë doli mjaft i thjeshtë:
use XML::Writer;
# Hapni dosjenë si raportet, procesoni listën (heqni të tepërtat):
$report_dir = "C:Perl64WORKPACS-xml3";
opendir(DIR, "$report_dir") or die "Nuk mund të hap dosjen e raportit!";
@report_files = readdir DIR;
shift (@report_files); # heqni pikën nga elementet e vargut (.)
shift (@report_files); # heqni dy pikë nga elementet e vargut (..)
# print "@report_files";
closedir(DIR);
# Filloni të procesoni skedarët - një për një. Duhet të lexoni parametrin AET dhe numrin e portës në variabla.
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 gjendet rreshti listener - do të thotë se kemi arritur në rreshtin e nevojshëm dhe mund të formojmë 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-in e gatshëm në variablën:
my $xml = $writer->end();
# Përgatitim skedarin për përsëritje:
$rewritexml = $full_path_to_file;
# Rwrites XML skedarët me të dhëna të reja:
open (NEWXML, "> $rewritexml");
print NEWXML $xml;
close (NEWXML);
}
}
}
Parimi i tij:
- Hapim katalogun, në të cilin kemi mbledhur konfigurimet pacs.xml nga klientët dhe vendosim listën e skedarëve në një array skalarësh (@report_files);
- Në cikël përpunojmë një skedar në një kohë dhe e lexojmë atë rresht për rresht;
- Me ndihmën e split, ndajmë secilën linjë në 5 pjesë, duke përdorur thonjëzat si ndarës;
- Gjejmë rreshtin me fjalën listener dhe vendosim në dy variabla unik për secilin skedare të dhënat (EMRI i klientit AE dhe numri i portit TCP);
- Pasi kjo, thjesht formojmĂ« njĂ« skedarin XML tĂ« ri, shkruajmĂ« nĂ« tĂ« parametrat unikĂ« dhe mĂ« pas vendosim numrin e nevojshĂ«m tĂ« serverĂ«ve PACS me parametrat e tyre â dmth, ajo pĂ«r tĂ« cilĂ«n Ă«shtĂ« bĂ«rĂ« gjithçka)
- Shkruajmë skedarin e ri XML mbi atë të vjetër.
Duhet tĂ« theksohet se nĂ« tĂ« vĂ«rtetĂ« unĂ« pĂ«rdor kĂ«tĂ« skript jo plotĂ«sisht automatikisht â nĂ« thelb kopjoj konfigurimet qĂ« po kolektohen nĂ« njĂ« katalog tĂ« veçantĂ« dhe mĂ« pas duke drejtuar skriptin i ndryshoj ato si njĂ« grup. Pastaj njĂ« kontroll selektiv â dhe konfigurimet mund tĂ« shpĂ«rndahen pĂ«rsĂ«ri nĂ« makina.
Shpërndarja e skedarëve të ndryshuar pacs.xml te klientët
Një nga idea më e thjeshta ishte të bëhen ndryshime në një skedar .bat që funksionon, i cili mbledh konfigurimet nga klientët dhe të shtohet rreshti:
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ërfundimi
Kjo Ă«shtĂ« njĂ«zgjidhje "nĂ« gjunjĂ«"."Zgjidhje". E kemi provuar tashmĂ« dy herĂ« (nĂ« Shtator 2018 dhe nĂ« Shkurt 2019), pĂ«r momentin po ecĂ«n mirĂ«. Sigurisht, nuk pĂ«rditĂ«son 100% tĂ« klientĂ«ve, por Ă«shtĂ« afĂ«r kĂ«tij numri â tĂ« tjerĂ«t po i pĂ«rfundojmĂ« nĂ« distancĂ«. Skripti pĂ«r .
Burimi: habr.com
