ذاتي سيٽنگون بچائڻ دوران پروگرام سيٽنگون تبديل ڪرڻ

prehistory

ھڪڙي طبي تنظيم Orthanc PACS سرورز ۽ Radiant DICOM ڪلائنٽ جي بنياد تي حل لاڳو ڪيو. سيٽ اپ دوران، اسان اهو معلوم ڪيو ته هر DICOM ڪلائنٽ کي PACS سرورز ۾ هن ريت بيان ڪيو وڃي ٿو:

  • ڪسٽمر جو نالو
  • AE نالو (منفرد هجڻ گهرجي)
  • هڪ TCP پورٽ جيڪو خودڪار طريقي سان ڪلائنٽ جي پاسي تي کلي ٿو ۽ PACS سرور کان DICOM سروي حاصل ڪري ٿو (يعني، سرور انهن کي ڪلائنٽ ڏانهن ڌڪي ٿو - پهريون ڪنيڪشن شروع ڪرڻ)
  • IP پتي

Radiant قائم ڪرڻ کان پوء، ڪلائنٽ کي هيٺ ڏنل کاڌو حاصل ڪيو سوچڻ لاء: هر ڪلائنٽ لاء، مٿي ڏنل پيٽرولن سان سافٽ ويئر ترتيب ڏيڻ جي نتيجي ۾ فائل ڀرجي وئي pacs.xml، جيڪو صارف پروفائل ۾ واقع هو (رستو: %APPDATA%RadiantViewerpacs.xml). ساڳئي وقت، هڪ ڪلائنٽ جي ترتيب هڪ ٻئي کان گهٽ ۾ گهٽ ٻن پيٽرولن ۾ مختلف آهي (AE نالو هر ڪنهن لاءِ مختلف آهي، ۽ بندرگاهه بنيادي طور تي ساڳيو آهي، سواءِ ساڳي سرور تي هلندڙ ٽرمينل ڪلائنٽ کان سواءِ - اتي بندرگاهن پڻ هئا. مختلف تفويض ڪيو وڃي).

مثال pacs.xml فائل طرفان لنڪ:

اٽڪل ڇهن مهينن تائين سڀ ڪجهه ٺيڪ هو، سسٽم ڪم ڪرڻ لڳو... ۽ پوءِ اسان وٽ آيو.پاڻي هيٺ پٿر»:

  • اسان کي عمل ۾ آڻڻ جي ضرورت آھي ڪيترائي نوان PACS سرور جيڪي پراڻن کي تبديل ڪندا (جتي ڊسڪ اسپيس ختم ٿيڻ شروع ٿي چڪي آھي). PACS سرور ورچوئل مشينن ۾، پر اهو نه آهي جيڪو اسان ڳالهائي رهيا آهيون؛
  • اسان کي 200 مشينن تي (ٻن مختلف ماپن سان) منفرد ترتيبن کي مرڪزي طور تي تبديل ڪرڻ جي ضرورت آهي (انهن جو تعداد باقاعدگي سان وڌي رهيو هو)؛
  • سروي جي مقدار جي واڌ جي شرح تي غور ڪندي، هڪ حل جي ضرورت آهي صرف هڪ ڀيرو نه، پر نقل ۽ باقاعده (مثال طور، هڪ ڀيرو هر 1-3 مهينن ۾).

حل هيٺ ڏنل آهي.

هڪ مسئلو حل ڪرڻ لاء اوزار چونڊڻ

شروعات ۾، ڪجھ حل ڳولڻ جي ڪوشش ڪئي وئي جيڪا ڪلائنٽ جي پاسي تي pacs.xml فائل کي تبديل ڪندي ۽ PACS سرورز جي لسٽ ۾ تبديليون آڻيندي بغير AE نالو ۽ TCP پورٽ سيٽنگن کي متاثر ڪرڻ کان سواء. ونڊوز کلائنٽ ان وقت ونڊوز XP ۽ ونڊوز 7 تي ٻڌل هئا - تنهنڪري VBScript جي بنياد تي ڪجهه لکڻ جي ڪوشش ڪئي وئي. پر افسوس جو اهڙي ڪم ۾ مهارت حاصل ڪرڻ ممڪن نه هو، ڇاڪاڻ ته هن ٻوليءَ ۾ ڪا به پيچيده ۽ پيچيده شيءِ لکڻ جو تجربو نه هو. ڳولڻ ۽ ٻيهر لکڻ جي ڪوشش پڻ ناڪام ٿي چڪي هئي (اهو ياد رکڻ گهرجي ته مون وٽ اڳ ۾ ئي منهنجي سر ۾ هڪ مختلف منصوبو هو، تنهنڪري مون 3-4 ڪلاڪن کان وڌيڪ VBScript سان گڏ نه ڪيو).

آخر ۾ مون هيٺ ڏنل حل تي آباد ڪيو:

  • گروپ پاليسي استعمال ڪندي، سڀني pacs.xml فائلن کي گڏ ڪريو ھڪڙي جڳھ تي ھڪڙي سرور تي ھڪڙي نيٽ ورڪ وسيلن ۾؛
  • فائلن کي وڏي پئماني تي تبديل ڪريو (مون کي اڳ ۾ ئي پرل استعمال ڪندي اهڙن مسئلن کي حل ڪرڻ ۾ تجربو هو)؛
  • ڪلائنٽ سيٽنگون تازه ڪاري ڪرڻ لاءِ گروپ پاليسيون پڻ استعمال ڪريو.

گروپ پاليسي استعمال ڪندي فائلون گڏ ڪرڻ

سادو حصو اهو آهي ته جڏهن هڪ ڪلائنٽ پنهنجي پروفائل ۾ لاگ ان ٿئي ٿو، هو، پنهنجي حقن سان، هڪ مخصوص .bat فائل تي عمل ڪري ٿو، جيڪو بيان ڪري ٿو:

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

اهڙيءَ طرح، pacs.xml فائلون سرور تي هڪ پوشيده وسيلن ۾ جمع ٿينديون، جنهن جي نالي ۾ اها معلومات هوندي آهي ته ڪهڙي ڪمپيوٽر ۽ ڪهڙي صارف کان هي ترتيب نقل ڪئي وئي هئي.

سڀ کان ڏکيو شيء انتظار ڪرڻ هو جيستائين هي پاليسي سڀني صارفين لاء ڪم ڪري.

پرل اسڪرپٽ استعمال ڪندي ترتيبن کي تبديل ڪرڻ

اسان کي ضرورت پوندي فعال پرل ونڊوز لاءِ ActiveState، انهي سان گڏ XML::Writer ماڊل، جيڪو ڪمانڊ استعمال ڪندي انسٽال ڪري سگھجي ٿو ppm انسٽال ڪريو XML-Writer.

رسم الخط پاڻ بلڪل سادو ٿي ويو:

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

تبصرو شامل ڪريو