Cambiar la configuración del programa mientras se guardan los parámetros personales

Prehistoria

Una organización médica implementó soluciones basadas en servidores Orthanc PACS y el cliente Radiant DICOM. Durante la instalación, descubrimos que cada cliente DICOM debe describirse en los servidores PACS de la siguiente manera:

  • Nombre del cliente
  • Nombre de AE ​​(debe ser único)
  • Un puerto TCP que se abre automáticamente en el lado del cliente y recibe encuestas DICOM del servidor PACS (es decir, el servidor las envía hacia el cliente, iniciando la conexión primero)
  • Dirección IP

Después de configurar Radiant, los clientes recibieron lo siguiente en que pensar: para cada cliente, la configuración del software con los parámetros anteriores resultó en que el archivo se llenara pacs.xml, que estaba ubicado en el perfil del usuario (ruta: %APPDATA%RadiantViewerpacs.xml). Al mismo tiempo, la configuración de un cliente difería de otro en al menos dos parámetros (el nombre AE es diferente para todos y el puerto es básicamente el mismo, excepto para los clientes terminales que se ejecutan en el mismo servidor; allí los puertos también tenían para ser asignado diferente).

Ejemplo de archivo pacs.xml de enlace:

Durante unos seis meses todo estuvo bien, el sistema empezó a funcionar... y luego nos llegó”bajo el agua piedras»:

  • Necesitamos poner en funcionamiento varios servidores PACS nuevos que sustituirán a los antiguos (donde el espacio en disco ha empezado a agotarse). Servidores PACS en máquinas virtuales, pero no estamos hablando de eso;
  • Necesitamos cambiar de alguna manera de forma centralizada configuraciones únicas (con dos parámetros diferentes) en 200 máquinas (su número aumentaba regularmente);
  • Teniendo en cuenta la tasa de crecimiento del volumen de encuestas, se necesita una solución no sólo una vez, sino replicada y periódicamente (por ejemplo, una vez cada 1 a 3 meses).

La solución está a continuación.

Elegir herramientas para resolver un problema

Al principio, hubo intentos de encontrar alguna solución que modificara el archivo pacs.xml en el lado del cliente y realizara cambios en la lista de servidores PACS sin afectar el nombre de AE ​​y la configuración del puerto TCP. Los clientes de Windows en ese momento se basaban tanto en Windows XP como en Windows 7, por lo que hubo intentos de escribir algo como esto basado en VBScript. Pero, lamentablemente, no fue posible dominar tal tarea, debido a la total falta de experiencia en escribir algo complejo y complejo en este idioma. Los intentos de encontrar y reescribir tampoco tuvieron éxito (cabe señalar que ya tenía un plan diferente en mi cabeza, por lo que no jugueteé con VBScript durante más de 3 a 4 horas).

Al final me decidí por la siguiente solución:

  • Usando la política de grupo, recopile todos los archivos pacs.xml en un solo lugar en cualquier servidor en un recurso de red;
  • Cambiar archivos en masa (ya tenía experiencia resolviendo este tipo de problemas usando Perl);
  • Utilice también políticas de grupo para actualizar la configuración del cliente.

Recopilar archivos usando la política de grupo

La parte más simple es que cuando un cliente inicia sesión en su perfil, él, con sus derechos, ejecuta un determinado archivo .bat, que dice:

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

Por lo tanto, los archivos pacs.xml se acumularán en el servidor en un recurso oculto, cuyo nombre contiene información de qué computadora y de qué usuario se copió esta configuración.

Lo más difícil fue esperar hasta que esta política funcionara para todos los usuarios.

Cambiar configuraciones usando un script Perl

Necesitaremos Perl activo para Windows desde ActiveState, así como el módulo XML::Writer, que se puede instalar usando el comando ppm instalar XML-Writer.

El guión en sí resultó ser bastante simple:

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 principio de su funcionamiento:

  • Abrimos el directorio en el que hemos recopilado las configuraciones de pacs.xml de los clientes y colocamos la lista de archivos en una matriz de escalares (@report_files);
  • En un bucle, procesamos un archivo a la vez y lo leemos línea por línea;
  • Usando dividir, dividimos cada línea en 5 partes, usando comillas como separador;
  • Buscamos una línea con la palabra escucha y colocamos datos únicos para cada archivo (nombre del cliente AE y número de puerto TCP) en dos variables;
  • Después de esto, simplemente generamos un nuevo archivo XML, ingresamos parámetros únicos en él y luego insertamos la cantidad requerida de servidores PACS con sus parámetros. aquellos. para qué empezó todo)
  • Reescribimos el nuevo archivo XML encima del anterior.

Cabe señalar que, de hecho, no uso este script de forma completamente automática; de hecho, copio las configuraciones recopiladas en un directorio separado y luego ejecuto el script y las cambio todas en masa. A continuación, se realiza una verificación aleatoria y las configuraciones se pueden distribuir nuevamente a las máquinas.

Distribuir archivos pacs.xml modificados a los clientes

Lo más simple que se me ocurrió fue realizar cambios en el archivo .bat que ya funciona y que recopila las configuraciones de los clientes y agregar la línea:

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

El archivo .bat final se ve así:

@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ón

Es como esto "rodilla" solución. Ya lo hemos probado dos veces (en septiembre de 2018 y febrero de 2019), hasta el momento el vuelo es normal. Por supuesto, no el 100% de los clientes se actualizan, pero se acerca a este valor; el resto lo completamos de forma remota. Guión de enlace.

Fuente: habr.com

Añadir un comentario