Cambia i paràmetri di u prugramma mentre salvate i paràmetri persunali

Pristoria

Una urganizazione medica hà implementatu soluzioni basate nantu à i servitori Orthanc PACS è u cliente Radiant DICOM. Durante a stallazione, avemu scupertu chì ogni cliente DICOM deve esse descrittu in i servitori PACS cum'è seguente:

  • Nome di u cliente
  • Nome AE (deve esse unicu)
  • Un portu TCP chì si apre automaticamente da u latu di u cliente è riceve indagini DICOM da u servitore PACS (vale à dì, u servitore li spinge versu u cliente - iniziendu a cunnessione prima)
  • Indirizzu IP

Dopu a stallazione di Radiant, i clienti anu ricevutu u seguente alimentu per u pensamentu: per ogni cliente, a stallazione di u software cù i paràmetri di sopra hà risultatu in u schedariu esse pienu. pacs.xml, chì era situatu in u prufilu d'utilizatore (path: %APPDATA%RadiantViewerpacs.xml). À u listessu tempu, a cunfigurazione di un clientu differisce da l'altru in almenu dui paràmetri (u nome AE hè diversu per tutti, è u portu hè basicamente u stessu, eccettu per i clienti di terminal chì funzionanu in u stessu servitore - quì i porti avianu ancu da esse attribuiti diversi).

Esempiu pacs.xml file by a lea:

Per circa sei mesi tuttu andava bè, u sistema hà cuminciatu à travaglià ... è dopu ci hè ghjuntu "sott'acqua i petri»:

  • Avemu bisognu di mette in opera parechji novi servitori PACS chì rimpiazzaranu i vechji (induve u spaziu di discu hà cuminciatu à esce). Servitori PACS in macchine virtuali, ma ùn hè micca ciò chì avemu parlatu;
  • Avemu bisognu di cambià in modu cintrali cunfigurazioni uniche (cù dui parametri diffirenti) nantu à e macchine 200 (u so numeru era regularmente in crescita);
  • In cunsiderà u ritmu di crescita di i volumi di l'indagine, una suluzione hè necessariu micca solu una volta, ma replicata è regularmente (per esempiu, una volta ogni 1-3 mesi).

A suluzione hè quì sottu.

Scelta di strumenti per risolve un prublema

À u principiu, ci sò stati tentativi di truvà una suluzione chì mudificà u schedariu pacs.xml da u cliente è fà cambiamenti à a lista di i servitori PACS senza affettà u nome AE è i paràmetri di u portu TCP. I clienti Windows in quellu tempu eranu basati nantu à Windows XP è Windows 7 - cusì ci sò stati tentativi di scrive qualcosa cusì basatu in VBScript. Ma sfurtunatamente, ùn era micca pussibule di ammaistrà un tali compitu, per via di a mancanza cumpleta di sperienza in scrive qualcosa cumplessu è cumpletu in questa lingua. I tentativi di truvà è riscrittura ùn anu micca successu (si deve esse nutatu chì aghju digià avutu un pianu diversu in a mo testa, perchè ùn aghju micca fiddle cù VBScript per più di 3-4 ore).

In fine, aghju stabilitu nantu à a seguente suluzione:

  • Utilizendu a pulitica di u gruppu, cullà tutti i schedari pacs.xml in un locu in ogni servitore in una risorsa di rete;
  • Cambia i fugliali in massa (aghju digià avutu sperienza in risolve tali prublemi cù Perl);
  • Aduprate ancu e pulitiche di gruppu per aghjurnà i paràmetri di u cliente.

Raccolta di fugliali utilizendu a Politica di Gruppu

A parte più simplice hè chì quandu un cliente accede à u so prufilu, ellu, cù i so diritti, eseguisce un certu schedariu .bat, chì dice:

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

Cusì, i schedari pacs.xml s'acumuleranu nantu à u servitore in una risorsa oculta, u nome di quale cuntene infurmazione da quale computer è da quale utilizatore sta cunfigurazione hè stata copiata.

A cosa più difficiule era d'aspittà finu à chì sta pulitica hà travagliatu per tutti l'utilizatori.

Cambia a cunfigurazione cù un script Perl

Averemu bisognu Perl attivu per Windows da ActiveState, è ancu u modulu XML::Writer, chì pò esse stallatu cù u cumandimu ppm installà XML-Writer.

U script stessu hè diventatu abbastanza simplice:

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

U principiu di u so funziunamentu:

  • Avemu apertu u repertoriu in quale avemu cullatu cunfigurazioni pacs.xml da i clienti è mette a lista di i schedari in un array di scalari (@report_files);
  • In un ciclu, processemu un schedariu à un tempu è leghjimu linea per linea;
  • Utilizendu split, spartemu ogni linea in 5 parti, usendu quotes cum'è separatore;
  • Truvemu una linea cù a parolla listener è postu dati unichi per ogni schedariu (nome di cliente AE è numeru di portu TCP) in dui variàbili;
  • Dopu questu, simpricimenti generà un novu schedariu XML, inserite paràmetri unichi in questu è poi inserite u numeru necessariu di servitori PACS cù i so paràmetri - quelli. per ciò chì tuttu hà cuminciatu)
  • Riscrivemu u novu schedariu XML sopra u vechju.

Hè da nutà chì, in fattu, ùn aghju micca aduprà stu script in modu completamente automaticamente - in fattu, copiu i cunfigurazioni cullate in un repertoriu separatu è poi eseguite u script è cambiassi tutti in massa. In seguitu, un verificatu aleatoriu - è e cunfigurazioni ponu esse distribuite à e macchine.

Distribuzione di fugliali pacs.xml mudificati à i clienti

A cosa più sèmplice chì hè vinutu in mente era di fà cambiamenti à u schedariu .bat chì hè digià travagliatu chì recullà cunfigurazioni da i clienti è aghjunghje a linea:

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

U schedariu .bat finali s'assumiglia cusì:

@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

cunchiusioni

Hè cusì "ghjinochju"soluzione. Avemu digià pruvatu duie volte (in settembre 2018 è ferraghju 2019), finu à quì u volu hè normale. Di sicuru, micca 100% di i clienti aghjurnà, ma hè vicinu à stu valore - compie u restu remotamente. Sceneggiatura da a lea.

Source: www.habr.com

Add a comment