Modifica delle impostazioni del programma salvando i parametri personali

Sfondo

Un'organizzazione medica ha implementato soluzioni basate sui server Orthanc PACS e sul client Radiant DICOM. Durante la configurazione, abbiamo scoperto che ciascun client DICOM deve essere descritto nei server PACS come segue:

  • Nome del cliente
  • Nome AE (deve essere univoco)
  • Una porta TCP che si apre automaticamente sul lato client e riceve rilevamenti DICOM dal server PACS (ovvero, il server li spinge verso il client, avviando prima la connessione)
  • Indirizzo IP

Dopo aver configurato Radiant, i clienti hanno ricevuto i seguenti spunti di riflessione: per ciascun cliente, la configurazione del software con i parametri sopra indicati ha comportato la compilazione del file pacs.xml, che si trovava nel profilo utente (percorso: %APPDATA%RadiantViewerpacs.xml). Allo stesso tempo, la configurazione di un client differiva da un altro in almeno due parametri (il nome AE è diverso per tutti e la porta è sostanzialmente la stessa, ad eccezione dei client terminali che funzionano sullo stesso server - lì anche le porte avevano essere assegnato diverso).

Esempio di file pacs.xml di collegamento:

Per circa sei mesi è andato tutto bene, il sistema ha iniziato a funzionare... e poi è arrivato a noi”subacqueo pietre"

  • Dobbiamo mettere in funzione diversi nuovi server PACS che sostituiranno quelli vecchi (dove lo spazio su disco ha iniziato a esaurirsi). Server PACS in macchine virtuali, ma non è di questo che stiamo parlando;
  • Dobbiamo in qualche modo modificare centralmente configurazioni uniche (con due parametri diversi) su 200 macchine (il loro numero aumentava regolarmente);
  • Considerando il tasso di crescita dei volumi delle indagini, è necessaria una soluzione non una sola volta, ma replicata e regolarmente (ad esempio, una volta ogni 1-3 mesi).

La soluzione è qui sotto.

Scegliere gli strumenti per risolvere un problema

Inizialmente, si è tentato di trovare una soluzione che modificasse il file pacs.xml sul lato client e apportasse modifiche all'elenco dei server PACS senza influire sul nome AE e sulle impostazioni della porta TCP. I client Windows a quel tempo erano basati sia su Windows XP che su Windows 7, quindi ci furono tentativi di scrivere qualcosa di simile basato su VBScript. Ma ahimè, non è stato possibile svolgere un compito del genere, a causa della completa mancanza di esperienza nello scrivere qualcosa di complesso e complesso in questa lingua. Anche i tentativi di trovare e riscrivere non hanno avuto successo (va notato che avevo già un piano diverso in testa, quindi non ho giocherellato con VBScript per più di 3-4 ore).

Alla fine ho optato per la seguente soluzione:

  • Utilizzando i criteri di gruppo, raccogli tutti i file pacs.xml in un unico posto su qualsiasi server in una risorsa di rete;
  • Modificare i file in massa (ho già avuto esperienza nella risoluzione di tali problemi utilizzando Perl);
  • Utilizzare anche i criteri di gruppo per aggiornare le impostazioni del client.

Raccolta di file utilizzando Criteri di gruppo

La parte più semplice è che quando un cliente accede al suo profilo, con i suoi diritti esegue un determinato file .bat, che dice:

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

Pertanto, i file pacs.xml si accumuleranno sul server in una risorsa nascosta, il cui nome contiene informazioni da quale computer e da quale utente è stata copiata questa configurazione.

La cosa più difficile è stata aspettare finché questa politica non funzionasse per tutti gli utenti.

Modifica delle configurazioni utilizzando uno script Perl

Avremo bisogno Perl attivo per Windows da ActiveState, nonché il modulo XML::Writer, che può essere installato utilizzando il comando ppm installa XML-Writer.

Lo script in sé si è rivelato piuttosto semplice:

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

Il principio del suo funzionamento:

  • Apriamo la directory in cui abbiamo raccolto le configurazioni pacs.xml dai client e posizioniamo l'elenco dei file in un array di scalari (@report_files);
  • In un ciclo, elaboriamo un file alla volta e lo leggiamo riga per riga;
  • Utilizzando split, dividiamo ogni riga in 5 parti, utilizzando le virgolette come separatore;
  • Troviamo una riga con la parola listener e inseriamo i dati univoci per ciascun file (nome del client AE e numero di porta TCP) in due variabili;
  • Successivamente, generiamo semplicemente un nuovo file XML, inseriamo parametri univoci e quindi inseriamo il numero richiesto di server PACS con i relativi parametri: quelli. per cosa è iniziato tutto)
  • Riscriviamo il nuovo file XML sopra quello vecchio.

Va notato che in realtà non utilizzo questo script in modo completamente automatico, anzi, copio le configurazioni raccolte in una directory separata, quindi eseguo lo script e le cambio tutte in massa. Successivamente, un controllo casuale e le configurazioni possono essere ridistribuite alle macchine.

Distribuzione di file pacs.xml modificati ai client

La cosa più semplice che mi è venuta in mente è stata apportare modifiche al file .bat già funzionante che raccoglie le configurazioni dai client e aggiungere la riga:

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

Il file .bat finale è simile al seguente:

@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

conclusione

È così "ginocchio"soluzione. L'abbiamo già provato due volte (a settembre 2018 e a febbraio 2019), finora il volo è normale. Naturalmente, non il 100% dei client viene aggiornato, ma è vicino a questo valore: il resto lo completiamo da remoto. Sceneggiatura di collegamento.

Fonte: habr.com

Aggiungi un commento