Menukar tetapan program sambil menyimpan parameter peribadi

prasejarah

Satu organisasi perubatan melaksanakan penyelesaian berdasarkan pelayan Orthanc PACS dan pelanggan Radiant DICOM. Semasa persediaan, kami mendapati bahawa setiap pelanggan DICOM mesti diterangkan dalam pelayan PACS seperti berikut:

  • Nama pelanggan
  • Nama AE (mesti unik)
  • Port TCP yang dibuka secara automatik pada sisi klien dan menerima tinjauan DICOM daripada pelayan PACS (iaitu, pelayan menolaknya ke arah klien - memulakan sambungan dahulu)
  • Alamat IP

Selepas menyediakan Radiant, pelanggan menerima makanan untuk difikirkan berikut: untuk setiap pelanggan, menyediakan perisian dengan parameter di atas menyebabkan fail diisi pacs.xml, yang terletak dalam profil pengguna (laluan: %APPDATA%RadiantViewerpacs.xml). Pada masa yang sama, konfigurasi satu pelanggan berbeza daripada yang lain dalam sekurang-kurangnya dua parameter (nama AE berbeza untuk semua orang, dan port pada dasarnya adalah sama, kecuali untuk klien terminal yang berjalan pada pelayan yang sama - di sana port juga mempunyai untuk ditugaskan berbeza).

Contoh fail pacs.xml oleh pautan:

Selama kira-kira enam bulan semuanya baik-baik saja, sistem mula berfungsi... dan kemudian ia datang kepada kami β€œbawah air batu"

  • Kami perlu menjalankan beberapa pelayan PACS baharu yang akan menggantikan yang lama (di mana ruang cakera telah mula kehabisan). Pelayan PACS dalam mesin maya, tetapi bukan itu yang kita bincangkan;
  • Entah bagaimana kita perlu menukar konfigurasi unik secara berpusat (dengan dua parameter berbeza) pada 200 mesin (bilangan mereka sentiasa meningkat);
  • Memandangkan kadar pertumbuhan volum tinjauan, penyelesaian diperlukan bukan hanya sekali, tetapi direplikasi dan kerap (contohnya, sekali setiap 1-3 bulan).

Penyelesaiannya ada di bawah.

Memilih alat untuk menyelesaikan masalah

Pada mulanya, terdapat percubaan untuk mencari beberapa penyelesaian yang akan mengubah suai fail pacs.xml pada bahagian klien dan membuat perubahan pada senarai pelayan PACS tanpa menjejaskan nama AE dan tetapan port TCP. Pelanggan Windows pada masa itu adalah berdasarkan kedua-dua Windows XP dan Windows 7 - jadi terdapat percubaan untuk menulis sesuatu seperti ini berdasarkan VBScript. Tetapi malangnya, tidak mungkin untuk menguasai tugas sedemikian, kerana kekurangan pengalaman dalam menulis apa-apa yang rumit dan rumit dalam bahasa ini. Percubaan untuk mencari dan menulis semula juga tidak berjaya (perlu diingatkan bahawa saya sudah mempunyai rancangan yang berbeza di kepala saya, jadi saya tidak bermain-main dengan VBScript selama lebih daripada 3-4 jam).

Pada akhirnya saya menyelesaikan penyelesaian berikut:

  • Menggunakan dasar kumpulan, kumpulkan semua fail pacs.xml di satu tempat pada mana-mana pelayan dalam sumber rangkaian;
  • Tukar fail secara beramai-ramai (saya sudah mempunyai pengalaman dalam menyelesaikan masalah tersebut menggunakan Perl);
  • Juga gunakan dasar kumpulan untuk mengemas kini tetapan klien.

Mengumpul fail menggunakan Dasar Kumpulan

Bahagian paling mudah ialah apabila pelanggan log masuk ke profilnya, dia, dengan haknya, melaksanakan fail .bat tertentu, yang menyatakan:

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

Oleh itu, fail pacs.xml akan terkumpul pada pelayan dalam sumber tersembunyi, yang namanya mengandungi maklumat dari komputer mana dan dari pengguna mana konfigurasi ini disalin.

Perkara yang paling sukar ialah menunggu sehingga dasar ini berfungsi untuk semua pengguna.

Menukar konfigurasi menggunakan skrip Perl

Kami akan memerlukan Perl aktif untuk Windows daripada ActiveState, serta modul XML::Writer, yang boleh dipasang menggunakan arahan ppm memasang XML-Writer.

Skrip itu sendiri ternyata agak mudah:

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

Prinsip operasinya:

  • Kami membuka direktori di mana kami telah mengumpulkan konfigurasi pacs.xml daripada pelanggan dan meletakkan senarai fail dalam tatasusunan skalar (@report_files);
  • Dalam gelung, kami memproses satu fail pada satu masa dan membacanya baris demi baris;
  • Menggunakan split, kami membahagikan setiap baris kepada 5 bahagian, menggunakan petikan sebagai pemisah;
  • Kami mencari baris dengan perkataan pendengar dan meletakkan data unik untuk setiap fail (nama klien AE dan nombor port TCP) kepada dua pembolehubah;
  • Selepas ini, kami hanya menjana fail XML baharu, masukkan parameter unik ke dalamnya dan kemudian masukkan bilangan pelayan PACS yang diperlukan dengan parameternya - mereka. untuk apa semuanya bermula)
  • Kami menulis semula fail XML baharu di atas fail lama.

Perlu diingatkan bahawa sebenarnya, saya tidak menggunakan skrip ini sepenuhnya secara automatik - malah, saya menyalin konfigurasi yang dikumpul ke dalam direktori yang berasingan dan kemudian menjalankan skrip dan menukar semuanya secara beramai-ramai. Seterusnya, semakan rawak - dan konfigurasi boleh diedarkan kembali ke mesin.

Mengedarkan fail pacs.xml yang diubah suai kepada pelanggan

Perkara paling mudah yang terlintas di fikiran ialah membuat perubahan pada fail .bat yang sudah berfungsi yang mengumpulkan konfigurasi daripada pelanggan dan menambah baris:

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

Fail .bat terakhir kelihatan seperti ini:

@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

Kesimpulan

Ia seperti ini"lutut"penyelesaian. Kami sudah mencubanya dua kali (pada September 2018 dan Februari 2019), setakat ini penerbangan adalah normal. Sudah tentu, bukan 100% pelanggan mengemas kini, tetapi ia hampir dengan nilai ini - kami melengkapkan yang lain dari jauh. Skrip oleh pautan.

Sumber: www.habr.com

Tambah komen