Αλλαγή ρυθμίσεων προγράμματος κατά την αποθήκευση προσωπικών παραμέτρων

Ιστορικό

Ένας ιατρικός οργανισμός εφάρμοσε λύσεις που βασίζονται σε διακομιστές Orthanc PACS και πελάτη Radiant DICOM. Κατά τη ρύθμιση, ανακαλύψαμε ότι κάθε πελάτης DICOM πρέπει να περιγράφεται στους διακομιστές PACS ως εξής:

  • Ονομα Πελάτη
  • Όνομα AE (πρέπει να είναι μοναδικό)
  • Μια θύρα TCP που ανοίγει αυτόματα στην πλευρά του πελάτη και λαμβάνει έρευνες DICOM από τον διακομιστή PACS (δηλαδή, ο διακομιστής τις σπρώχνει προς τον πελάτη - ξεκινώντας πρώτα τη σύνδεση)
  • Διεύθυνση IP

Μετά τη ρύθμιση του Radiant, οι πελάτες έλαβαν την ακόλουθη τροφή για σκέψη: για κάθε πελάτη, η ρύθμιση του λογισμικού με τις παραπάνω παραμέτρους είχε ως αποτέλεσμα τη συμπλήρωση του αρχείου pacs.xml, το οποίο βρισκόταν στο προφίλ χρήστη (διαδρομή: %APPDATA%RadiantViewerpacs.xml). Ταυτόχρονα, η διαμόρφωση ενός πελάτη διέφερε από τον άλλο σε τουλάχιστον δύο παραμέτρους (το όνομα AE είναι διαφορετικό για όλους και η θύρα είναι βασικά η ίδια, εκτός από τους τερματικούς πελάτες που εκτελούνται στον ίδιο διακομιστή - εκεί οι θύρες είχαν επίσης να ανατεθούν διαφορετικά).

Παράδειγμα αρχείου pacs.xml από σύνδεσμος:

Για περίπου έξι μήνες όλα ήταν καλά, το σύστημα άρχισε να λειτουργεί... και μετά ήρθε σε εμάς».υποβρύχια πέτρες»

  • Πρέπει να θέσουμε σε λειτουργία αρκετούς νέους διακομιστές PACS που θα αντικαταστήσουν τους παλιούς (όπου ο χώρος στο δίσκο έχει αρχίσει να εξαντλείται). Διακομιστές PACS σε εικονικές μηχανές, αλλά δεν μιλάμε για αυτό.
  • Πρέπει με κάποιο τρόπο να αλλάξουμε κεντρικά μοναδικές διαμορφώσεις (με δύο διαφορετικές παραμέτρους) σε 200 μηχανές (ο αριθμός τους αυξανόταν τακτικά).
  • Λαμβάνοντας υπόψη τον ρυθμό αύξησης των όγκων των ερευνών, μια λύση απαιτείται όχι μόνο μία φορά, αλλά επαναλαμβάνεται και τακτικά (για παράδειγμα, μία φορά κάθε 1-3 μήνες).

Η λύση είναι παρακάτω.

Επιλογή εργαλείων για την επίλυση ενός προβλήματος

Αρχικά, έγιναν προσπάθειες να βρεθεί κάποια λύση που θα τροποποιούσε το αρχείο pacs.xml στην πλευρά του πελάτη και θα έκανε αλλαγές στη λίστα των διακομιστών PACS χωρίς να επηρεάσει το όνομα AE και τις ρυθμίσεις της θύρας TCP. Οι υπολογιστές-πελάτες των Windows εκείνη την εποχή βασίζονταν τόσο στα Windows XP όσο και στα Windows 7 - έτσι έγιναν προσπάθειες να γραφτεί κάτι τέτοιο με βάση το VBScript. Αλλά δυστυχώς, δεν ήταν δυνατό να κατακτήσουμε ένα τέτοιο έργο, λόγω της παντελούς έλλειψης εμπειρίας στη συγγραφή οτιδήποτε περίπλοκου και περιεκτικού σε αυτή τη γλώσσα. Οι προσπάθειες εύρεσης και επανεγγραφής ήταν επίσης ανεπιτυχείς (θα πρέπει να σημειωθεί ότι είχα ήδη ένα διαφορετικό σχέδιο στο μυαλό μου, επομένως δεν ασχολήθηκα με το VBScript για περισσότερες από 3-4 ώρες).

Στο τέλος καταλήξα στην ακόλουθη λύση:

  • Χρησιμοποιώντας την πολιτική ομάδας, συλλέξτε όλα τα αρχεία pacs.xml σε ένα μέρος σε οποιονδήποτε διακομιστή σε έναν πόρο δικτύου.
  • Μαζική αλλαγή αρχείων (είχα ήδη εμπειρία στην επίλυση τέτοιων προβλημάτων χρησιμοποιώντας την Perl).
  • Χρησιμοποιήστε επίσης πολιτικές ομάδας για να ενημερώσετε τις ρυθμίσεις πελάτη.

Συλλογή αρχείων με χρήση της πολιτικής ομάδας

Το πιο απλό είναι ότι όταν ένας πελάτης συνδέεται στο προφίλ του, με τα δικαιώματά του, εκτελεί ένα συγκεκριμένο αρχείο .bat, το οποίο αναφέρει:

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

Έτσι, τα αρχεία pacs.xml θα συγκεντρωθούν στον διακομιστή σε έναν κρυφό πόρο, το όνομα του οποίου περιέχει πληροφορίες από ποιον υπολογιστή και από ποιον χρήστη αντιγράφηκε αυτή η ρύθμιση παραμέτρων.

Το πιο δύσκολο πράγμα ήταν να περιμένετε μέχρι να λειτουργήσει αυτή η πολιτική για όλους τους χρήστες.

Αλλαγή διαμορφώσεων χρησιμοποιώντας ένα σενάριο Perl

Θα χρειαστούμε Ενεργός Perl για Windows από το 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).
  • Σε έναν βρόχο, επεξεργαζόμαστε ένα αρχείο κάθε φορά και το διαβάζουμε γραμμή προς γραμμή.
  • Χρησιμοποιώντας το split, χωρίζουμε κάθε γραμμή σε 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

Προσθέστε ένα σχόλιο