sobota, 12 listopada 2011

Cacti, hex-y i inne stringi

Kilka tygodni temu zrobiłem upgrade Cacti do 0.8.7h z jakiegoś wcześniejszego wydania (któraś wcześniejsza literka w alfabecie). Na pierwszy rzut oka wszystko było ok, do momentu kiedy ludzie zaczęli zgłaszać, że wykresy się nie rysują, albo się źle rysują. Co ciekawe, problemy dotyczyły tylko wykresów związanych z MySQL-em oraz MongoDB.
Pierwsza myśl -> coś się zwaliło w skrypcie. Co prawda dwa różne skrypty, no ale. Odpalenie z ręki każdego skryptu i zonk, wszystko chodzi prawidłowo, nawet wartości są ok. No to w cacti uruchomienie trybu debug i zaczęły się dziać cuda. Skrypt wykonuje się poprawnie, w wyniku zwraca poprawną wartość, zapamiętywana odpowiedź jest poprawna, a do rrd zapisywana jest wartość z czapy, na pierwszy rzut oka totalnie pokręcona nie mająca specjalnie związku z poprawnym wynikiem. Znajomość moja php nie jest raczej na wysokim poziomie, ale
 echo 'dupa'; 
napisać potrafię, co do dalszego szukania błędu jest wystarczającą umiejętnością.

