Ndryshimi i konfigurimeve të programeve me ruajtjen e parametrave personalë

Pas historia

Në një organizatë mjekësore, u implementuan zgjidhje të bazuara në serverat PACS Orthanc dhe klientin DICOM Radiant. Gjatë konfigurimit, u zbulua se secili klient DICOM duhet të përshkruhet në serverat PACS si më poshtë:

  • Emri i klientit
  • Emri AE (duhet tĂ« jetĂ« unik)
  • Porti TCP, i cili hapet automatikisht nĂ« anĂ«n e klientit dhe pranoni ekzaminimet DICOM nga serveri PACS (dmth. serveri si tĂ« ishte i shtynte ato drejt klientit - duke iniciuar lidhjen i pari)
  • IP-adresa

Pas konfigurimit, klientët Radiant morën informacionin e mëposhtëm për reflektim - për secilin klient, konfigurimi i softuerit me parametrat e përmendur lart çonte në plotësimin e skedarit pacs.xml, i cili ndodhej në profilin e përdoruesit (rruga: %APPDATA%RadiantViewerpacs.xml). Duke marrë parasysh këtë, konfiguarimi i një klienti dallohej nga ai i një tjetri me të paktën dy parametra (Emri AE ishte ndryshe për të gjithë, ndërsa porta në thelb ishte e njëjtë, përveç klientëve terminalë që punonin në të njëjtin server - atje portat gjithashtu duhej të emëroheshin ndryshe).

Shembulli i skedarit pacs.xml sipas lidhjes:

Rreth gjashtë muaj gjithçka shkoi mirë, sistemi filloi të punojë... dhe atëherë na arritën "minat ".»:

  • Na necesitamos tĂ« vendosim nĂ« punĂ« disa serverĂ« tĂ« rinj PACS, tĂ« cilĂ«t do tĂ« zĂ«vendĂ«sojnĂ« ata tĂ« vjetĂ«r (ku po mbaronte hapĂ«sira nĂ« disqe). ServerĂ«t PACS ndodhen nĂ« makina virtuale, por kjo nuk Ă«shtĂ« tema kĂ«tu;
  • Na nevojitet ndonjĂ« mĂ«nyrĂ« pĂ«r tĂ« ndryshuar nĂ« mĂ«nyrĂ« qendrore konfiguracionet unike (me dy parametra tĂ« ndryshĂ«m) nĂ« 200 makina (numri i tyre Ă«shtĂ« rritur rregullisht);
  • Duke marrĂ« parasysh ritmin e rritjes sĂ« volumit tĂ« ekzaminimeve, zgjidhja duhet tĂ« jetĂ« jo njĂ« herĂ«, por e riprodhueshme dhe e rregullt (p.sh., njĂ« herĂ« çdo 3-5 muaj).

Zgjidhja më poshtë.

Zgjedhja e mjeteve për zgjidhjen e problemit

Fillimi ishte pĂ«rpjekja pĂ«r tĂ« gjetur njĂ« zgjidhje qĂ« nĂ« anĂ«n e klientit ndryshonte skedarin pacs.xml, dhe bĂ«nte ndryshime nĂ« listĂ«n e serverĂ«ve PACS, pa prekur cilĂ«simet e emrit AE dhe tĂ« portit TCP. KlientĂ«t Windows nĂ« atĂ« kohĂ« ishin nĂ« bazĂ« tĂ« Windows XP dhe Windows 7 – prandaj ndodhĂ«n pĂ«rpjekjet pĂ«r tĂ« shkruar diçka tĂ« tillĂ« nĂ« bazĂ« tĂ« VBScript. Por, fatkeqĂ«sisht – nuk arrita ta pĂ«rmbush kĂ«tĂ« detyrĂ«, pĂ«r shkak tĂ« mungesĂ«s totale tĂ« pĂ«rvojĂ«s nĂ« shkruarjen e ndonjĂ« gjĂ«je tĂ« ndĂ«rlikuar dhe komplekse nĂ« kĂ«tĂ« gjuhĂ«. PĂ«rshtatjet pĂ«r tĂ« gjetur dhe riprogramuar gjithashtu dĂ«shtuan (kĂ«tu duhet tĂ« theksohet se nĂ« kokĂ« kishte njĂ« plan tjetĂ«r, prandaj nuk e kam humbur mĂ« shumĂ« se 3-4 orĂ« me VBScript).

Si rezultat, unë u ndala në zgjidhjen e mëposhtme:

  • TĂ« mbledhĂ«sh me politikĂ«n e grupit tĂ« gjitha skedarĂ«t pacs.xml nĂ« njĂ« vend nĂ« ndonjĂ« server nĂ« burimin e rrjetit;
  • TĂ« ndryshosh skedarĂ«t si njĂ« grup (pĂ«rvoja nĂ« zgjidhjen e kĂ«tyre problemeve tashmĂ« ishte e pranishme – duke pĂ«rdorur Perl);
  • Po ashtu, me ndihmĂ«n e politikave tĂ« grupit tĂ« pĂ«rditĂ«sohen cilĂ«simet e klientĂ«ve.

Mbledhja e skedarëve me ndihmën e politikës së grupit

Pjesa mĂ« e thjeshtĂ« – kur klienti hyn nĂ« profilin e tij, ai ekzekuton njĂ« skedar .bat, nĂ« tĂ« cilin Ă«shtĂ« shkruar:

echo off
Nëse egziston %APPDATA%RadiantViewerpacs.xml kopjo %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml

