Programaren ezarpenak aldatzea parametro pertsonalak gordetzean

historiaurrea

Erakunde mediko batek Orthanc PACS zerbitzarietan eta Radiant DICOM bezeroetan oinarritutako soluzioak ezarri zituen. Konfigurazioan, DICOM bezero bakoitza PACS zerbitzarietan deskribatu behar dela jakin dugu:

  • Bezeroaren izena
  • AE izena (bakarra izan behar du)
  • Bezeroaren aldean automatikoki irekitzen den TCP ataka eta PACS zerbitzaritik DICOM inkestak jasotzen dituena (hau da, zerbitzariak bezeroarengana bultzatzen ditu - konexioa hasiz lehenik)
  • IP helbidea

Radiant konfiguratu ondoren, bezeroek hausnarketa hau jaso zuten: bezero bakoitzarentzat, goiko parametroekin softwarea konfiguratuz fitxategia bete zen. pacs.xml, erabiltzailearen profilean kokatuta zegoen (bidea: %APPDATA%RadiantViewerpacs.xml). Aldi berean, bezero baten konfigurazioa bestearengandik desberdina zen gutxienez bi parametrotan (AEren izena desberdina da guztiontzat, eta portua, funtsean, berdina da, zerbitzari berean exekutatzen diren terminaleko bezeroak izan ezik - hor portuek ere bazeuden. desberdinak esleitzeko).

Pacs.xml fitxategiaren adibidea by link:

Sei hilabete inguru dena ondo egon zen, sistema funtzionatzen hasi zen... eta gero etorri zitzaigun”urpeko harriak'

  • Zenbait PACS zerbitzari berri martxan jarri behar ditugu, zaharrak ordezkatuko dituztenak (non diskoko lekua agortzen hasi den). PACS zerbitzariak makina birtualetan, baina ez da horretaz ari gara;
  • Nolabait zentralki aldatu behar ditugu konfigurazio bakarrak (bi parametro ezberdinekin) 200 makinetan (haien kopurua aldizka handitzen ari zen);
  • Inkesta-bolumenen hazkunde-tasa kontuan hartuta, irtenbide bat behar da behin bakarrik ez, baizik eta errepikatu eta aldizka (adibidez, 1-3 hilabetean behin).

Irtenbidea behean dago.

Arazo bat konpontzeko tresnak hautatzea

Hasieran, bezeroaren aldetik pacs.xml fitxategia aldatu eta PACS zerbitzarien zerrendan aldaketak egiteko AE izena eta TCP ataka ezarpenak eragin gabe irtenbideren bat aurkitzeko saiakerak izan ziren. Garai hartan Windows-eko bezeroak Windows XP eta Windows 7-n oinarritzen ziren; beraz, VBScript-en oinarritutako horrelako zerbait idazteko saiakerak egon ziren. Baina, ai, ezin izan zen horrelako zeregin bat menperatzea, hizkuntza honetan ezer konplexu eta konplexua idazteko esperientzia falta osoa zelako. Aurkitu eta berridazteko saiakerek ere ez zuten arrakastarik izan (kontuan izan behar da dagoeneko beste plan bat neukala buruan, beraz, ez nuen VBScript-ekin 3-4 ordu baino gehiagotan ibili).

Azkenean, honako irtenbide hau erabaki nuen:

  • Talde-politika erabiliz, bildu pacs.xml fitxategi guztiak toki bakarrean sareko baliabide bateko edozein zerbitzaritan;
  • Aldatu fitxategiak masiboki (lehendik ere esperientzia nuen Perl erabiliz horrelako arazoak konpontzen);
  • Erabili talde-politikak bezeroaren ezarpenak eguneratzeko.

Fitxategiak biltzea Talde-politika erabiliz

Zatirik errazena da bezero bat bere profilean saioa hasten denean, bere eskubideekin, .bat fitxategi jakin bat exekutatzen duela, hau dio:

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

Horrela, pacs.xml fitxategiak zerbitzarian pilatuko dira ezkutuko baliabide batean, zeinaren izenak konfigurazio hau zein ordenagailutatik eta zein erabiltzailetatik kopiatu den informazioa dauka.

Zailena politika honek erabiltzaile guztientzat funtzionatu arte itxarotea izan zen.

Konfigurazioak aldatzea Perl script bat erabiliz

beharko dugu Perl aktiboa ActiveState-ko Windows-erako, baita XML::Writer modulua ere, komandoa erabiliz instalatu daitekeena ppm instalatu XML-Writer.

Gidoia bera nahiko sinplea izan zen:

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

Bere funtzionamenduaren printzipioa:

  • Bezeroetatik pacs.xml konfigurazioak bildu ditugun direktorioa irekitzen dugu eta fitxategien zerrenda eskalar multzo batean jartzen dugu (@report_files);
  • Begizta batean, fitxategi bat prozesatu eta lerroz lerro irakurtzen dugu;
  • Split erabiliz, lerro bakoitza 5 zatitan banatu dugu, komatxoak bereizle gisa erabiliz;
  • Entzule hitza duen lerro bat aurkitzen dugu eta fitxategi bakoitzerako datuak (AE bezeroaren izena eta TCP ataka zenbakia) bi aldagaitan jartzen ditugu;
  • Honen ondoren, XML fitxategi berri bat sortu besterik ez dugu, parametro bakarrak sartu eta gero PACS zerbitzari kopurua behar den parametroekin txertatuko dugu - horiek. zertarako hasi zen dena)
  • XML fitxategi berria zaharraren gainean berridazten dugu.

Kontuan izan behar da, hain zuzen ere, ez dudala script hau guztiz automatikoki erabiltzen; izan ere, bildutako konfigurazioak beste direktorio batean kopiatzen ditut eta gero scripta exekutatu eta denak masiboki aldatzen ditut. Ondoren, ausazko egiaztapena eta konfigurazioak makinetara banatu daitezke.

Aldatutako pacs.xml fitxategiak bezeroei banatzea

Burura etorri zitzaidan gauzarik errazena jada lanean ari den .bat fitxategian aldaketak egitea izan zen, bezeroen konfigurazioak biltzen dituena eta lerroa gehitzea:

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

Azken .bat fitxategiak itxura hau du:

@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

Ondorioa

Horrelakoa da "belauna"konponbidea. Dagoeneko bi aldiz probatu dugu (2018ko irailean eta 2019ko otsailean), orain arte hegaldia normala da. Jakina, bezeroen % 100 ez da eguneratzen, baina balio horretatik gertu dago - gainerakoa urrunetik osatzen dugu. Egilearen gidoia link.

Iturria: www.habr.com

Gehitu iruzkin berria