ALEC> lukas wrote:
daemon/almsd.c - kilka drobnych zmian
ALEC> możesz napisać parę słów, jak to działa. Nie wiem czy dobrze rozumiem. ALEC> Uruchamiasz dla każdej sieci demona? I on sprawdza czy jego sieć jest w ALEC> tabeli reloads? Dokladnie tak.
Tabela wygląda tak: CREATE TABLE reloads ( netid int(10) unsigned NOT NULL default '0', recordtype enum('0','1') NOT NULL default '0', userid int(10) unsigned NOT NULL default '0', timestamp int(10) unsigned NOT NULL default '0', PRIMARY KEY (netid,recordtype) ) TYPE=MyISAM;
Chyba tylko pole recordtype wymaga wyjaśnienia. 0 - polecenie przeładowania (to widać na screenie z mojego pierwszego posta) 1 - potwierdzenie przeładowania (takie rekordy wstawiał by ALMSD po przeładowaniu konfiguracji i w LMS-UI byłoby widać, które z instancji ALMSD się przeładowały i w jakim momencie)
Jeśli netid==0 to jest to polecenie przeładowania wszystkich sieci. Jeśli userid==0 to jest to potwierdzenie przeładowania i w LMS-UI zamiast imienia i nazwiska admina będzie "ALMSD".
PRZYKŁAD: Z poziomu LMS-UI któryś z adminów chce przeładować konfigurację dla sieci 'SIEC1' - wybiera ją z listy, klika przeładuj i... Dodawany jest rekord z ID sieci, ID admina, recordtype='0', timestamp=time().
ALMSD na jakimś tam odległym routerze. 1. Odczytać timestamp poprzedniego przeładowania (np z pliku) lub 0 - $last_timestamp 2. Odczytać z lms.ini sieci, którymi ma się zajmować dana instancja ALMSD - $networks (tablica z IDkami sieci) 3. Wykonać zapytanie "SELECT timestamp FROM reloads WHERE (netid IN(".join(','$networks).") OR netid=0) AND recordtype = '0' AND timestamp > $last_timestamp 4. Czy zwrócono jakiekolwiek rekordy? 4.1 [TAK] - pojechać po zdefiniowanych w lms.ini instancjach 4.1.1 Dla każdego ID z $networks wykonać zapytanie "REPLACE INTO reloads values($netid,'1',0,".time().")" 4.1.2 Zapisać aktualny timestamp w pliku 4.1.3 Zakończyć działanie 4.2 [NIE] - zakończyć działanie
Mniej więcej w ten sposób. Dzieki tym zmianom, będzie można przeładowywać konfigurację tylko na konkretnym routerze.
^^^^^^^^^^^^^ ver1
W między czasie wpadłem na kolejną - lekko ulepszoną i elastyczniejszą wersję tego mechanizmu. Niech to bedzie ver2, opis poniżej.
Niektóre moduły ALMSD wymagają w konfiguracji wylistowania sieci, które mają brać pod uwagę podczas działania - tutaj można by zmodyfikować ALMSD i takie moduły aby to ALMSD przekazywał IDki sieci, którymi poszczególne moduły mają się zająć - to by wyeliminowało konieczność definiowania listy sieci w kilku miejscach - wystarczyło by w sekcji [lmsd]
Algorytm z ver1 w przypadku gdy ALMSD będzie mial skonfigurowanych kilka sieci - dokona przeładowania zawsze i dla każdej sieci jeśli tylko istnieje polecenie przeładowania dla którejkolwiek z nich. W ver2 od punktu 4 wyglądałoby to tak: 4. Czy zwrócono jakiekolwiek rekordy? 4.1 [TAK]Pobrać IDki sieci, z rekordów z punktu 4. - $reload_networks 4.1.05 pojechać po zdefiniowanych w lms.ini instancjach podając każdej z nich (każdemu modułowi) listę sieci ($reload_networks), które ma wziąć pod uwagę 4.1.1 Dla każdego ID z $reload_networks wykonać zapytanie "REPLACE INTO reloads values($netid,'1',0,".time().")" 4.1.2 Zapisać aktualny timestamp w pliku 4.1.3 Zakończyć działanie 4.2 [NIE] - zakończyć działanie
I dla ver1 i ver2 można założyć że definicja sieci w sekcji [lmsd] pliku lms.ini ma zwierać nazwy sieci oddzielone spacją. ALMSD zanim zacząłby cokolwiek sprawdzać to przetłumaczył by sobie te nazwy na IDki - to by jeszcze bardziej uelastyczniło cały mechanizm - ale z drugiej strony nie wydaje mi się, żeby tablica networks a zarazem powiązania nazwasieci <=> idsieci często się zmieniały.
huh - no ja bym to tak widział :)
Mam gotowe pliki reload.php i reload.html. W alms.c dopiero dłubię i pewnie mi to chwilę zajmie ale jeśli pomysł się spodobał to może ALEC by się zają plikiem alms.c?
-------------------- Łukasz Wojciechowski