Witam,
bardzo dziękuję za zaimplementowanie funkcjonalności hooków w LMS. Jest to idealna sprawa. Mam jednak problem, bo w jednym przypadku nie działają (hiperłącza Włącz/Wyłącz na liście komputerów klienta), a użytkownicy (obsługa) klika oczywiście w to miejsce, nie w inne, i marudzi. Problem wydaje się być w nodewarn.php w kodzie:
if(!empty($_POST['marks'])) { $nodes = array(); foreach($_POST['marks'] as $id) { $LMS->NodeSetWarn($id, $warning); }
* if (!empty($nodes)) { * $data = array('nodes' => $nodes, 'warning' => $warning); $LMS->ExecHook('node_warn_after', $data); }
$SESSION->redirect('?'.$SESSION->get('backto')); }
Nic nie jest dodawane do $nodes, więc warunek jest zawsze fałszywy, więc hook nie jest wykonywany.
Dziękuję i pozdrawiam.
On 26.04.2011 14:34, Digital Dog wrote:
Nic nie jest dodawane do $nodes, więc warunek jest zawsze fałszywy, więc hook nie jest wykonywany.
Poprawione w cvsie. Dzięki.
2011/4/26 A.L.E.C alec@alec.pl:
On 26.04.2011 14:34, Digital Dog wrote:
Nic nie jest dodawane do $nodes, więc warunek jest zawsze fałszywy, więc hook nie jest wykonywany.
Poprawione w cvsie. Dzięki.
Dzięki za szybką reakcję! Hooki są bardzo wygodne, pomagają reagować natychmiast na zdarzenia w LMSie, w tym modyfikować ustawienia ruterów, menedżerów pasma, firewalli itd. (pamiętając o blokadach by uniknąć zniszczenia konfiga lub sytuacji wyścigu w razie 2 lub więcej jednoczesnych modyfikacji).
Chciałbym nieśmiało zaproponować drobne usprawnienia, nie wymagające wiele pracy, dotyczące statusów i powiadomień. Dane otrzymane w $vars w funkcji obsługi tego samego hooka różnią się w zależności od miejsca wywołania. Po poprawce mamy (testy z użyciem var_dump($vars)): 1) dla wywołania z hiperłącza: **** node_warn_after: zmieniono powiadomienie komputera array(2) { ["nodes"]=>array(1) { [0]=>string(1) "4" } ["warning"]=>int(1) } (dzięki ['warning'] wiadomo wprost czy włączono czy wyłączono powiadomienie).
2) bezpośredni klik na ikonie ostrzeżenia: **** node_warn_after: zmieniono powiadomienie komputera array(1) { ["nodeid"]=>string(1) "4" } (nie wiadomo czy powiadomienie zostało włączone czy wyłączone - trzeba patrzeć do bazy)
Obsługa takich niejednorodnych danych jest dość niewygodna: w funkcji hooka trzeba sprawdzać czy ustawione jest ['nodeid'] i jeśli nie to posługiwać się ['nodes']. Proponuję taką zmianę, by w obu przypadkach w $vars mieć element ['nodes'] (choćby z 1 pozycją) i ['warning'] -- to 1 zmiana, a wszystkie następne hooki będą dla wszystkich userów łatwiejsze do napisania (a obecne nie przestaną działać - backward compatibility ftw!)
Dla hooka node_set_after jest jeszcze inaczej: 1) klik w hiperłącze: **** node_set_after: zmieniono status komputera array(1) { ["nodes"]=>array(1) { [0]=>string(1) "4" } } (brak informacji czy komputery zostały podłączone czy odłączone - odpowiednika powyższego ['warning'])
2) klik bezpośrednio w ikonę (wynik jak wyżej): **** node_set_after: zmieniono status komputera array(1) { ["nodeid"]=>string(1) "4" }
Tutaj proponuję również to ujednolicić i dodać np. element ['status'] typu int zawierający info czy węzeł/węzły zostały włączone czy wyłączone.
Drugim wartościowym usprawnieniem byłaby możliwość anulowania wykonania danej operacji w hookach _before (taki jest sens hooków _before). Na przykład, na podstawie nodedel.php:
$LMS->ExecHook('node_del_before', $plugin_data); $LMS->DeleteNode($nodeid); $LMS->ExecHook('node_del_after', $plugin_data);
można by zmienić na coś podobnego do:
$cancel = $LMS->ExecHook('node_del_before', $plugin_data); if ($cancel === 1) { $LMS->DeleteNode($nodeid); $LMS->ExecHook('node_del_after', $plugin_data); }
To rozwiązanie też utrzymuje wsteczną zgodność z istniejącymi skryptami. Dzięki temu na podstawie tylko sobie znanych reguł (np. wyciąganych z innej bazy obsługiwanej przez inny system) funkcja hooka może decydować czy akcja powinna być wykonana, czy nie.
Długie wyszło... Wielkie dzięki i pozdrowienia.
2011/4/26 Digital Dog digitaldog4@gmail.com:
Chciałbym nieśmiało zaproponować drobne usprawnienia
Przyjmiecie patcha implementującego te rzeczy?
On 26.04.2011 22:01, Digital Dog wrote:
Tutaj proponuję również to ujednolicić i dodać np. element ['status'] typu int zawierający info czy węzeł/węzły zostały włączone czy wyłączone.
Czekamy na patcha. Zgłoś to do BTSu.
Drugim wartościowym usprawnieniem byłaby możliwość anulowania wykonania danej operacji w hookach _before (taki jest sens hooków _before). Na przykład, na podstawie nodedel.php:
$LMS->ExecHook('node_del_before', $plugin_data); $LMS->DeleteNode($nodeid); $LMS->ExecHook('node_del_after', $plugin_data);
można by zmienić na coś podobnego do:
$cancel = $LMS->ExecHook('node_del_before', $plugin_data); if ($cancel === 1) { $LMS->DeleteNode($nodeid); $LMS->ExecHook('node_del_after', $plugin_data); }
Ja bym node_del_after wyciągnął poza ifa, ale idea jest ok. Zgłoś do BTSu.
2011/4/29 A.L.E.C alec@alec.pl:
On 26.04.2011 22:01, Digital Dog wrote:
Tutaj proponuję również to ujednolicić i dodać np. element ['status'] typu int zawierający info czy węzeł/węzły zostały włączone czy wyłączone.
Czekamy na patcha. Zgłoś to do BTSu.
Patch jest gotowy, niestety BTS nie przysyła maila z potwierdzeniem rejestracji :(
$cancel = $LMS->ExecHook('node_del_before', $plugin_data); if ($cancel === 1) { $LMS->DeleteNode($nodeid); $LMS->ExecHook('node_del_after', $plugin_data); }
Ja bym node_del_after wyciągnął poza ifa, ale idea jest ok. Zgłoś do BTSu.
Powyżej oczywiście pomylony operator, miało być if ($cancel !== 1)
Jeśli samo usunięcie nie miało miejsca, to nie można wykonać akcji 'after' która (słusznie) założy, że obiekt jednak został usunięty, np.:
function del_before($vars) { if (...) return 1; // anulowanie usunięcia - załóżmy, że komp widnieje w bazie 'ważnych' }
$LMS->DeleteNode() nie jest wywołane
więc komunikat
function del_after($vars) { foreach ($vars['nodes'] as $node) error_log("Usunięto komputer $node"); }
nie miałby sensu.
Proszę o pomoc z tym BTSem.
uczestnicy (2)
-
A.L.E.C
-
Digital Dog