Për këtë arsye, në server do të akumulohen skedarët pacs.xml në burimin e fshehtë, emri i të cilëve përmban informacion se nga cilin kompjuter dhe cilin përdorues është kopjuar ky konfigurim.

Më e vështira ishte të prisja, kur të gjitha përdoruesit të përfundojnë këtë politikë.

Ndryshimi i konfigurimeve me anë të skriptit Perl

Na nevojitet Active Perl për Windows nga kompania ActiveState, si dhe moduli XML::Writer, i cili mund të instalohet me anë të komandës ppm install XML-Writer.

Skripti vetë doli mjaft i thjeshtë:

use XML::Writer;
 
# Hapni dosjenë si raportet, procesoni listën (heqni të tepërtat):
	$report_dir = "C:Perl64WORKPACS-xml3";
	opendir(DIR, "$report_dir") or die "Nuk mund të hap dosjen e raportit!";
	@report_files = readdir DIR;
	shift (@report_files); # heqni pikën nga elementet e vargut (.)
	shift (@report_files); # heqni dy pikë nga elementet e vargut (..)
#	print "@report_files";
	closedir(DIR);
 
# Filloni të procesoni skedarët - një për një. Duhet të lexoni parametrin AET dhe numrin e portës në variabla.
foreach $analiz_file (@report_files) 
{
	$full_path_to_file="C:Perl64WORKPACS-xml3".$analiz_file;
	open (INFO, $full_path_to_file);
 
	while ($line = )
	{
		# Variablat $aet dhe $port përmbajnë të dhëna unike për çdo skedar XML:
		my ($other1, $aet, $other2, $port, $other3) = split "/", $line, 5;
		# Nëse gjendet rreshti listener - do të thotë se kemi arritur në rreshtin e nevojshëm dhe mund të formojmë XML të ri:
		if ($other1 =~ 'listener')
			{
				# Formojmë XML të ri me fushat dhe të dhënat e nevojshme:
				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');
 
				# Vendosim XML-in e gatshëm në variablën:
				my $xml = $writer->end();
				# Përgatitim skedarin për përsëritje:
				$rewritexml = $full_path_to_file;
				# Rwrites XML skedarët me të dhëna të reja:
				open (NEWXML, "> $rewritexml");
				print NEWXML $xml;
				close (NEWXML);				
			}
	}
 
}

Parimi i tij:

  • Hapim katalogun, nĂ« tĂ« cilin kemi mbledhur konfigurimet pacs.xml nga klientĂ«t dhe vendosim listĂ«n e skedarĂ«ve nĂ« njĂ« array skalarĂ«sh (@report_files);
  • NĂ« cikĂ«l pĂ«rpunojmĂ« njĂ« skedar nĂ« njĂ« kohĂ« dhe e lexojmĂ« atĂ« rresht pĂ«r rresht;
  • Me ndihmĂ«n e split, ndajmĂ« secilĂ«n linjĂ« nĂ« 5 pjesĂ«, duke pĂ«rdorur thonjĂ«zat si ndarĂ«s;
  • GjejmĂ« rreshtin me fjalĂ«n listener dhe vendosim nĂ« dy variabla unik pĂ«r secilin skedare tĂ« dhĂ«nat (EMRI i klientit AE dhe numri i portit TCP);
  • Pasi kjo, thjesht formojmĂ« njĂ« skedarin XML tĂ« ri, shkruajmĂ« nĂ« tĂ« parametrat unikĂ« dhe mĂ« pas vendosim numrin e nevojshĂ«m tĂ« serverĂ«ve PACS me parametrat e tyre – dmth, ajo pĂ«r tĂ« cilĂ«n Ă«shtĂ« bĂ«rĂ« gjithçka)
  • ShkruajmĂ« skedarin e ri XML mbi atĂ« tĂ« vjetĂ«r.

Duhet tĂ« theksohet se nĂ« tĂ« vĂ«rtetĂ« unĂ« pĂ«rdor kĂ«tĂ« skript jo plotĂ«sisht automatikisht – nĂ« thelb kopjoj konfigurimet qĂ« po kolektohen nĂ« njĂ« katalog tĂ« veçantĂ« dhe mĂ« pas duke drejtuar skriptin i ndryshoj ato si njĂ« grup. Pastaj njĂ« kontroll selektiv – dhe konfigurimet mund tĂ« shpĂ«rndahen pĂ«rsĂ«ri nĂ« makina.

Shpërndarja e skedarëve të ndryshuar pacs.xml te klientët

Një nga idea më e thjeshta ishte të bëhen ndryshime në një skedar .bat që funksionon, i cili mbledh konfigurimet nga klientët dhe të shtohet rreshti:

Nëse ekziston %APPDATA%RadiantViewerpacs.xml kopjo /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml

Skedari përfundimtar .bat duket kështu:

@echo off
Nëse ekziston %APPDATA%RadiantViewerpacs.xml kopjo %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
Nëse ekziston %APPDATA%RadiantViewerpacs.xml kopjo /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml

Përfundimi

Kjo Ă«shtĂ« njĂ«zgjidhje "nĂ« gjunjĂ«"."Zgjidhje". E kemi provuar tashmĂ« dy herĂ« (nĂ« Shtator 2018 dhe nĂ« Shkurt 2019), pĂ«r momentin po ecĂ«n mirĂ«. Sigurisht, nuk pĂ«rditĂ«son 100% tĂ« klientĂ«ve, por Ă«shtĂ« afĂ«r kĂ«tij numri — tĂ« tjerĂ«t po i pĂ«rfundojmĂ« nĂ« distancĂ«. Skripti pĂ«r lidhjes.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster