Canviar la configuració del programa mentre es guarden els paràmetres personals

prehistòria

Una organització mèdica va implementar solucions basades en servidors Orthanc PACS i client DICOM Radiant. Durant la configuració, vam descobrir que cada client DICOM s'ha de descriure als servidors PACS de la següent manera:

  • Nom del client
  • Nom AE (ha de ser únic)
  • Un port TCP que s'obre automàticament al costat del client i rep les enquestes DICOM del servidor PACS (és a dir, el servidor les impulsa cap al client, iniciant primer la connexió)
  • Adreça IP

Després d'instal·lar Radiant, els clients van rebre el següent aliment per pensar: per a cada client, la configuració del programari amb els paràmetres anteriors va donar com a resultat que el fitxer s'omplia. pacs.xml, que es trobava al perfil d'usuari (camí: %APPDATA%RadiantViewerpacs.xml). Al mateix temps, la configuració d'un client era diferent d'un altre en almenys dos paràmetres (el nom de l'AE és diferent per a tothom, i el port és bàsicament el mateix, excepte per als clients de terminal que s'executen al mateix servidor; allà els ports també tenien ser assignat diferent).

Exemple de fitxer pacs.xml per enllaç:

Durant uns sis mesos tot va anar bé, el sistema va començar a funcionar... i després ens va arribar "sota l'aigua pedres'

  • Hem de posar en funcionament diversos servidors PACS nous que substituiran els antics (on l'espai en disc ha començat a esgotar-se). Servidors PACS a màquines virtuals, però no estem parlant d'això;
  • Hem de canviar d'alguna manera centralitzada configuracions úniques (amb dos paràmetres diferents) en 200 màquines (el seu nombre augmentava regularment);
  • Tenint en compte la taxa de creixement dels volums d'enquestes, cal una solució no només una vegada, sinó repetida i regularment (per exemple, un cop cada 1-3 mesos).

La solució és a continuació.

Escollir eines per resoldre un problema

Al principi, hi va haver intents de trobar alguna solució que modifiqués el fitxer pacs.xml del costat del client i fes canvis a la llista de servidors PACS sense afectar el nom de l'AE i la configuració del port TCP. Els clients de Windows en aquell moment es basaven tant en Windows XP com en Windows 7, així que hi va haver intents d'escriure alguna cosa com això basant-se en VBScript. Però, per desgràcia, no va ser possible dominar aquesta tasca, a causa de la manca total d'experiència en escriure qualsevol cosa complexa i complexa en aquesta llengua. Els intents de trobar i reescriure tampoc no van tenir èxit (cal tenir en compte que ja tenia un pla diferent al cap, així que no vaig jugar amb VBScript durant més de 3-4 hores).

Al final em vaig decidir per la següent solució:

  • Amb la política de grup, recull tots els fitxers pacs.xml en un sol lloc de qualsevol servidor d'un recurs de xarxa;
  • Canviar fitxers en massa (ja tenia experiència en resoldre aquests problemes amb Perl);
  • Utilitzeu també polítiques de grup per actualitzar la configuració del client.

Recollida de fitxers mitjançant la política de grup

La part més senzilla és que quan un client inicia sessió al seu perfil, ell, amb els seus drets, executa un determinat fitxer .bat, que diu:

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

Així, els fitxers pacs.xml s'acumularan al servidor en un recurs ocult, el nom del qual conté informació des de quin ordinador i des de quin usuari s'ha copiat aquesta configuració.

El més difícil va ser esperar fins que aquesta política funcionés per a tots els usuaris.

Canvi de configuracions mitjançant un script Perl

Necessitarem Perl actiu per a Windows d'ActiveState, així com el mòdul XML::Writer, que es pot instal·lar mitjançant l'ordre ppm instal·la XML-Writer.

El guió en si va resultar ser bastant senzill:

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

El principi del seu funcionament:

  • Obrim el directori en què hem recollit configuracions pacs.xml dels clients i col·loquem la llista de fitxers en una matriu d'escalars (@report_files);
  • En un bucle, processem un fitxer a la vegada i el llegim línia per línia;
  • Amb split, dividim cada línia en 5 parts, utilitzant cometes com a separador;
  • Trobem una línia amb la paraula listener i col·loquem dades úniques per a cada fitxer (nom del client AE i número de port TCP) en dues variables;
  • Després d'això, simplement generem un nou fitxer XML, hi introduïm paràmetres únics i, a continuació, inserim el nombre necessari de servidors PACS amb els seus paràmetres: aquells. per a què va començar tot)
  • Reescriurem el nou fitxer XML a sobre de l'antic.

Cal tenir en compte que, de fet, no faig servir aquest script de manera completament automàtica; de fet, copio les configuracions recollides en un directori separat i després executo l'script i les canvio totes en massa. A continuació, una comprovació aleatòria i les configuracions es poden tornar a distribuir a les màquines.

Distribució de fitxers pacs.xml modificats als clients

El més senzill que em va venir al cap va ser fer canvis al fitxer .bat que ja funcionava que recull configuracions dels clients i afegir la línia:

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

El fitxer .bat final té aquest aspecte:

@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

Conclusió

És així"genoll" solució. Ja ho hem provat dues vegades (el setembre del 2018 i el febrer del 2019), fins ara el vol és normal. Per descomptat, no s'actualitzen el 100% dels clients, però s'acosta a aquest valor; completem la resta de forma remota. Guió de enllaç.

Font: www.habr.com

Afegeix comentari