Verander programinstellings terwyl persoonlike instellings gestoor word

voorgeskiedenis

Een mediese organisasie het oplossings geïmplementeer gebaseer op Orthanc PACS-bedieners en Radiant DICOM-kliënt. Tydens opstelling het ons uitgevind dat elke DICOM-kliënt soos volg in PACS-bedieners beskryf moet word:

  • Kliënt Naam
  • AE-naam (moet uniek wees)
  • 'n TCP-poort wat outomaties aan die kliëntkant oopmaak en DICOM-opnames van die PACS-bediener ontvang (m.a.w. die bediener stoot hulle na die kliënt toe - en begin eers die verbinding)
  • IP-adres

Nadat Radiant opgestel is, het kliënte die volgende stof tot nadenke ontvang: vir elke kliënt het die opstel van die sagteware met die bogenoemde parameters daartoe gelei dat die lêer gevul is pacs.xml, wat in die gebruikersprofiel geleë was (pad: %APPDATA%RadiantViewerpacs.xml). Terselfdertyd het die konfigurasie van een kliënt in ten minste twee parameters van 'n ander verskil (die AE-naam verskil vir almal, en die poort is basies dieselfde, behalwe vir terminale kliënte wat op dieselfde bediener loop - daar het die poorte ook anders toegewys te word).

Voorbeeld pacs.xml lêer deur skakel:

Vir omtrent ses maande was alles in orde, die stelsel het begin werk... en toe kom dit by ons “onder water klippe'

  • Ons moet verskeie nuwe PACS-bedieners in werking stel wat die oues sal vervang (waar skyfspasie begin opraak het). PACS-bedieners in virtuele masjiene, maar dit is nie waarvan ons praat nie;
  • Ons moet op een of ander manier unieke konfigurasies (met twee verskillende parameters) op 200 masjiene sentraal verander (hulle het gereeld toegeneem);
  • Met inagneming van die groeikoers van opnamevolumes, is 'n oplossing nie net een keer nodig nie, maar herhaal en gereeld (byvoorbeeld een keer elke 1-3 maande).

Die oplossing is hieronder.

Die keuse van gereedskap om 'n probleem op te los

Aanvanklik was daar pogings om 'n oplossing te vind wat die pacs.xml-lêer aan die kliëntkant sou verander en veranderinge aan die lys van PACS-bedieners sou maak sonder om die AE-naam en TCP-poortinstellings te beïnvloed. Windows-kliënte was destyds op beide Windows XP en Windows 7 gebaseer - so daar was pogings om so iets op VBScript te skryf. Maar helaas, dit was nie moontlik om so 'n taak te bemeester nie, weens die algehele gebrek aan ervaring om enigiets kompleks en kompleks in hierdie taal te skryf. Pogings om te vind en te herskryf was ook onsuksesvol (daar moet kennis geneem word dat ek reeds 'n ander plan in my kop gehad het, so ek het nie langer as 3-4 uur met VBScript gevroetel nie).

Ek het uiteindelik op die volgende oplossing besluit:

  • Deur gebruik te maak van groepbeleid, versamel alle pacs.xml-lêers op een plek op enige bediener in 'n netwerkhulpbron;
  • Verander lêers massaal (ek het reeds ondervinding gehad om sulke probleme met Perl op te los);
  • Gebruik ook groepbeleide om kliëntinstellings op te dateer.

Versamel lêers met behulp van Groepbeleid

Die eenvoudigste deel is dat wanneer 'n kliënt by sy profiel aanmeld, hy, met sy regte, 'n sekere .bat-lêer uitvoer, wat sê:

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

Dus sal pacs.xml-lêers op die bediener ophoop in 'n versteekte hulpbron, waarvan die naam inligting bevat van watter rekenaar en van watter gebruiker hierdie konfigurasie gekopieer is.

Die moeilikste ding was om te wag totdat hierdie beleid vir alle gebruikers gewerk het.

Verander konfigurasies met 'n Perl-skrip

Ons sal nodig hê Aktiewe Perl vir Windows vanaf ActiveState, sowel as die XML::Writer-module, wat met die opdrag geïnstalleer kan word ppm installeer XML-Writer.

Die skrif self blyk redelik eenvoudig te wees:

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

Die beginsel van sy werking:

  • Ons maak die gids oop waarin ons pacs.xml-konfigurasies van kliënte versamel het en plaas die lys lêers in 'n verskeidenheid skalare (@report_files);
  • In 'n lus verwerk ons ​​een lêer op 'n slag en lees dit reël vir reël;
  • Deur split te gebruik, verdeel ons elke reël in 5 dele, met aanhalingstekens as 'n skeiding;
  • Ons vind 'n reël met die woord luisteraar en plaas data uniek vir elke lêer (AE-kliëntnaam en TCP-poortnommer) in twee veranderlikes;
  • Hierna genereer ons eenvoudig 'n nuwe XML-lêer, voer unieke parameters daarin in en voeg dan die vereiste aantal PACS-bedieners met hul parameters in - dié. waarvoor dit alles begin het)
  • Ons herskryf die nuwe XML-lêer bo-op die ou een.

Daar moet op gelet word dat ek in werklikheid nie hierdie skrif heeltemal outomaties gebruik nie - om die waarheid te sê, ek kopieer die versamelde konfigurasies na 'n aparte gids en hardloop dan die script en verander hulle almal massaal. Volgende, 'n ewekansige kontrole - en die konfigurasies kan terug na die masjiene versprei word.

Verspreiding van gewysigde pacs.xml-lêers aan kliënte

Die eenvoudigste ding wat by my opgekom het, was om veranderinge aan te bring aan die reeds werkende .bat-lêer wat konfigurasies van kliënte versamel en die reël by te voeg:

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

Die finale .bat-lêer lyk soos volg:

@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

Gevolgtrekking

Dit is so"knie"oplossing. Ons het dit al twee keer probeer (in September 2018 en Februarie 2019), tot dusver is die vlug normaal. Natuurlik werk nie 100% van kliënte op nie, maar dit is naby aan hierdie waarde - ons voltooi die res op afstand. Skripsie deur skakel.

Bron: will.com

Voeg 'n opmerking