వ్యక్తిగత పారామితులను సేవ్ చేస్తున్నప్పుడు ప్రోగ్రామ్ సెట్టింగ్‌లను మార్చడం

పూర్వచరిత్ర

ఒక వైద్య సంస్థ Orthanc PACS సర్వర్లు మరియు రేడియంట్ DICOM క్లయింట్ ఆధారంగా పరిష్కారాలను అమలు చేసింది. సెటప్ సమయంలో, ప్రతి DICOM క్లయింట్ తప్పనిసరిగా PACS సర్వర్‌లలో ఈ క్రింది విధంగా వివరించబడాలని మేము కనుగొన్నాము:

  • క్లయింట్ పేరు
  • AE పేరు (ప్రత్యేకంగా ఉండాలి)
  • క్లయింట్ వైపు స్వయంచాలకంగా తెరుచుకునే మరియు PACS సర్వర్ నుండి DICOM సర్వేలను స్వీకరించే TCP పోర్ట్ (అనగా, సర్వర్ వాటిని క్లయింట్ వైపుకు నెట్టివేస్తుంది - ముందుగా కనెక్షన్‌ను ప్రారంభించడం)
  • IP చిరునామా

రేడియంట్‌ని సెటప్ చేసిన తర్వాత, క్లయింట్‌లు ఆలోచన కోసం క్రింది ఆహారాన్ని అందుకున్నారు: ప్రతి క్లయింట్‌కు, పై పారామితులతో సాఫ్ట్‌వేర్‌ను సెటప్ చేయడం వల్ల ఫైల్ నిండిపోయింది pacs.xml, ఇది వినియోగదారు ప్రొఫైల్‌లో ఉంది (మార్గం: %APPDATA%RadiantViewerpacs.xml) అదే సమయంలో, ఒక క్లయింట్ యొక్క కాన్ఫిగరేషన్ కనీసం రెండు పారామితులలో మరొకదానికి భిన్నంగా ఉంటుంది (AE పేరు ప్రతి ఒక్కరికీ భిన్నంగా ఉంటుంది మరియు పోర్ట్ ప్రాథమికంగా ఒకే విధంగా ఉంటుంది, అదే సర్వర్‌లో నడుస్తున్న టెర్మినల్ క్లయింట్‌లు తప్ప - అక్కడ పోర్ట్‌లు కూడా ఉన్నాయి వేర్వేరుగా కేటాయించబడాలి).

ఉదాహరణ pacs.xml ఫైల్ ద్వారా లింక్:

దాదాపు ఆరు నెలల వరకు అంతా బాగానే ఉంది, సిస్టమ్ పని చేయడం ప్రారంభించింది... ఆపై అది మాకు వచ్చింది “నీటి అడుగున రాళ్ళు»:

  • మేము పాత వాటిని భర్తీ చేసే అనేక కొత్త PACS సర్వర్‌లను అమలులోకి తీసుకురావాలి (ఇక్కడ డిస్క్ స్థలం ఖాళీ అవడం ప్రారంభించింది). వర్చువల్ మెషీన్లలో PACS సర్వర్లు, కానీ మనం మాట్లాడుతున్నది కాదు;
  • మేము 200 మెషీన్‌లలో (వాటి సంఖ్య క్రమంగా పెరుగుతూనే ఉంది) ప్రత్యేక కాన్ఫిగరేషన్‌లను (రెండు వేర్వేరు పారామితులతో) కేంద్రంగా మార్చాలి;
  • సర్వే వాల్యూమ్‌ల వృద్ధి రేటును పరిగణనలోకి తీసుకుంటే, పరిష్కారం ఒక్కసారి మాత్రమే కాదు, ప్రతిరూపం మరియు క్రమం తప్పకుండా (ఉదాహరణకు, ప్రతి 1-3 నెలలకు ఒకసారి) అవసరం.

పరిష్కారం క్రింద ఉంది.

సమస్యను పరిష్కరించడానికి సాధనాలను ఎంచుకోవడం

మొదట, క్లయింట్ వైపున ఉన్న pacs.xml ఫైల్‌ను సవరించే మరియు AE పేరు మరియు TCP పోర్ట్ సెట్టింగ్‌లను ప్రభావితం చేయకుండా PACS సర్వర్‌ల జాబితాకు మార్పులు చేసే కొన్ని పరిష్కారాలను కనుగొనే ప్రయత్నాలు జరిగాయి. ఆ సమయంలో Windows క్లయింట్లు Windows XP మరియు Windows 7 రెండింటిపై ఆధారపడి ఉన్నాయి - కాబట్టి VBScript ఆధారంగా ఇలాంటివి వ్రాయడానికి ప్రయత్నాలు జరిగాయి. కానీ అయ్యో, ఈ భాషలో సంక్లిష్టంగా మరియు సమగ్రంగా ఏదైనా రాయడంలో పూర్తి అనుభవం లేకపోవడం వల్ల అలాంటి పనిలో నైపుణ్యం సాధించడం సాధ్యం కాలేదు. కనుగొని తిరిగి వ్రాయడానికి చేసిన ప్రయత్నాలు కూడా విఫలమయ్యాయి (నా తలపై ఇప్పటికే వేరే ప్రణాళిక ఉందని గమనించాలి, కాబట్టి నేను VBScriptతో 3-4 గంటల కంటే ఎక్కువ సమయం పట్టుకోలేదు).