Koniec końców trafiłem na kawałek takiego kodu
                        [...]
                        /* special case of one value output: hexadecimal to decimal conversion */
                        }elseif (is_hexadecimal($value)) {
                                /* attempt to accomodate 32bit and 64bit systems */
                        [...]
,gdzie is_hexadecimal wyraźnie nie tak się zachowuje, tzn w starej wersji wyglądało to tak:
/* is_hexadecimal - test whether a string represents a hexadecimal number,
     ignoring space and tab, and case insensitive.
   @arg $hexstr - the string to test
   @arg 1 if the argument is hex, 0 otherwise, and FALSE on error */
function is_hexadecimal($hexstr) {
        return preg_match('/^[a-fA-F0-9 \t]*$/', $hexstr);
}
W nowej wersji wygląda to tak:
/* is_hexadecimal - test whether a string represents a hexadecimal number,
     ignoring space and tab, and case insensitive.
   @arg $hexstr - the string to test
   @arg 1 if the argument is hex, 0 otherwise, and FALSE on error */
function is_hexadecimal($hexstr) {
        return preg_match('/^[a-fA-F0-9: \t]*$/', $hexstr);
}
Różnica dość subtelna, ale ':' powoduje, że wynik typu 'cd: 3' jest interpretowany jako hex i rezultacie staje się liczbą 3283 zamiast po prostu 3.

Jest co prawda zgłoszony jest bug, ale rozwiązanie zaproponowane:
/* is_hexadecimal - test whether a string represents a hexadecimal number,
     ignoring space and tab, and case insensitive.
   @arg $hexstr - the string to test
   @arg 1 if the argument is hex, 0 otherwise, and FALSE on error */
function is_hexadecimal($hexstr) {
        $hexstr = trim($hexstr);
        $i      = 0;
        $length = strlen($hexstr);
        while ($i < $length) {
                $part = substr($hexstr,$i,2);
                $i += 2;

                if (!preg_match('/[a-fA-F0-9]/', $part)) {
                        return false;
                } elseif ($i < $length) {
                        if (substr($hexstr,$i,1) != ":") {
                                return false;
                        }elseif ($i + 1 == $length) {
                                return false;
                        }
                        $i++;
                }else{
                        $i++;
                }
        }

        return true;
}
, nadal nie działa. W efekcie kolega programista zasugerował, aby funkcja wyglądała tak:
/* is_hexadecimal - test whether a string represents a hexadecimal number,
     ignoring space and tab, and case insensitive.
   @arg $hexstr - the string to test
   @arg 1 if the argument is hex, 0 otherwise, and FALSE on error */
function is_hexadecimal($hexstr) {
        $hexstr = trim($hexstr);
        $i      = 0;
        $length = strlen($hexstr);
        while ($i < $length) {
                $part = substr($hexstr,$i,2);
                $i += 2;
                if(strlen($part) != 2) {
                        return false;
                }
                if (!preg_match('/[a-fA-F0-9]/', $part)) {
                        return false;
                } elseif ($i < $length) {
                        if (substr($hexstr,$i,1) != ":") {
                                return false;
                        }elseif ($i + 1 == $length) {
                                return false;
                        }
                        $i++;
                }else{
                        $i++;
                }
        }

        return true;
}
Teraz klucz:wartość będzie rozpoznawana prawidłowo, reszta stringów aa:bb:cc... będzie hex-em. Nadal nie rozwiązuje to problemu kiedy faktycznie mamy do czynienia z hex-em typu 'cd:02', no ale nie można mieć wszystkiego. W moim środowisku nigdzie nie odczytuje hexów, więc jest mi to obojętne.

Smutne, ale wychodzi brak trzymania się sztywnych reguł jak powinna wyglądać odpowiedź skryptu przez twórców cacti. Wystarczyły określić prostą regułę jak może nazywać się klucz, albo od jakich liter nie może się zaczynać lub też jaką musi mieć minimalną długość zamiast próbować tworzyć rozwiązania 'broken by design'.

PKP - świat absurdu

Wyprawa do Krakowa zakończyła się reklamacją, na którą otrzymałem odpowiedź:
Dla pełnej jasności, tak wygląda pociąg spełniający wszystkie standardy.
Toaleta w 1 klasie:
A to przedział 2 klasy, który bynajmniej nie jest przedziałem menadżerskim:
Jak słowo daje, przepłacę, przemęczę się samochodem, ale PKP będę omijał szerokim łukiem.

czwartek, 22 września 2011

Dell RAID

Dell jak każdy inny vendor, dostarcza oprogramowanie potrzebne do czytania różnych sensorów i innych informacji o sprzęcie z poziomu systemu operacyjnego. Problem z oprogramowaniem Dell-a w porównaniu do np. HP to poziom skomplikowania. Nie chodzi tutaj o obsługę, ale ilość rzeczy które się instalują. Dodatkowo często gęsto coś nie działa na systemach nie wspieranych typu CentOS. Jednak najbardziej boli mnie ilość zasobów, które są zajmowane przez OMSA, żeby przeczytać sobie np. stan dysków. Co ciekawe do zmiany podejścia do tematu sprowokował mnie inżynier systemowy Dell-a. W czasie zgłaszania reklamacji (pad dysku), poprosił o wygenerowanie raportu nie jak poprzednio przy użyciu OMSA, ale z użyciem MegaCLI. Okazuje się, że zamiast 30 pakietów do wszystkiego wystarczy jeden mały programik, który załatwia większość moich potrzeb. Później okazało się, że niestety nie każdy kontroler Della jest wspierany przez MegaCLI, więc doszedł mpt-status oraz sas2ircu. W efekcie powstał prosty skrypt do nagiosa zwracający stan dysków/raid-a na serwerze.

https://github.com/ljagiello/scripts/blob/master/check_dellraid.rb
Do poprawnego działania potrzebne jest:
- 8.01.06_Linux_MegaCLI.zip
- FAQ_9633_SAS2IRCU_Phase_5.0-5.00.00.00.zip
- mptstatus

poniedziałek, 6 czerwca 2011

World IPv6 Day

gratka.pl has IPv6 address 2a02:1320:ffff:0:195:8:99:42
dom.gratka.pl has IPv6 address 2a02:1320:ffff:0:195:8:99:31
moto.gratka.pl has IPv6 address 2a02:1320:ffff:0:195:8:99:26
praca.gratka.pl has IPv6 address 2a02:1320:ffff:0:195:8:99:9
turystyka.gratka.pl has IPv6 address 2a02:1320:ffff:0:195:8:99:24
gratka-technologie.pl has IPv6 address 2a02:1320:ffff:0:195:8:99:45

All AAAA records.

niedziela, 5 czerwca 2011

systemd-analyze

Intel Q6600 @ 2.40GHz
[lcf@heaven ~]$ systemd-analyze time
Startup finished in 1201ms (kernel) + 2261ms (initrd) + 14595ms (userspace) = 18058ms

[lcf@heaven ~]$ systemd-analyze blame
[...]
90ms console-kit-daemon.service




AMD Athlon II Neo N36L Dual-Core

[lcf@lues ~]$ systemd-analyze time
Startup finished in 2172ms (kernel) + 5111ms (initrd) + 12816ms (userspace) = 20100ms

[lcf@lues ~]$ systemd-analyze blame
25021ms console-kit-daemon.service

Huh, 280x more time.

czwartek, 10 lutego 2011

PLNOG #6

http://plnog.pl/spotkanie-6-marzec/agenda


Dzień pierwszy, 16:50 – 17:35, ścieżka 3.