Sana oldin
Bitta tibbiy tashkilot Orthanc PACS serverlari va Radiant DICOM mijoziga asoslangan yechimlarni amalga oshirdi. O'rnatish jarayonida biz har bir DICOM mijozi PACS serverlarida quyidagicha tavsiflanishi kerakligini aniqladik:
- Mijoz nomi
- AE nomi (noyob bo'lishi kerak)
- Mijoz tomonida avtomatik ravishda ochiladigan va PACS serveridan DICOM so'rovlarini qabul qiluvchi TCP porti (ya'ni, server ularni mijoz tomon itaradi - avval ulanishni boshlaydi)
- IP manzili
Radiantni o'rnatgandan so'ng, mijozlar o'ylash uchun quyidagi oziq-ovqatlarni oldilar: har bir mijoz uchun yuqoridagi parametrlar bilan dasturiy ta'minotni o'rnatish faylni to'ldirishga olib keldi. pacs.xml, foydalanuvchi profilida joylashgan (yo'l: %APPDATA%RadiantViewerpacs.xml). Shu bilan birga, bitta mijozning konfiguratsiyasi boshqasidan kamida ikkita parametrda farq qiladi (AE nomi hamma uchun har xil va port asosan bir xil, bir xil serverda ishlaydigan terminal mijozlaridan tashqari - u erda portlar ham mavjud edi. boshqacha tayinlanadi).
Pacs.xml fayliga misol
Taxminan olti oy davomida hamma narsa yaxshi edi, tizim ishlay boshladi ... va keyin u bizga keldi "suv ostida toshlar"
- Biz eskilarini almashtiradigan bir nechta yangi PACS serverlarini ishga tushirishimiz kerak (bu erda disk maydoni tugaydi). Virtual mashinalardagi PACS serverlari, lekin biz bu haqda gapirmayapmiz;
- Biz qandaydir tarzda 200 ta mashinada noyob konfiguratsiyalarni (ikki xil parametr bilan) markazlashtirilgan tarzda o'zgartirishimiz kerak (ularning soni muntazam ravishda oshib borardi);
- Tadqiqotlar hajmining o'sish sur'atlarini hisobga olgan holda, yechim faqat bir marta emas, balki takrorlangan va muntazam ravishda (masalan, har 1-3 oyda bir marta) kerak bo'ladi.
Muammoni hal qilish uchun vositalarni tanlash
Avvaliga mijoz tomonida pacs.xml faylini o'zgartiradigan va AE nomi va TCP port sozlamalariga ta'sir qilmasdan PACS serverlari ro'yxatiga o'zgartirishlar kiritadigan ba'zi echimlarni topishga urinishlar bo'ldi. O'sha paytda Windows mijozlari ham Windows XP, ham Windows 7 ga asoslangan edi - shuning uchun VBScript asosida shunga o'xshash narsalarni yozishga urinishlar bo'lgan. Ammo afsuski, bu tilda murakkab va murakkab narsalarni yozish tajribasining to'liq etishmasligi tufayli bunday vazifani o'zlashtirib bo'lmadi. Topish va qayta yozishga urinishlar ham muvaffaqiyatsiz tugadi (shuni ta'kidlash kerakki, mening boshimda allaqachon boshqa reja bor edi, shuning uchun men VBScript bilan 3-4 soatdan ko'proq vaqt davomida skripka qilmadim).
Oxir-oqibat men quyidagi yechimga qaror qildim:
- Guruh siyosatidan foydalanib, barcha pacs.xml fayllarini tarmoq resursidagi istalgan serverda bir joyda to'plang;
- Fayllarni ommaviy ravishda o'zgartirish (menda Perl yordamida bunday muammolarni hal qilishda tajribam bor edi);
- Shuningdek, mijoz sozlamalarini yangilash uchun guruh siyosatlaridan foydalaning.
Guruh siyosati yordamida fayllarni yig'ish
Eng oddiy narsa shundaki, mijoz o'z profiliga kirganda, u o'z huquqlari bilan ma'lum bir .bat faylini bajaradi, unda quyidagilar ko'rsatilgan:
echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Shunday qilib, pacs.xml fayllari serverda yashirin resursda to'planadi, uning nomi ushbu konfiguratsiya qaysi kompyuterdan va qaysi foydalanuvchidan ko'chirilganligi haqida ma'lumotni o'z ichiga oladi.
Eng qiyin narsa bu siyosat barcha foydalanuvchilar uchun ishlaguncha kutish edi.
Perl skripti yordamida konfiguratsiyalarni o'zgartirish
Bizga kerak bo'ladi
Skriptning o'zi juda oddiy bo'lib chiqdi:
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);
}
}
}
Uning ishlash printsipi:
- Biz mijozlardan pacs.xml konfiguratsiyalarini yig'gan katalogni ochamiz va fayllar ro'yxatini skalerlar massiviga joylashtiramiz (@report_files);
- Loopda biz bir vaqtning o'zida bitta faylni qayta ishlaymiz va uni satrga o'qiymiz;
- Split yordamida biz har bir qatorni 5 qismga ajratamiz, tirnoqlarni ajratuvchi sifatida ishlatamiz;
- Biz tinglovchi so'zi bilan qatorni topamiz va har bir fayl uchun noyob ma'lumotlarni (AE mijoz nomi va TCP port raqami) ikkita o'zgaruvchiga joylashtiramiz;
- Shundan so'ng, biz shunchaki yangi XML faylini yaratamiz, unga noyob parametrlarni kiritamiz va keyin kerakli miqdordagi PACS serverlarini parametrlari bilan kiritamiz - bular. hammasi nima uchun boshlandi)
- Biz yangi XML faylni eskisining ustiga qayta yozamiz.
Shuni ta'kidlash kerakki, aslida men bu skriptni to'liq avtomatik ravishda ishlatmayman - aslida men to'plangan konfiguratsiyalarni alohida katalogga ko'chiraman va keyin skriptni ishga tushiraman va barchasini ommaviy ravishda o'zgartiraman. Keyinchalik, tasodifiy tekshirish - va konfiguratsiyalar mashinalarga qaytarilishi mumkin.
O'zgartirilgan pacs.xml fayllarini mijozlarga tarqatish
Aqlga kelgan eng oddiy narsa, mijozlardan konfiguratsiyalarni to'playdigan allaqachon ishlaydigan .bat fayliga o'zgartirishlar kiritish va qatorni qo'shish edi:
If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml
Yakuniy .bat fayli quyidagicha ko'rinadi:
@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
xulosa
Bu shunday "tizza"echim. Biz buni ikki marta sinab ko'rdik (2018 yil sentyabr va 2019 yil fevral oylarida), hozircha parvoz normal. Albatta, mijozlarning 100% yangilanmaydi, lekin bu qiymatga yaqin - qolganlarini masofadan turib yakunlaymiz. Skript muallifi
Manba: www.habr.com