Cambiar a configuración do programa mentres se gardan os parámetros persoais

prehistoria

Unha organización médica implementou solucións baseadas en servidores Orthanc PACS e cliente DICOM Radiant. Durante a configuración, descubrimos que cada cliente DICOM debe describirse nos servidores PACS do seguinte xeito:

  • Nome do cliente
  • Nome AE (debe ser único)
  • Un porto TCP que se abre automaticamente no lado do cliente e recibe enquisas DICOM do servidor PACS (é dicir, o servidor empúxaas cara ao cliente, iniciando a conexión primeiro)
  • Enderezo IP

Despois de configurar Radiant, os clientes recibiron a seguinte reflexión: para cada cliente, a configuración do software cos parámetros anteriores provocou que o ficheiro se enchese pacs.xml, que se atopaba no perfil do usuario (ruta: %APPDATA%RadiantViewerpacs.xml). Ao mesmo tempo, a configuración dun cliente difería doutro en polo menos dous parámetros (o nome de AE ​​é diferente para todos e o porto é basicamente o mesmo, excepto para os clientes de terminais que se executan no mesmo servidor; alí os portos tamén tiñan para ser asignado diferente).

Exemplo de ficheiro pacs.xml por Ligazón:

Durante uns seis meses todo estivo ben, o sistema comezou a funcionar... e despois chegounos”baixo a auga pedras"

  • Necesitamos poñer en funcionamento varios novos servidores PACS que substituirán aos antigos (onde o espazo no disco comezou a esgotar). Servidores PACS en máquinas virtuais, pero non é do que estamos a falar;
  • Necesitamos cambiar dalgunha maneira centralmente as configuracións únicas (con dous parámetros diferentes) en 200 máquinas (o seu número aumentaba regularmente);
  • Tendo en conta a taxa de crecemento dos volumes de enquisas, é necesaria unha solución non só unha vez, senón repetida e regularmente (por exemplo, unha vez cada 1-3 meses).

A solución está a continuación.

Elixir ferramentas para resolver un problema

Nun primeiro momento, houbo intentos de atopar algunha solución que modificase o ficheiro pacs.xml no lado do cliente e fixera cambios na lista de servidores PACS sen afectar o nome AE e a configuración do porto TCP. Os clientes de Windows daquela estaban baseados tanto en Windows XP como en Windows 7, polo que houbo intentos de escribir algo así baseado en VBScript. Pero, por desgraza, non foi posible dominar tal tarefa, debido á total falta de experiencia en escribir algo complexo e completo nesta lingua. Os intentos de atopar e reescribir tampouco foron exitosos (hai que ter en conta que xa tiña un plan diferente na miña cabeza, polo que non traballei con VBScript durante máis de 3-4 horas).

Ao final decidín a seguinte solución:

  • Usando a política de grupo, recompila todos os ficheiros pacs.xml nun só lugar en calquera servidor dun recurso de rede;
  • Cambiar ficheiros en masa (xa tiña experiencia en resolver este tipo de problemas usando Perl);
  • Tamén use políticas de grupo para actualizar a configuración do cliente.

Recopilación de ficheiros mediante a política de grupo

A parte máis sinxela é que cando un cliente inicia sesión no seu perfil, el, cos seus dereitos, executa un determinado ficheiro .bat, que indica:

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

Así, os ficheiros pacs.xml acumularanse no servidor nun recurso oculto, cuxo nome contén información desde que ordenador e desde que usuario se copiou esta configuración.

O máis difícil foi esperar a que esta política funcionase para todos os usuarios.

Cambiar configuracións usando un script Perl

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

O guión en si resultou moi sinxelo:

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

O principio do seu funcionamento:

  • Abrimos o directorio no que recollemos as configuracións pacs.xml dos clientes e colocamos a lista de ficheiros nunha matriz de escalares (@report_files);
  • Nun bucle, procesamos un ficheiro á vez e lemos liña por liña;
  • Usando split, dividimos cada liña en 5 partes, usando comiñas como separador;
  • Atopamos unha liña coa palabra escoita e colocamos datos únicos para cada ficheiro (nome de cliente AE e número de porto TCP) en dúas variables;
  • Despois diso, simplemente xeramos un novo ficheiro XML, introducimos parámetros únicos nel e, a continuación, inserimos o número necesario de servidores PACS cos seus parámetros - aqueles. para que comezou todo)
  • Reescribimos o novo ficheiro XML enriba do antigo.

Nótese que, de feito, non uso este script de forma completamente automática; de feito, copio as configuracións recollidas nun directorio separado e despois executo o script e cámbioas todas en masa. A continuación, unha comprobación aleatoria e as configuracións pódense distribuír de novo ás máquinas.

Distribuíndo ficheiros pacs.xml modificados aos clientes

O máis sinxelo que se me ocorreu foi facer cambios no ficheiro .bat que xa funcionaba que recolle configuracións dos clientes e engadir a liña:

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

O ficheiro .bat final ten o seguinte aspecto:

@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

é así"xeonllo"solución. Xa o probamos dúas veces (en setembro de 2018 e febreiro de 2019), ata agora o voo é normal. Por suposto, non se actualiza o 100 % dos clientes, pero está preto deste valor; o resto completamos de forma remota. Guión de Ligazón.

Fonte: www.habr.com

Engadir un comentario