Að breyta forritastillingum á meðan persónulegar breytur eru vistaðar

Forsaga

Ein læknastofnun innleiddi lausnir byggðar á Orthanc PACS netþjónum og Radiant DICOM biðlara. Við uppsetningu komumst við að því að hverjum DICOM biðlara verður að lýsa á PACS netþjónum sem hér segir:

  • Nafn viðskiptavinar
  • AE nafn (verður að vera einstakt)
  • TCP tengi sem opnast sjálfkrafa á biðlarahlið og tekur á móti DICOM könnunum frá PACS þjóninum (þ.e. þjónninn ýtir þeim í átt að biðlaranum - byrjar tenginguna fyrst)
  • IP tölu

Eftir uppsetningu Radiant fengu viðskiptavinir eftirfarandi umhugsunarefni: fyrir hvern viðskiptavin, uppsetning hugbúnaðarins með ofangreindum breytum leiddi til þess að skráin var fyllt út pacs.xml, sem var staðsett í notendasniðinu (slóð: %APPDATA%RadiantViewerpacs.xml). Á sama tíma var uppsetning eins biðlara frábrugðin öðrum í að minnsta kosti tveimur breytum (AE nafnið er mismunandi fyrir alla, og gáttin er í grundvallaratriðum sú sama, nema fyrir útstöðvarbiðlara sem keyra á sama netþjóni - þar höfðu portin líka til að úthluta öðruvísi).

Dæmi um pacs.xml skrá eftir tengill:

Í um það bil hálft ár var allt í lagi, kerfið fór að virka... og svo kom það til okkar “neðansjávar steinar'

  • Við þurfum að taka í notkun nokkra nýja PACS netþjóna sem munu leysa þá gömlu af hólmi (þar sem pláss er farið að klárast). PACS netþjónar í sýndarvélum, en það er ekki það sem við erum að tala um;
  • Við þurfum einhvern veginn að breyta einstökum stillingum miðlægt (með tveimur mismunandi breytum) á 200 vélum (fjöldi þeirra jókst reglulega);
  • Með hliðsjón af vexti könnunarmagns þarf lausn ekki bara einu sinni heldur endurtaka og reglulega (til dæmis einu sinni á 1-3 mánaða fresti).

Lausnin er hér að neðan.

Að velja verkfæri til að leysa vandamál

Í fyrstu var reynt að finna einhverja lausn sem myndi breyta pacs.xml skránni á biðlarahlið og gera breytingar á listanum yfir PACS netþjóna án þess að hafa áhrif á AE nafn og TCP tengistillingar. Windows biðlarar á þeim tíma voru byggðir á bæði Windows XP og Windows 7 - svo það voru tilraunir til að skrifa eitthvað svona byggt á VBScript. En því miður, það var ekki hægt að ná tökum á slíku verkefni, vegna algjörs skorts á reynslu í að skrifa eitthvað flókið og yfirgripsmikið á þessu tungumáli. Tilraunir til að finna og endurskrifa voru líka árangurslausar (það skal tekið fram að ég var þegar með aðra áætlun í hausnum á mér, svo ég var ekki að fikta í VBScript í meira en 3-4 klukkustundir).

Að lokum ákvað ég að finna eftirfarandi lausn:

  • Með því að nota hópstefnu, safnaðu öllum pacs.xml skrám á einum stað á hvaða netþjóni sem er í nettilföngum;
  • Breyta skrám í massavís (ég hafði þegar reynslu af því að leysa slík vandamál með Perl);
  • Notaðu einnig hópstefnur til að uppfæra biðlarastillingar.

Að safna skrám með því að nota hópstefnu

Einfaldast er að þegar viðskiptavinur skráir sig inn á prófílinn sinn, keyrir hann, með réttindi sín, ákveðna .bat skrá sem segir:

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

Þannig munu pacs.xml skrár safnast fyrir á þjóninum í falinni auðlind, nafnið á henni inniheldur upplýsingar frá hvaða tölvu og frá hvaða notanda þessi stilling var afrituð.

Það erfiðasta var að bíða þar til þessi stefna virkaði fyrir alla notendur.

Breyting á stillingum með Perl skriftu

Við munum þurfa Virkur Perl fyrir Windows frá ActiveState, sem og XML::Writer mát, sem hægt er að setja upp með skipuninni ppm setja upp XML-Writer.

Handritið sjálft reyndist frekar einfalt:

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

Meginreglan um starfsemi þess:

  • Við opnum möppuna þar sem við höfum safnað pacs.xml stillingum frá viðskiptavinum og setjum lista yfir skrár í fjölda mælikvarða (@report_files);
  • Í lykkju vinnum við eina skrá í einu og lesum hana línu fyrir línu;
  • Með því að nota skipt skiptum við hverri línu í 5 hluta og notum gæsalappir sem skilju;
  • Við finnum línu með orðinu hlustandi og setjum gögn einstök fyrir hverja skrá (AE viðskiptavinarheiti og TCP gáttarnúmer) í tvær breytur;
  • Eftir þetta búum við einfaldlega til nýja XML skrá, sláum inn einstaka færibreytur inn í hana og setjum svo inn nauðsynlegan fjölda PACS netþjóna með breytum þeirra - þeim. til hvers þetta byrjaði)
  • Við endurskrifum nýju XML skrána ofan á þá gömlu.

Það skal tekið fram að í rauninni nota ég þetta script ekki alveg sjálfkrafa - í raun afrita ég safnaðar stillingar í sérstaka möppu og keyri svo scriptið og breyti þeim öllum í massavís. Næst, slembiskoðun - og hægt er að dreifa stillingunum aftur á vélarnar.

Að dreifa breyttum pacs.xml skrám til viðskiptavina

Það einfaldasta sem mér datt í hug var að gera breytingar á .bat skránni sem þegar virkar sem safnar stillingum frá viðskiptavinum og bæta við línunni:

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

Loka .bat skráin lítur svona út:

@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

Ályktun

Þetta er svona"hné"lausn. Við höfum þegar reynt það tvisvar (í september 2018 og febrúar 2019), hingað til er flugið eðlilegt. Auðvitað, ekki 100% viðskiptavina uppfæra, en það er nálægt þessu gildi - við klárum afganginn lítillega. Handrit eftir tengill.

Heimild: www.habr.com

Bæta við athugasemd