Programmas iestatījumu maiņa, vienlaikus saglabājot personiskos parametrus

Aizvēsture

Viena medicīnas organizācija ieviesa risinājumus, kuru pamatā ir Orthanc PACS serveri un Radiant DICOM klients. Iestatīšanas laikā mēs noskaidrojām, ka katrs DICOM klients PACS serveros jāapraksta šādi:

  • Klienta vārds
  • AE nosaukums (jābūt unikālam)
  • TCP ports, kas automātiski tiek atvērts klienta pusē un saņem DICOM aptaujas no PACS servera (t.i., serveris virza tos klienta virzienā, vispirms uzsākot savienojumu)
  • IP adrese

Pēc Radiant iestatīšanas klienti saņēma šādu vielu pārdomām: katram klientam, iestatot programmatūru ar iepriekš minētajiem parametriem, fails tika aizpildīts. pacs.xml, kas atradās lietotāja profilā (ceļš: %APPDATA%RadiantViewerpacs.xml). Tajā pašā laikā viena klienta konfigurācija no cita atšķīrās vismaz ar diviem parametriem (AE nosaukums visiem ir atšķirīgs, un ports būtībā ir vienāds, izņemot termināļa klientus, kas darbojas vienā serverī - tur arī portiem bija piešķirt savādāk).

Pacs.xml faila piemērs, autors saite:

Apmēram sešus mēnešus viss bija kārtībā, sistēma sāka darboties... un tad tā nonāca pie mums.zem ūdens akmeņi"

  • Mums ir jānodod ekspluatācijā vairāki jauni PACS serveri, kas aizstās vecos (kur diskā ir sākusies vieta). PACS serveri virtuālajās mašīnās, taču mēs nerunājam par to;
  • Mums kaut kā centralizēti jāmaina unikālas konfigurācijas (ar diviem dažādiem parametriem) 200 mašīnām (to skaits regulāri pieauga);
  • Ņemot vērā aptauju apjomu pieauguma tempus, risinājums ir nepieciešams ne tikai vienu reizi, bet gan atkārtoti un regulāri (piemēram, reizi 1-3 mēnešos).

Risinājums ir zemāk.

Rīku izvēle problēmas risināšanai

Sākumā tika mēģināts atrast kādu risinājumu, kas modificētu pacs.xml failu klienta pusē un veiktu izmaiņas PACS serveru sarakstā, neietekmējot AE nosaukumu un TCP porta iestatījumus. Windows klienti tajā laikā balstījās gan uz Windows XP, gan uz Windows 7 – tātad bija mēģinājumi kaut ko tādu uzrakstīt uz VBScript bāzes. Bet diemžēl nebija iespējams apgūt šādu uzdevumu, jo trūka pieredzes rakstīt kaut ko sarežģītu un visaptverošu šajā valodā. Mēģinājumi atrast un pārrakstīt arī bija nesekmīgi (jāpiebilst, ka man galvā jau bija cits plāns, tāpēc ar VBScript neķēros ilgāk par 3-4 stundām).

Galu galā es izvēlējos šādu risinājumu:

  • Izmantojot grupas politiku, apkopojiet visus pacs.xml failus vienuviet jebkurā tīkla resursa serverī;
  • Masveidā mainīt failus (man jau bija pieredze šādu problēmu risināšanā, izmantojot Perl);
  • Izmantojiet arī grupas politikas, lai atjauninātu klienta iestatījumus.

Failu apkopošana, izmantojot grupas politiku

Vienkāršākais ir tas, ka klients, piesakoties savā profilā, ar savām tiesībām izpilda noteiktu .bat failu, kurā ir norādīts:

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

Tādējādi pacs.xml faili uzkrāsies serverī slēptā resursā, kura nosaukumā ir informācija, no kura datora un no kura lietotāja šī konfigurācija tika kopēta.

Visgrūtākais bija gaidīt, kamēr šī politika darbosies visiem lietotājiem.

Konfigurāciju maiņa, izmantojot Perl skriptu

Mums vajadzēs Aktīvā Perl operētājsistēmai Windows no ActiveState, kā arī XML::Writer moduli, ko var instalēt, izmantojot komandu ppm instalējiet XML-Writer.

Pats skripts izrādījās diezgan vienkāršs:

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

Tās darbības princips:

  • Mēs atveram direktoriju, kurā esam apkopojuši pacs.xml konfigurācijas no klientiem, un ievietojam failu sarakstu skalāru masīvā (@report_files);
  • Ciklā mēs apstrādājam vienu failu vienlaikus un lasām to rindiņu pa rindiņai;
  • Izmantojot split, mēs sadalām katru rindiņu 5 daļās, kā atdalītāju izmantojot pēdiņas;
  • Mēs atrodam rindu ar vārdu klausītājs un ievietojam katram failam unikālus datus (AE klienta nosaukumu un TCP porta numuru) divos mainīgajos;
  • Pēc tam mēs vienkārši ģenerējam jaunu XML failu, ievadām tajā unikālus parametrus un pēc tam ievietojam nepieciešamo PACS serveru skaitu ar to parametriem - tie. ar ko tas viss sākās)
  • Mēs pārrakstām jauno XML failu virs vecā.

Jāpiebilst, ka patiesībā es šo skriptu neizmantoju pilnīgi automātiski - patiesībā es iekopēju savāktās konfigurācijas atsevišķā direktorijā un pēc tam palaidu skriptu un masveidā mainu visas. Pēc tam izlases veida pārbaude - un konfigurācijas var izplatīt atpakaļ mašīnām.

Modificētu pacs.xml failu izplatīšana klientiem

Vienkāršākā lieta, kas ienāca prātā, bija veikt izmaiņas jau strādājošajā .bat failā, kas apkopo konfigurācijas no klientiem, un pievienot rindiņu:

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

Galīgais .bat fails izskatās šādi:

@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

Secinājums

Tas ir šādi"celis"risinājums. Esam jau izmēģinājuši divas reizes (2018. gada septembrī un 2019. gada februārī), pagaidām lidojums normāls. Protams, ne 100% klientu atjaunina, taču tas ir tuvu šai vērtībai – pārējo veicam attālināti. Scenārija autors saite.

Avots: www.habr.com

Pievieno komentāru