Ndryshimi i cilësimeve të programit gjatë ruajtjes së parametrave personalë

parahistorinë

Një organizatë mjekësore zbatoi zgjidhje të bazuara në serverët Orthanc PACS dhe klientin Radiant DICOM. Gjatë konfigurimit, zbuluam se çdo klient DICOM duhet të përshkruhet në serverët PACS si më poshtë:

  • Emri i klientit
  • Emri AE (duhet të jetë unik)
  • Një port TCP që hapet automatikisht në anën e klientit dhe merr anketat DICOM nga serveri PACS (d.m.th., serveri i shtyn ato drejt klientit - duke inicuar fillimisht lidhjen)
  • IP adresa

Pas konfigurimit të Radiant, klientët morën ushqimin e mëposhtëm për të menduar: për secilin klient, konfigurimi i softuerit me parametrat e mësipërm rezultoi në plotësimin e skedarit pacs.xml, i cili ndodhej në profilin e përdoruesit (rruga: %APPDATA%RadiantViewerpacs.xml). Në të njëjtën kohë, konfigurimi i një klienti ndryshonte nga një tjetër në të paktën dy parametra (emri AE është i ndryshëm për të gjithë, dhe porti është në thelb i njëjtë, me përjashtim të klientëve të terminalit që funksionojnë në të njëjtin server - atje portet gjithashtu kishin të caktohen ndryshe).

Shembull skedar pacs.xml nga lidhje:

Për rreth gjashtë muaj gjithçka ishte në rregull, sistemi filloi të funksiononte ... dhe më pas erdhi tek ne "nënujore gurët'

  • Duhet të vëmë në funksion disa serverë të rinj PACS që do të zëvendësojnë të vjetrit (ku hapësira në disk ka filluar të mbarojë). Serverët PACS në makinat virtuale, por nuk po flasim për këtë;
  • Duhet të ndryshojmë disi në mënyrë qendrore konfigurimet unike (me dy parametra të ndryshëm) në 200 makina (numri i tyre po rritej rregullisht);
  • Duke marrë parasysh shkallën e rritjes së vëllimeve të sondazhit, një zgjidhje është e nevojshme jo vetëm një herë, por e përsëritur dhe rregullisht (për shembull, një herë në 1-3 muaj).

Zgjidhja është më poshtë.

Zgjedhja e mjeteve për të zgjidhur një problem

Në fillim, pati përpjekje për të gjetur një zgjidhje që do të modifikonte skedarin pacs.xml në anën e klientit dhe do të bënte ndryshime në listën e serverëve PACS pa ndikuar në emrin AE dhe cilësimet e portit TCP. Klientët e Windows në atë kohë bazoheshin në Windows XP dhe Windows 7 - kështu që kishte përpjekje për të shkruar diçka të tillë bazuar në VBScript. Por mjerisht, nuk ishte e mundur të zotërohej një detyrë e tillë, për shkak të mungesës së plotë të përvojës në shkrimin e ndonjë gjëje komplekse dhe komplekse në këtë gjuhë. Përpjekjet për të gjetur dhe rishkruar ishin gjithashtu të pasuksesshme (duhet të theksohet se unë tashmë kisha një plan tjetër në kokën time, kështu që nuk u përpoqa me VBScript për më shumë se 3-4 orë).

Në fund u vendosa në zgjidhjen e mëposhtme:

  • Duke përdorur politikën e grupit, mblidhni të gjithë skedarët pacs.xml në një vend në çdo server në një burim rrjeti;
  • Ndryshoni skedarët në masë (Unë tashmë kisha përvojë në zgjidhjen e problemeve të tilla duke përdorur Perl);
  • Përdorni gjithashtu politikat e grupit për të përditësuar cilësimet e klientit.

Mbledhja e skedarëve duke përdorur Politikën e Grupit

Pjesa më e thjeshtë është se kur një klient hyn në profilin e tij, ai, me të drejtat e tij, ekzekuton një skedar të caktuar .bat, i cili thotë:

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

Kështu, skedarët pacs.xml do të grumbullohen në server në një burim të fshehur, emri i të cilit përmban informacion nga cili kompjuter dhe nga cili përdorues është kopjuar ky konfigurim.

Gjëja më e vështirë ishte të prisje derisa kjo politikë të funksiononte për të gjithë përdoruesit.

Ndryshimi i konfigurimeve duke përdorur një skript Perl

Do të na duhet Perl aktive për Windows nga ActiveState, si dhe moduli XML::Writer, i cili mund të instalohet duke përdorur komandën ppm instaloni XML-Writer.

Vetë skenari doli të ishte mjaft i thjeshtë:

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

Parimi i funksionimit të tij:

  • Ne hapim direktorinë në të cilën kemi mbledhur konfigurimet pacs.xml nga klientët dhe vendosim listën e skedarëve në një grup skalarësh (@report_files);
  • Në një cikli, ne përpunojmë një skedar në një kohë dhe e lexojmë atë rresht pas rreshti;
  • Duke përdorur ndarjen, ne ndajmë çdo rresht në 5 pjesë, duke përdorur thonjëza si ndarës;
  • Ne gjejmë një rresht me fjalën dëgjues dhe vendosim të dhëna unike për çdo skedar (emri i klientit AE dhe numri i portit TCP) në dy variabla;
  • Pas kësaj, ne thjesht gjenerojmë një skedar të ri XML, futim parametra unikë në të dhe më pas futim numrin e kërkuar të serverëve PACS me parametrat e tyre - ato. për çfarë filloi gjithçka)
  • Ne rishkruajmë skedarin e ri XML në krye të atij të vjetër.

Duhet të theksohet se në fakt, unë nuk e përdor këtë skript plotësisht automatikisht - në fakt, kopjoj konfigurimet e mbledhura në një drejtori të veçantë dhe më pas ekzekutoj skriptin dhe i ndryshoj të gjitha në masë. Më pas, një kontroll i rastësishëm - dhe konfigurimet mund të shpërndahen përsëri në makina.

Shpërndarja e skedarëve të modifikuar pacs.xml te klientët

Gjëja më e thjeshtë që më erdhi në mendje ishte të bëni ndryshime në skedarin .bat që tashmë funksionon që mbledh konfigurime nga klientët dhe shtoni rreshtin:

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

Skedari i fundit .bat duket si ky:

@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

Përfundim

eshte keshtu"gjurit"zgjidhje. Tashmë e kemi provuar dy herë (në shtator 2018 dhe shkurt 2019), deri tani fluturimi është normal. Sigurisht, jo 100% e klientëve përditësohen, por është afër kësaj vlere - ne e plotësojmë pjesën tjetër nga distanca. Skenari nga lidhje.

Burimi: www.habr.com

Shto një koment