చివరికి నేను ఈ క్రింది పరిష్కారంపై స్థిరపడ్డాను:

  • సమూహ విధానాన్ని ఉపయోగించి, నెట్‌వర్క్ వనరులోని ఏదైనా సర్వర్‌లో అన్ని pacs.xml ఫైల్‌లను ఒకే చోట సేకరించండి;
  • ఫైళ్లను సామూహికంగా మార్చండి (పెర్ల్‌ని ఉపయోగించి అటువంటి సమస్యలను పరిష్కరించడంలో నాకు ఇప్పటికే అనుభవం ఉంది);
  • క్లయింట్ సెట్టింగ్‌లను నవీకరించడానికి సమూహ విధానాలను కూడా ఉపయోగించండి.

గ్రూప్ పాలసీని ఉపయోగించి ఫైల్‌లను సేకరిస్తోంది

సరళమైన భాగం ఏమిటంటే, క్లయింట్ తన ప్రొఫైల్‌లోకి లాగిన్ అయినప్పుడు, అతను తన హక్కులతో ఒక నిర్దిష్ట .bat ఫైల్‌ను అమలు చేస్తాడు, ఇది ఇలా పేర్కొంది:

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

ఈ విధంగా, pacs.xml ఫైల్‌లు సర్వర్‌లో దాచిన వనరులో పేరుకుపోతాయి, దీని పేరు ఏ కంప్యూటర్ నుండి మరియు ఏ వినియోగదారు నుండి ఈ కాన్ఫిగర్ కాపీ చేయబడింది అనే సమాచారాన్ని కలిగి ఉంటుంది.

ఈ విధానం వినియోగదారులందరికీ పని చేసే వరకు వేచి ఉండటం చాలా కష్టమైన విషయం.

Perl స్క్రిప్ట్‌ని ఉపయోగించి కాన్ఫిగరేషన్‌లను మార్చడం

మాకు అవసరం యాక్టివ్ పెర్ల్ ActiveState నుండి Windows కోసం, అలాగే XML:: రైటర్ మాడ్యూల్, ఆదేశాన్ని ఉపయోగించి ఇన్‌స్టాల్ చేయవచ్చు ppm XML-రైటర్‌ను ఇన్‌స్టాల్ చేయండి.

స్క్రిప్ట్ చాలా సులభం అని తేలింది:

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

దాని ఆపరేషన్ సూత్రం:

  • మేము క్లయింట్‌ల నుండి pacs.xml కాన్ఫిగరేషన్‌లను సేకరించిన డైరెక్టరీని తెరుస్తాము మరియు ఫైల్‌ల జాబితాను స్కేలర్‌ల శ్రేణిలో ఉంచుతాము (@report_files);
  • ఒక లూప్‌లో, మేము ఒక సమయంలో ఒక ఫైల్‌ని ప్రాసెస్ చేస్తాము మరియు దానిని లైన్ వారీగా చదువుతాము;
  • స్ప్లిట్ ఉపయోగించి, మేము ప్రతి పంక్తిని 5 భాగాలుగా విభజించాము, కోట్‌లను సెపరేటర్‌గా ఉపయోగిస్తాము;
  • మేము వినేవారు అనే పదంతో ఒక లైన్‌ను కనుగొంటాము మరియు ప్రతి ఫైల్‌కు (AE క్లయింట్ పేరు మరియు TCP పోర్ట్ నంబర్) ప్రత్యేకమైన డేటాను రెండు వేరియబుల్‌లుగా ఉంచుతాము;
  • దీని తర్వాత, మేము కేవలం ఒక కొత్త XML ఫైల్‌ను రూపొందించి, దానిలో ప్రత్యేకమైన పారామితులను నమోదు చేసి, ఆపై అవసరమైన సంఖ్యలో PACS సర్వర్‌లను వాటి పారామితులతో ఇన్‌సర్ట్ చేస్తాము - ఆ. ఇదంతా దేని కోసం ప్రారంభమైంది)
  • మేము కొత్త XML ఫైల్‌ని పాత దాని పైన తిరిగి వ్రాస్తాము.

వాస్తవానికి, నేను ఈ స్క్రిప్ట్‌ను పూర్తిగా స్వయంచాలకంగా ఉపయోగించను - వాస్తవానికి, నేను సేకరించిన కాన్ఫిగరేషన్‌లను ప్రత్యేక డైరెక్టరీలోకి కాపీ చేసి, ఆపై స్క్రిప్ట్‌ను అమలు చేసి, వాటిని మొత్తంగా మారుస్తాను. తరువాత, యాదృచ్ఛిక తనిఖీ - మరియు కాన్ఫిగరేషన్‌లను యంత్రాలకు తిరిగి పంపిణీ చేయవచ్చు.

క్లయింట్‌లకు సవరించిన pacs.xml ఫైల్‌లను పంపిణీ చేస్తోంది

క్లయింట్‌ల నుండి కాన్ఫిగరేషన్‌లను సేకరించి, లైన్‌ను జోడించే ఇప్పటికే పని చేస్తున్న .bat ఫైల్‌కు మార్పులు చేయడం గుర్తుంచుకోవడానికి వచ్చిన సులభమైన విషయం:

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

చివరి .bat ఫైల్ ఇలా కనిపిస్తుంది:

@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

తీర్మానం

ఇది ఇలా ఉంది"మోకాలి"పరిష్కారం. మేము దీన్ని ఇప్పటికే రెండుసార్లు ప్రయత్నించాము (సెప్టెంబర్ 2018 మరియు ఫిబ్రవరి 2019లో), ఇప్పటివరకు విమానం సాధారణంగా ఉంది. వాస్తవానికి, 100% క్లయింట్లు నవీకరించబడవు, కానీ ఇది ఈ విలువకు దగ్గరగా ఉంటుంది - మేము మిగిలిన వాటిని రిమోట్‌గా పూర్తి చేస్తాము. స్క్రిప్ట్ ద్వారా లింక్.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి