Kubadilisha mipangilio ya programu wakati wa kuhifadhi vigezo vya kibinafsi

kabla ya historia

Shirika moja la matibabu lilitekeleza masuluhisho kulingana na seva za Orthanc PACS na mteja wa DICOM wa Radiant. Wakati wa kusanidi, tuligundua kuwa kila mteja wa DICOM lazima afafanuliwe katika seva za PACS kama ifuatavyo:

  • Jina la mteja
  • Jina la AE (lazima liwe la kipekee)
  • Lango la TCP ambalo hufunguka kiotomatiki kwa upande wa mteja na kupokea tafiti za DICOM kutoka kwa seva ya PACS (yaani, seva inazisukuma kuelekea kwa mteja - kuanzisha muunganisho kwanza)
  • Anwani ya IP

Baada ya kusanidi Radiant, wateja walipokea chakula kifuatacho cha kufikiria: kwa kila mteja, kusanidi programu na vigezo hapo juu ilisababisha faili kujazwa. pacs.xml, ambayo ilikuwa katika wasifu wa mtumiaji (njia: %APPDATA%RadiantViewerpacs.xml) Wakati huo huo, usanidi wa mteja mmoja ulitofautiana na mwingine kwa angalau vigezo viwili (jina la AE ni tofauti kwa kila mtu, na bandari kimsingi ni sawa, isipokuwa kwa wateja wa terminal wanaoendesha kwenye seva moja - hapo bandari pia zilikuwa na kupewa tofauti).

Mfano wa faili ya pacs.xml kwa kiungo:

Kwa takriban miezi sita kila kitu kilikuwa sawa, mfumo ulianza kufanya kazi ... halafu ukaja kwetu "chini ya maji mawe'

  • Tunahitaji kuweka katika operesheni seva kadhaa mpya za PACS ambazo zitachukua nafasi ya zile za zamani (ambapo nafasi ya diski imeanza kuisha). seva za PACS katika mashine za kawaida, lakini sio hivyo tunazungumza;
  • Tunahitaji kwa namna fulani kubadilisha usanidi wa kipekee (na vigezo viwili tofauti) kwenye mashine 200 (idadi yao ilikuwa ikiongezeka mara kwa mara);
  • Kwa kuzingatia kiwango cha ukuaji wa kiasi cha uchunguzi, suluhisho inahitajika si mara moja tu, lakini kuigwa na mara kwa mara (kwa mfano, mara moja kila baada ya miezi 1-3).

Suluhisho ni hapa chini.

Kuchagua zana za kutatua tatizo

Mwanzoni, kulikuwa na majaribio ya kutafuta suluhisho ambalo lingerekebisha faili ya pacs.xml kwenye upande wa mteja na kufanya mabadiliko kwenye orodha ya seva za PACS bila kuathiri jina la AE na mipangilio ya mlango wa TCP. Wateja wa Windows wakati huo walikuwa msingi wa Windows XP na Windows 7 - kwa hivyo kulikuwa na majaribio ya kuandika kitu kama hiki kulingana na VBScript. Lakini ole, haikuwezekana kusimamia kazi kama hiyo, kwa sababu ya ukosefu kamili wa uzoefu katika kuandika chochote ngumu na kamili katika lugha hii. Majaribio ya kupata na kuandika upya pia hayakufanikiwa (inapaswa kuzingatiwa kuwa tayari nilikuwa na mpango tofauti katika kichwa changu, kwa hiyo sikufanya kazi na VBScript kwa zaidi ya saa 3-4).

Mwishowe nilitulia kwenye suluhisho lifuatalo:

  • Kwa kutumia sera ya kikundi, kukusanya faili zote za pacs.xml katika sehemu moja kwenye seva yoyote katika rasilimali ya mtandao;
  • Badilisha faili kwa wingi (tayari nilikuwa na uzoefu wa kutatua shida kama hizo kwa kutumia Perl);
  • Pia tumia sera za kikundi kusasisha mipangilio ya mteja.

Kukusanya faili kwa kutumia Sera ya Kikundi

Sehemu rahisi zaidi ni kwamba mteja anapoingia katika wasifu wake, yeye, akiwa na haki zake, hutekeleza faili fulani ya .bat, inayosema:

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

Kwa hivyo, faili za pacs.xml zitajilimbikiza kwenye seva katika rasilimali iliyofichwa, jina ambalo lina habari kutoka kwa kompyuta gani na kutoka kwa mtumiaji gani usanidi huu ulinakiliwa.

Jambo gumu zaidi lilikuwa kusubiri hadi sera hii ifanye kazi kwa watumiaji wote.

Kubadilisha usanidi kwa kutumia hati ya Perl

Tutahitaji Perl hai kwa Windows kutoka ActiveState, pamoja na moduli ya XML::Mwandishi, ambayo inaweza kusakinishwa kwa kutumia amri. ppm kusakinisha XML-Writer.

Nakala yenyewe iligeuka kuwa rahisi sana:

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

Kanuni ya uendeshaji wake:

  • Tunafungua saraka ambayo tumekusanya usanidi wa pacs.xml kutoka kwa wateja na kuweka orodha ya faili katika safu ya scalars (@report_files);
  • Katika kitanzi, tunasindika faili moja kwa wakati mmoja na kuisoma mstari kwa mstari;
  • Kutumia mgawanyiko, tunagawanya kila mstari katika sehemu 5, kwa kutumia nukuu kama kitenganishi;
  • Tunapata mstari na msikilizaji wa neno na kuweka data ya kipekee kwa kila faili (jina la mteja wa AE na nambari ya bandari ya TCP) katika vigezo viwili;
  • Baada ya hayo, tunatoa faili mpya ya XML, ingiza vigezo vya kipekee ndani yake na kisha ingiza nambari inayotakiwa ya seva za PACS na vigezo vyao - hizo. ilianza kwa nini)
  • Tunaandika upya faili mpya ya XML juu ya ya zamani.

Ikumbukwe kwamba kwa kweli, situmii hati hii moja kwa moja - kwa kweli, ninakili usanidi uliokusanywa kwenye saraka tofauti na kisha kukimbia hati na kuzibadilisha zote kwa wingi. Ifuatayo, ukaguzi wa nasibu - na usanidi unaweza kusambazwa kwa mashine.

Inasambaza faili za pacs.xml zilizobadilishwa kwa wateja

Jambo rahisi lililokuja akilini ni kufanya mabadiliko kwenye faili ya .bat ambayo tayari inafanya kazi ambayo inakusanya usanidi kutoka kwa wateja na kuongeza laini:

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

Faili ya mwisho ya .bat inaonekana kama hii:

@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

Hitimisho

Ni hivi"goti"suluhisho. Tayari tumejaribu mara mbili (Septemba 2018 na Februari 2019), hadi sasa safari ya ndege ni ya kawaida. Kwa kweli, sio 100% ya wateja wanaosasisha, lakini iko karibu na thamani hii - tunakamilisha iliyobaki kwa mbali. Hati kwa kiungo.

Chanzo: mapenzi.com

Kuongeza maoni