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
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).
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
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
Sumber: www.habr.com