Pagbabago ng mga setting ng program habang nagse-save ng mga personal na parameter

prehistory

Isang organisasyong medikal ang nagpatupad ng mga solusyon batay sa mga server ng Orthanc PACS at kliyente ng Radiant DICOM. Sa panahon ng pag-setup, nalaman namin na ang bawat kliyente ng DICOM ay dapat ilarawan sa mga server ng PACS tulad ng sumusunod:

  • Pangalan ng kliyente
  • AE name (dapat natatangi)
  • Isang TCP port na awtomatikong bumubukas sa panig ng kliyente at tumatanggap ng mga survey ng DICOM mula sa PACS server (ibig sabihin, itinutulak sila ng server patungo sa kliyente - pasimulan muna ang koneksyon)
  • IP address

Pagkatapos i-set up ang Radiant, natanggap ng mga kliyente ang sumusunod na pagkain para sa pag-iisip: para sa bawat kliyente, ang pag-set up ng software na may mga parameter sa itaas ay nagresulta sa pagpuno ng file pacs.xml, na matatagpuan sa profile ng gumagamit (path: %APPDATA%RadiantViewerpacs.xml). Kasabay nito, ang config ng isang kliyente ay naiiba sa isa pa sa hindi bababa sa dalawang mga parameter (ang pangalan ng AE ay iba para sa lahat, at ang port ay karaniwang pareho, maliban sa mga terminal na kliyente na tumatakbo sa parehong server - doon ang mga port ay mayroon ding iba-iba ang itatalaga).

Halimbawa ng pacs.xml file ni link:

Sa loob ng halos anim na buwan, maayos ang lahat, nagsimulang gumana ang system... at pagkatapos ay dumating sa amin "sa ilalim ng tubig ang mga batoΒ»:

  • Kailangan nating magpatakbo ng ilang bagong PACS server na papalit sa mga luma (kung saan nagsimulang maubos ang puwang sa disk). Mga server ng PACS sa mga virtual machine, ngunit hindi iyon ang pinag-uusapan natin;
  • Kailangan nating baguhin sa gitna ang mga natatanging configuration (na may dalawang magkaibang parameter) sa 200 machine (regular na tumataas ang bilang nila);
  • Isinasaalang-alang ang rate ng paglago ng mga volume ng survey, ang isang solusyon ay kailangan hindi lamang isang beses, ngunit ginagaya at regular (halimbawa, isang beses bawat 1-3 na buwan).

Nasa ibaba ang solusyon.

Pagpili ng mga tool upang malutas ang isang problema

Sa una, may mga pagtatangka na maghanap ng ilang solusyon na magbabago sa pacs.xml file sa panig ng kliyente at gumawa ng mga pagbabago sa listahan ng mga PACS server nang hindi naaapektuhan ang pangalan ng AE at mga setting ng TCP port. Ang mga kliyente ng Windows noong panahong iyon ay nakabatay sa parehong Windows XP at Windows 7 - kaya may mga pagtatangka na magsulat ng tulad nito batay sa VBScript. Ngunit sayang, hindi posible na makabisado ang gayong gawain, dahil sa kumpletong kakulangan ng karanasan sa pagsulat ng anumang kumplikado at kumplikado sa wikang ito. Ang mga pagtatangka na maghanap at muling magsulat ay hindi rin matagumpay (dapat tandaan na mayroon na akong ibang plano sa aking isipan, kaya hindi ako nakipagbiyot sa VBScript nang higit sa 3-4 na oras).

Sa huli ay naayos ko ang sumusunod na solusyon:

  • Gamit ang patakaran ng grupo, kolektahin ang lahat ng pacs.xml file sa isang lugar sa anumang server sa isang mapagkukunan ng network;
  • Baguhin ang mga file nang maramihan (mayroon na akong karanasan sa paglutas ng mga naturang problema gamit ang Perl);
  • Gumamit din ng mga patakaran ng grupo para i-update ang mga setting ng kliyente.

Pagkolekta ng mga file gamit ang Group Policy

Ang pinakasimpleng bahagi ay kapag ang isang kliyente ay nag-log in sa kanyang profile, siya, kasama ang kanyang mga karapatan, ay nagpapatupad ng isang partikular na .bat na file, na nagsasabing:

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

Kaya, ang mga pacs.xml na file ay maiipon sa server sa isang nakatagong mapagkukunan, ang pangalan nito ay naglalaman ng impormasyon mula sa kung aling computer at kung saan gumagamit ang config na ito ay kinopya.

Ang pinakamahirap na bagay ay ang maghintay hanggang sa gumana ang patakarang ito para sa lahat ng user.

Pagbabago ng mga configuration gamit ang isang Perl script

Kailangan namin Aktibong Perl para sa Windows mula sa ActiveState, pati na rin ang XML::Writer module, na maaaring i-install gamit ang command ppm i-install ang XML-Writer.

Ang script mismo ay naging medyo 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);				
			}
	}
 
}

Ang prinsipyo ng operasyon nito:

  • Binuksan namin ang direktoryo kung saan nakolekta namin ang mga configuration ng pacs.xml mula sa mga kliyente at inilalagay ang listahan ng mga file sa isang hanay ng mga scalar (@report_files);
  • Sa isang loop, pinoproseso namin ang isang file sa isang pagkakataon at basahin ito ng linya sa pamamagitan ng linya;
  • Gamit ang split, hinati namin ang bawat linya sa 5 bahagi, gamit ang mga panipi bilang separator;
  • Nakahanap kami ng linya na may salitang tagapakinig at naglalagay ng data na natatangi para sa bawat file (pangalan ng kliyente ng AE at numero ng TCP port) sa dalawang variable;
  • Pagkatapos nito, bubuo lang kami ng bagong XML file, ilagay ang mga natatanging parameter dito at pagkatapos ay ipasok ang kinakailangang bilang ng mga PACS server kasama ang kanilang mga parameter - mga. para saan nagsimula ang lahat)
  • Isinulat namin muli ang bagong XML file sa ibabaw ng luma.

Dapat tandaan na sa katunayan, hindi ko ganap na ginagamit ang script na ito - sa katunayan, kinokopya ko ang mga nakolektang config sa isang hiwalay na direktoryo at pagkatapos ay patakbuhin ang script at baguhin ang lahat ng ito nang maramihan. Susunod, isang random check - at ang mga config ay maaaring ipamahagi pabalik sa mga makina.

Pamamahagi ng binagong pacs.xml file sa mga kliyente

Ang pinakasimpleng bagay na naisip ay gumawa ng mga pagbabago sa gumagana na .bat file na nangongolekta ng mga configuration mula sa mga kliyente at idagdag ang linya:

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

Ang panghuling .bat na file ay ganito ang hitsura:

@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

Konklusyon

Parang ganito iyan "tuhod"solusyon. Dalawang beses na namin itong sinubukan (sa Setyembre 2018 at Pebrero 2019), sa ngayon ay normal ang paglipad. Siyempre, hindi 100% ng mga kliyente ang nag-a-update, ngunit malapit ito sa halagang ito - kinukumpleto namin ang iba sa malayo. Iskrip ni link.

Pinagmulan: www.habr.com

Magdagdag ng komento