RSS Feed

Posts Tagged ‘lms’

  1. LMS i odzyskiwanie z backupu

    Grudzień 2, 2011 by 0verlord

    Sytuacja jak zazwyczaj: pada mi host z lmsem, backup się zrobił i odzyskał. Trzeba po prostu odzyskać, bez upgrade i innych takich tam sztuczek. No to jadę – przenoszę bazy, ale mysql < baza.sql rzuca permission denierem i wymaganiami super usera. Dokładnie takimi erorrami rzucało: Napotkano błędy w bazie danych!
    Zapytanie: CREATE FUNCTION lms_current_user() RETURNS int(11) NO SQL
    RETURN @lms_current_user;
    Błąd: You do not have the SUPER privilege and binary logging is enabled
    (you *might* want to use the less safe log_bin_trust_function_creators
    variable)
    Zapytanie: CREATE VIEW customersview AS SELECT c.* FROM customers c
    WHERE NOT EXISTS ( SELECT 1 FROM customerassignments a JOIN
    excludedgroups e ON (a.customergroupid = e.customergroupid) WHERE
    e.userid = lms_current_user() AND a.customerid = c.id)
    Błąd: FUNCTION lms.lms_current_user does not exist

    Przywróciłem bazę z doc/lms.mysql, ale nie pomogło, dalej pluło errorami z customerviewsem.
    Wujek google skierowął mnie tu.

    W skrócie: uwaliłem viewsy, wszystkie:
    CREATE VIEW nas AS
    SELECT n.id, inet_ntoa(n.ipaddr) AS nasname, d.shortname, d.nastype AS type,
    d.clients AS ports, d.secret, d.community, d.description
    FROM nodes n
    JOIN netdevices d ON (n.netdev = d.id)
    WHERE n.nas = 1;

    CREATE VIEW vnodes_mac AS
    SELECT nodeid, GROUP_CONCAT(mac SEPARATOR ',') AS mac
    FROM macs GROUP BY nodeid;

    CREATE VIEW vnodes AS
    SELECT n.*, m.mac
    FROM nodes n
    LEFT JOIN vnodes_mac m ON (n.id = m.nodeid);

    CREATE VIEW vmacs AS
    SELECT n.*, m.mac, m.id AS macid
    FROM nodes n
    JOIN macs m ON (n.id = m.nodeid);

    CREATE VIEW customersview AS
    SELECT c.* FROM customers c
    WHERE NOT EXISTS (
    SELECT 1 FROM customerassignments a
    JOIN excludedgroups e ON (a.customergroupid = e.customergroupid)
    WHERE e.userid = lms_current_user() AND a.customerid = c.id);

    i dodałem funkcję:
    CREATE FUNCTION lms_current_user() RETURNS int(11) NO SQL RETURN @lms_current_user;.

    Wszystko oczywiście po dodaniu bazy i usera do niej.Chciałem też odpowiednio okomentować w blogu z linka przydatne informacje, a tutaj niespodzianka:

    WordPress database error: [INSERT command denied to user 'xxx'@'localhost' for table 'wp_comments']

    Życie. Więc podziękuję tu:

    Thenks meeeen, I loveeee youuuuu 😀 (i napraw sobie zapomnianego worpdressa ;-))

    EDIT: wszystkie viewsy trzeba skasować, jak leci wszystkie, tj.

    DROP VIEW IF EXISTS nas;
    DROP VIEW IF EXISTS vnodes_mac;
    DROP VIEW IF EXISTS vnodes;
    DROP VIEW IF EXISTS vmacs;
    DROP VIEW IF EXISTS customersview;

    W sumie ciekawe, dlaczego dump nie odtworzył viewsów. Ale nie chce mi się szukać.


  2. Postgresql, lms.current_user i błąd

    Sierpień 19, 2011 by 0verlord

    Szybko o LMSie, postgresie i bugu będącego efektem niedoczytania konfiguracji.

    Dokumentacja mówi, żeby: Wymagane jest dodanie wpisu w postgresql.conf: custom_variable_classes = 'lms'

    Natomiast nie mówi, co się stanie, jeżeli tego wpisu nie będzie. Oczywiście, można z sourca wyczytać nie? 😛

    Efekt wygląda tak:
    Zapytanie: SELECT set_config('lms.current_user', '1', false)
    Błąd: BŁĄD: nierozpoznany parametr konfiguracyjny "lms.current_user"
    Zapytanie: SELECT COUNT(id) AS total, COUNT(CASE WHEN status = 3 THEN 1 END) AS connected, COUNT(CASE WHEN status = 2 THEN 1 END) AS awaiting, COUNT(CASE WHEN status = 1 THEN 1 END) AS interested FROM customersview WHERE deleted=0
    Błąd: BŁĄD: nierozpoznany parametr konfiguracyjny "lms.current_user"
    Zapytanie: SELECT SUM(a.value)*-1 AS debtvalue, COUNT(*) AS debt FROM (SELECT SUM(value) AS value FROM cash LEFT JOIN customersview ON (customerid = customersview.id) WHERE deleted = 0 GROUP BY customerid HAVING SUM(value) < 0 ) a
    Błąd: BŁĄD: nierozpoznany parametr konfiguracyjny "lms.current_user"

    Dodajemy wpis, o którym mowa w docku i error znika.


  3. LMS i parser.so #2

    Marzec 25, 2011 by 0verlord

    A jednak da się w, nazwijmy to, LMS WAY (TM). Parser.so, jak donosi dokumentacja, ma kilka stałych, dla których nie potrzeba generować zapytania. Są to odpowiednio tablice CUSTOMERS, NODES i NETWORKS ze zdefiniowaną listą pól.
    Czyli zamiast
    { result = zapytanie }
    Można od razu przejść do właściwego efektu zapytania, np. zapytanie z poprzedniej notki może wyglądać tak:
    {for (r=0; r<number(NODES); r++)}\
    # {NODES[r].owner}:{NODES[r].ownerid}
    {NODES[r].mac}-{NODES[r].ip}
    {/for}\

    Tylko w wersji 1.11.11 nie wiedzieć czemu, predefiniowane zapytanie jest generowane błędnie, trzeba czekać na deweloperów, albo poprawić sobie samemu w pliku:
    modules/parser/extensions/sql.h

    i przekompilować demona. W 1.11.12 to też nie działa, ale na forum już jest zgłoszony bug, może w cvsie nafixują.

    Jeżeli ktokolwiek ma wątpliwości, dlaczego lepiej stosować rozwiązania natywne a nie swoje własne zapytania, odpowiedź nasuwa się sama – w przypadku fuckupa przy upgrade do kolejnej wersji, będzie można na forum obsobaczyć developerów 😉 A tak, przy próbie zgłoszenia buga ojebią nas, bo komu by się chciało ogarniać cudze selecty.

    A tak bardziej serio, przy usunięciu wszystkich nienatywnych rozwiązań z LMSa, przed aktualizacją trzeba tylko czytać changeloga, a nie czekać na kogoś, kto nam poprawi zamotkę w zapytaniach. Przejęcie po kimś rozwiązania natywnego jest dużo prostsze w ogarnięciu, bo chociażby można poczytać dokumentację żeby skumać jak to działa, a nie się habilitować z zawartości cudzych zakrętów w mózgu.

    Po to ludzie piszą narzędzia, żeby inni mogli a nich korzystać, a nie – psia mać – koło od nowa wymyślać. Dość jęczenia [:


  4. LMS i parser.so

    Marzec 25, 2011 by 0verlord

    Dzisiaj będzie o LMSie i jednej ciekawostce, którą trafiłem ostatnio.

    Demon LMSa (lmsd) ma taki ciekawy moduł, nazywa się parser.so. Przy odrobinie samozaparcia i przeczytania dokumentacji, da się generować z bazy różności przy wykorzystaniu czegoś, co się nazywa Tscript. Język jak język, trzeba się nauczyć.

    No i przy okazji upgrade z 1.10 do 1.11, odziedziczyłem generatory adresów mac z bazy. Wyglądały mrocznie, joiny, left joiny, inner joiny, ograniczenia do networków zaszyte w selectach, ogólnie porażka. Nie wiem, czy w 1.10 nie działały takie rzeczy jak lms-makemacs, ale jeżeli tak, to ten, kto klikał LMSa wtedy ewidentnie chciał się popisać umiejętnością składania nikomu do niczego nie potrzebnych zapytań SQLa. Cóż, można i tak.

    Chwilowo musiałem wykorzystać tamte skrypty, więc trzeba było wygenerować listę maców do skryptu odpalającego regułki filtrów.
    Ostatecznie zapytanie wyglądało tak:

    SELECT INET_NTOA(ipaddr) AS ip, mac, name FROM macs LEFT JOIN nodes ON nodeid = nodes.id

    LMSd generował pusty plik, a debug mówił, że się wydupca na linijce z zapytaniem. Usuwając ‚AS ip’ pomagał o tyle, że zapytanie nie pluło błędem, natomiast kolumna nie nazywała się IP, więc dalsza część skryptu jej nie łapała.

    Szybki debug innych LMsów pokazał, że mam podobne zapytania z klauzulami AS cośtam, tyle, że nie są one na pierwszej pozycji zaraz za selectem. No to zmieniłem zapytanie na
    SELECT mac, INET_NTOA(ipaddr) AS ip

    i wygenerowało mi przepiękny plik.
    Parser.so ty wuju ;->


  5. LMS, aktualizacja z 1.10.x do 1.11.x

    Marzec 21, 2011 by 0verlord

    Trafiła mnie ostatnio przyziemność zaktualizowania LMSa z 1.10.4, do najnowszej. Stara wersja nie chciała działać z najnowszym Debianem (Squeeze). Ciekawe, że stary LMS na nowym Debianie pokazywał menu bez logowania i pozwalał na przeróżne manipulacje na systemie.

    Problemów jest na pewno kilka, dwa najgrubsze to brak aktualizacji kilku rzeczy w bazie.

    nr 1. bug przy próbie zalogowania się,

    Zapytanie: ALTER TABLE cashimport ALTER customerid DROP NOT NULL
    Błąd: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOT NULL' at line 1
    Zapytanie: ALTER TABLE cashimport ALTER customerid SET DEFAULT NULL
    Błąd: Invalid default value for 'customerid'
    Zapytanie: ALTER TABLE cashimport ADD FOREIGN KEY (customerid) REFERENCES customers (id) ON DELETE SET NULL ON UPDATE CASCADE
    Błąd: Can't create table 'lms_atm.#sql-24e7_a6b' (errno: 150)

    naprawiamy tak:
    > ALTER TABLE cashimport MODIFY customerid integer default null;

    Bug nr dwa, jak się okazuje po upgrade, komputery klientów nie są przypisane do zobowiązania, bo się baza mocno zmieniła pomiędzy 1.10 i 1.11. Generalnie można to oczywiście przeklikać ręcznie jak by ktoś był pracowity, ale ja tam osobiście wolę automatykę.

    > insert into nodeassignments ( nodeid, assignmentid ) select nodes.id as blabla, assignments.id as assignmentid from nodes left join assignments on assignments.customerid = nodes.ownerid;

    I potem już wszystkie komputery są automagicznie przypisane do odpowiedniego zobowiązania (liability).

    Ciekawe, że trafiłem ten błąd przypadkiem, bo nie chciał mi działać moduł tc-ng w lmsd. TC dla odmiany działa ok, i generuje poprawne regułki.

    Jaka jest różnica pomiędzy tc-ng i tc? TC dla każdego kompa generuje pełny pakiet, czyli podłączamy 3 kompy do taryfy 1mbit i każdy jeden komp dostaje 1mbit. TC-NG generuje klasy per klient, czyli nie ważne ile komputerów podłączymy, klient nie przeskoczy 1mbit.

    Generalnie po wykonaniu altera i selectoinserta wszystko działa. O ile oczywiście ktoś nie wyprodukował skryptów, które generują np. regułki do firewalla na podstawie starego schematu bazy.