Промена поставки програма уз чување личних параметара

praistorija

Једна медицинска организација имплементирала је решења заснована на Ортханц ПАЦС серверима и Радиант ДИЦОМ клијенту. Током подешавања, открили смо да сваки ДИЦОМ клијент мора бити описан у ПАЦС серверима на следећи начин:

  • Име клијента
  • АЕ име (мора бити јединствено)
  • ТЦП порт који се аутоматски отвара на страни клијента и прима ДИЦОМ анкете са ПАЦС сервера (тј. сервер их гура према клијенту - прво иницирајући везу)
  • ИП адреса

Након подешавања Радиант-а, клијенти су добили следећу храну за размишљање: за сваког клијента, подешавање софтвера са горе наведеним параметрима резултирало је попуњавањем датотеке пацс.кмл, који се налазио у корисничком профилу (путња: %АППДАТА%РадиантВиеверпацс.кмл). Истовремено, конфигурација једног клијента се разликовала од другог у најмање два параметра (назив АЕ је различит за све, а порт је у суштини исти, осим за терминалне клијенте који раде на истом серверу - ту су и портови имали да се додељују различити).

Пример датотеке пацс.кмл аутора веза:

Отприлике шест месеци све је било у реду, систем је почео да ради... а онда је дошао до нас “под водом камење"

  • Морамо да пустимо у рад неколико нових ПАЦС сервера који ће заменити старе (где је простор на диску почео да понестаје). ПАЦС сервери у виртуелним машинама, али то није оно о чему говоримо;
  • Морамо некако централно променити јединствене конфигурације (са два различита параметра) на 200 машина (њихов број се редовно повећавао);
  • С обзиром на стопу раста обима истраживања, решење је потребно не само једном, већ реплицирано и редовно (на пример, једном у 1-3 месеци).

Решење је испод.

Избор алата за решавање проблема

У почетку је било покушаја да се пронађе неко решење које би модификовало датотеку пацс.кмл на страни клијента и извршило измене на листи ПАЦС сервера без утицаја на АЕ име и подешавања ТЦП порта. Виндовс клијенти су у то време били засновани и на Виндовс КСП и на Виндовс 7 – па је било покушаја да се овако нешто напише на ВБСцрипт-у. Али, нажалост, није било могуће савладати такав задатак, због потпуног недостатка искуства у писању било чега сложеног и свеобухватног на овом језику. Покушаји проналажења и преписивања такође су били неуспешни (треба напоменути да сам већ имао другачији план у глави, па се нисам петљао са ВБСцрипт-ом дуже од 3-4 сата).

На крају сам се одлучио на следеће решење:

  • Користећи смернице групе, прикупите све пацс.кмл датотеке на једном месту на било ком серверу у мрежном ресурсу;
  • Масовно мењати датотеке (већ сам имао искуства у решавању таквих проблема користећи Перл);
  • Такође користите смернице групе за ажурирање подешавања клијента.

Прикупљање датотека помоћу смерница групе

Најједноставнији део је да када се клијент пријави на свој профил, он са својим правима извршава одређену .бат датотеку у којој пише:

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

Дакле, датотеке пацс.кмл ће се акумулирати на серверу у скривеном ресурсу, чије име садржи информације са ког рачунара и од ког корисника је ова конфигурација копирана.

Најтеже је било чекати да ова политика проради за све кориснике.

Промена конфигурација помоћу Перл скрипте

Ми требамо Ацтиве Перл за Виндовс из АцтивеСтате, као и КСМЛ::Вритер модул, који се може инсталирати помоћу команде ппм инсталирајте КСМЛ-Вритер.

Сама скрипта се показала прилично једноставном:

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

Принцип његовог рада:

  • Отварамо директоријум у коме смо сакупили пацс.кмл конфигурације од клијената и смештамо листу датотека у низ скалара (@репорт_филес);
  • У петљи обрађујемо једну по једну датотеку и читамо је ред по ред;
  • Користећи сплит, поделимо сваки ред на 5 делова, користећи наводнике као сепаратор;
  • Проналазимо ред са речју слушалац и стављамо податке јединствене за сваку датотеку (АЕ име клијента и број ТЦП порта) у две променљиве;
  • Након овога, једноставно генеришемо нову КСМЛ датотеку, унесемо јединствене параметре у њу и затим убацимо потребан број ПАЦС сервера са њиховим параметрима - оне. због чега је све почело)
  • Преписујемо нову КСМЛ датотеку на стару.

Треба напоменути да у ствари, ја не користим ову скрипту потпуно аутоматски – у ствари, копирам прикупљене конфигурације у посебан директоријум и затим покренем скрипту и све их масовно мењам. Следеће, насумична провера - и конфигурације се могу дистрибуирати назад на машине.

Дистрибуција модификованих пацс.кмл датотека клијентима

Најједноставније што ми је пало на памет је било да извршите измене у већ радном .бат фајлу који прикупља конфигурације од клијената и додате ред:

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

Коначна .бат датотека изгледа овако:

@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% клијената, али је близу ове вредности - остало завршавамо даљински. Аутор сценарија веза.

Извор: ввв.хабр.цом

Додај коментар