Тағир додани танзимоти барнома ҳангоми нигоҳ доштани параметрҳои шахсӣ

prehistory

Як ташкилоти тиббӣ ҳалли худро дар асоси серверҳои Orthanc PACS ва муштарии Radiant DICOM амалӣ намуд. Ҳангоми насб, мо фаҳмидем, ки ҳар як муштарии DICOM бояд дар серверҳои PACS ба таври зерин тавсиф карда шавад:

  • Номи муштарӣ
  • Номи AE (бояд беназир бошад)
  • Порти TCP, ки ба таври худкор дар тарафи муштарӣ кушода мешавад ва аз сервери PACS пурсишҳои DICOM-ро мегирад (яъне сервер онҳоро ба сӯи муштарӣ тела медиҳад - аввал пайвастшавиро оғоз мекунад)
  • Суроғаи IP

Пас аз насб кардани Radiant, мизоҷон ғизои зеринро барои андеша гирифтанд: барои ҳар як муштарӣ, насб кардани нармафзор бо параметрҳои дар боло овардашуда боиси пур шудани файл гардид. pacs.xml, ки дар профили корбар ҷойгир шудааст (роҳ: %APPDATA%RadiantViewerpacs.xml). Дар айни замон, конфигуратсияи як муштарӣ аз дигараш на камтар аз ду параметр фарқ мекард (номи AE барои ҳама гуногун аст ва порт асосан якхела аст, ба истиснои мизоҷони терминалӣ, ки дар як сервер кор мекунанд - дар он ҷо портҳо низ буданд гуногун таъин карда шавад).

Намунаи файли pacs.xml аз ҷониби пайванд:

Тақрибан шаш моҳ ҳама чиз хуб буд, система ба кор даромад... ва он гоҳ ба мо расид "зери об сангҳо»:

  • Мо бояд якчанд серверҳои нави PACS-ро ба кор андозем, ки серверҳои кӯҳнаро иваз мекунанд (дар он ҷо фазои диск тамом шудааст). Серверҳои PACS дар мошинҳои виртуалӣ, аммо ин чизе нест, ки мо дар бораи он гап мезанем;
  • Мо бояд ба таври мутамарказ конфигуратсияҳои беназирро (бо ду параметрҳои гуногун) дар 200 мошин иваз кунем (шумораи онҳо мунтазам зиёд мешуд);
  • Бо назардошти суръати афзоиши ҳаҷми тадқиқот, ҳалли на танҳо як маротиба, балки такрор ва мунтазам (масалан, як маротиба дар 1-3 моҳ) лозим аст.

Ҳалли дар поён оварда шудааст.

Интихоби асбобҳо барои ҳалли мушкилот

Дар аввал, кӯшишҳо барои ёфтани баъзе ҳалли онҳо буданд, ки файли pacs.xml-ро дар тарафи муштарӣ тағир дода, ба рӯйхати серверҳои PACS бидуни таъсир ба номи AE ва танзимоти порти TCP тағирот ворид кунанд. Мизоҷони 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

ба мо лозим мешавад 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% мизоҷон навсозӣ мешавад, аммо он ба ин арзиш наздик аст - мо боқимондаро ба таври фосилавӣ анҷом медиҳем. Скрипт аз ҷониби пайванд.

Манбаъ: will.com

Илова Эзоҳ