Shaxsiy parametrlarni saqlashda dastur sozlamalarini o'zgartirish

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 aloqa:

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.

Yechim quyida keltirilgan.

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 Faol Perl Windows uchun ActiveState-dan, shuningdek, buyruq yordamida o'rnatilishi mumkin bo'lgan XML::Writer moduli. ppm XML-Writer-ni o'rnating.

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 aloqa.

Manba: www.habr.com

a Izoh qo'shish