Жеке параметрлерди сактоодо программанын жөндөөлөрүн өзгөртүү

prehistory

Бир медициналык уюм Orthanc PACS серверлеринин жана Radiant DICOM кардарынын негизинде чечимдерди ишке ашырган. Орнотуу учурунда биз ар бир DICOM кардары PACS серверлеринде төмөнкүчө сүрөттөлүшү керек экенин билдик:

  • Кардардын аты
  • AE аталышы (уникалдуу болушу керек)
  • Кардар тарапта автоматтык түрдө ачылуучу жана PACS серверинен DICOM сурамжылоолорун кабыл алган TCP порту (б.а. сервер аларды кардарды көздөй түртөт - биринчи туташууну баштоо)
  • IP-дарек

Radiantти орноткондон кийин, кардарлар ой жүгүртүү үчүн төмөнкү азыктарды алышты: ар бир кардар үчүн программаны жогоруда көрсөтүлгөн параметрлер менен орнотуу файлды толтурууга алып келди. pacs.xml, колдонуучунун профилинде жайгашкан (жол: %APPDATA%RadiantViewerpacs.xml). Ошол эле учурда, бир кардардын конфигурациясы экинчисинен кеминде эки параметр боюнча айырмаланган (AE аталышы ар бир адам үчүн ар башка, ал эми порт негизинен бирдей, бир эле серверде иштеген терминалдык кардарларды кошпогондо - ал жерде порттор да болгон. башкача дайындалат).

Мисал pacs.xml файлы байланыш:

Болжол менен алты ай бою баары жакшы болду, система иштей баштады... анан бизге келди "суу алдында таштар":

  • Биз эскилерин алмаштыра турган бир нече жаңы PACS серверлерин ишке киргизишибиз керек (бул жерде диск мейкиндиги түгөнүп калган). Виртуалдык машиналардагы PACS серверлери, бирок биз айтып жаткан нерсе бул эмес;
  • Биз кандайдыр бир жол менен борборлоштурулган уникалдуу конфигурацияларды (эки башка параметр менен) 200 машинада өзгөртүүбүз керек (алардын саны дайыма өсүп турган);
  • Сурамжылоо көлөмүнүн өсүү темптерин эске алуу менен, чечим бир эле жолу эмес, кайталанып жана үзгүлтүксүз (мисалы, 1-3 айда бир жолу) керек.

Чечим төмөндө.

Маселени чечүү үчүн куралдарды тандоо

Адегенде кардар тарабында pacs.xml файлын өзгөртүп, AE аталышына жана TCP портунун жөндөөлөрүнө таасир этпестен PACS серверлеринин тизмесине өзгөртүүлөрдү киргизе турган кандайдыр бир чечим табууга аракеттер болгон. Ошол убакта Windows кардарлары Windows XP жана Windows 7ге негизделген - ошондуктан VBScriptтин негизинде ушуга окшош нерсени жазуу аракеттери болгон. Бирок, тилекке каршы, бул тилде татаал жана татаал нерсени жазуу тажрыйбасынын толук жоктугунан мындай тапшырманы өздөштүрүү мүмкүн болгон жок. Табуу жана кайра жазуу аракеттери да ийгиликсиз болду (менин башымда башка план бар экенин белгилей кетүү керек, ошондуктан VBScript менен 3-4 сааттан ашык скрипка кылган жокмун).

Акырында мен төмөнкү чечимди чечтим:

  • Топтук саясатты колдонуп, бардык pacs.xml файлдарын тармак ресурсундагы каалаган серверде бир жерден чогултуңуз;
  • Файлдарды массалык түрдө өзгөртүү (менде Perl аркылуу мындай көйгөйлөрдү чечүү боюнча тажрыйбам бар);
  • Кардардын жөндөөлөрүн жаңыртуу үчүн топтук саясаттарды да колдонуңуз.

Топтук саясаттын жардамы менен файлдарды чогултуу

Эң жөнөкөй нерсе, кардар өзүнүн профилине киргенде, ал өзүнүн укуктары менен белгилүү бир .bat файлын аткарат, анда төмөнкүлөр айтылат:

echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml

Ошентип, pacs.xml файлдары серверде жашыруун ресурста топтолот, анын аталышында бул конфигурация кайсы компьютерден жана кайсы колдонуучудан көчүрүлгөнү тууралуу маалымат камтылган.

Эң кыйыны бул саясат бардык колдонуучулар үчүн иштегенге чейин күтүү болду.

Perl скриптин колдонуу менен конфигурацияларды өзгөртүү

биз керек Active Perl Windows үчүн ActiveStateден, ошондой эле XML :: Writer модулу, аны буйрук аркылуу орнотууга болот ppm XML-Writer орнотуу.

Сценарий өзү абдан жөнөкөй болуп чыкты:

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);				
			}
	}
 
}

Анын иштөө принциби:

  • Биз кардарлардан pacs.xml конфигурацияларын чогулткан каталогду ачабыз жана файлдардын тизмесин скаляр массивине жайгаштырабыз (@report_files);
  • Циклде биз бирден файлды иштетип, аны саптан сап окуйбуз;
  • Бөлүүнү колдонуп, ар бир сапты бөлүүчү катары тырмакчаларды колдонуп, 5 бөлүккө бөлөбүз;
  • Биз угуучу сөз менен сапты табабыз жана ар бир файл үчүн уникалдуу маалыматтарды (AE кардар аты жана TCP портунун номери) эки өзгөрмөгө жайгаштырабыз;
  • Андан кийин, биз жөн гана жаңы XML файлын түзүп, ага уникалдуу параметрлерди киргизип, андан кийин алардын параметрлери менен PACS серверлеринин керектүү санын киргизебиз - ошол. баары эмне үчүн башталган)
  • Биз жаңы XML файлын эски файлдын үстүнө кайра жазабыз.

Белгилей кетчү нерсе, мен чындыгында бул скрипти толугу менен автоматтык түрдө колдонбойм – чындыгында, чогултулган конфигурацияларды өзүнчө каталогго көчүрүп, анан скриптти иштетип, баарын жапырт өзгөртөм. Андан кийин, кокустук текшерүү - жана конфигурацияларды кайра машиналарга бөлүштүрсө болот.

Өзгөртүлгөн pacs.xml файлдарын кардарларга таратуу

Эсиме келген эң жөнөкөй нерсе, кардарлардан конфигурацияларды чогултуучу мурунтан эле иштеп жаткан .bat файлына өзгөртүүлөрдү киргизүү жана сапты кошуу болду:

If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml

Акыркы .bat файлы төмөнкүдөй көрүнөт:

@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

жыйынтыктоо

Бул ушундай "тизе"чечим. Биз буга чейин эки жолу аракет кылдык (2018-жылдын сентябрында жана 2019-жылдын февралында), азырынча учуу нормалдуу. Албетте, кардарлардын 100% жаңыланбайт, бирок бул мааниге жакын - калганын биз алыстан бүтүрөбүз. Сценарий жазган байланыш.

Source: www.habr.com

Комментарий кошуу