ChangeBlog  •  Archiwum  •  Kategorie  •  Artykuły  •  Galeria  •  Czytelnicy  •  Rupieciarnia
RSS wpisów  |  RSS komentarzy
I znowu Hierophant

Uruchomiłem sobie mały skrypt na całych zasobach Repo, przekonwertował html na lany tekst a potem porównał to ze średnią ilością tekstu na wydruku A4...
...i wyszło na to, że wydrukowanie całego Repo (pomijając strony ze statystykami) na kartkach A4, używając dziesięciopunktowego fontu z "pojedynczym odstępem między wierszami", zajęłoby ponad 200 stron. A dokładniej to coś koło 260. Nie zdawałem sobie sprawy, że tyle tego już jest. A o tym, że to własnoręcznie wstukałem, to wolę nawet nie myśleć.

Tematem głównym znowu jest Hiero. Usunąłem kilka paskudnych bugów i dopracowywałem brakujące części w hbs.py. Primo, zliczana jest już wielkość pakietu i zapisywana w INFO. Secundo, wprowadziłem sensowną obsługę skryptów (pre/post)(in/un), razem z dwoma samodzielnymi automatami - jednym rejestrującym i wyrejestrowującym dokumentację Info (hurra ;), drugim zajmującym się plikami konfiguracyjnymi. Tutaj właśnie nie wiedziałem za bardzo co też mam zrobić, bo... To bardziej złożone niż może się wydawać, a na dodatek jest kilka sposobów podejścia do problemu. Generalnie chodzi o to, żeby przy instalacji nowej wersji pakietu nie zamazać sobie przypadkiem starej konfiguracji. Z drugiej strony jeśli stara konfiguracja jest "waniliowa", tzn. użytkownik jej nie zmieniał po zainstalowaniu pakietu, to nowszy pakiet powinien bez skrępowania ją nadpisać. Tak też właśnie zrobiłem. Hierophant wyszukuje sobie pliki położone w katalogach /etc, /usr/etc, /usr/local/etc (o zgodności z FHS nie chcę teraz mówić, ja po prostu starałem się pokryć te najpopularniejsze przypadki - u siebie w domu używam tylko /etc). No więc wyszukuje sobie te pliki a następnie wylicza ich sumy md5 (za takie coś można pokochać Pythona - stosowny kawałek kodu miałem gotowy w pół minuty :) i zapisuje w specjalnym pliku. Oprócz tego generuje dwa dodatki do skryptów instalacyjnych, jeden wykonywany przy instalowaniu pakietu, drugi przy jego usuwaniu. Przy usuwaniu Hiero sprawdza po kolei czy pliki konfiguracyjne zmieniły zawartość (suma md5). Jeśli wykryje że któryś plik się zmienił, to zostaje wykonany jego duplikat z rozszerzeniem .hbs_saved. Czyli po usunięciu pakietu zmienione konfigi pozostają na dysku, ze zmienionymi nazwami. Przy instalacji pakietu z kolei Hiero sprawdza, czy dla każdego pliku konfiguracyjnego nie znajdzie na dysku jego wersji .hbs_saved. Jeśli znajdzie, to używa właśnie tej starej wersji, a nową zapisuje jako .hbs_new (czy jakoś tak), komunikując to od razu użytkownikowi.

Podoba mi się to rozwiązanie. Można na nim polegać (próbowałem ze sprawdzaniem stempli czasowych, ale wtedy ma się zbyt wiele przypadków w których wyniki są niewiarygodne i pojawiają się kolejne problemy jeśli przeanalizować sytuację kilku upgrade-ów pod rząd - więc padło na md5), no i powinien być obsługiwany całkowicie "per automata"

Uporządkowałem jeszcze bardziej budowanie pakietu, teraz wszystkie pliki tymczasowe wyparowują żeby nie zaśmiecać. Co prawda wszystkie pliki tymczasowe są plikami ukrytymi, ale mimo wszystko... Dokończyłem też system aplikowania patchy. Zmieniłem nieco rozlokowanie niektórych plików, niektóre nazwy itp. Wszystko to powinienem teraz zacząć dokumentować...

Napisałem mały skrypt "Hierophantize" - konwertuje istniejącą bazę RPM na bazę danych Hierophanta! Działa bardzo, bardzo dobrze. Mi osobiście bardzo podoba się output jaki generuje podczas pracy :) W każdym razie wystarczy ten skrypt uruchomić w jakimś katalogu, a katalog ten zostanie zapełniony hierophantowymi odpowiednikami informacji o pakietach wyciągniętymi od rpm-a. Konwertuje wszystko - nazwę, wersję, opis, listy plików, rozmiar pakietu, skrypty instalacyjne, sumy md5 plików konfiguracyjnych... Skrypt ten umożliwia bardzo gładkie przejście z systemu zarządzanego rpm-em na Hierophanta. Albo można go po prostu uruchomić na systemie erpeemowym żeby zobaczyć, jak by wyglądała normalna, używalna baza Hiero. Ja mam obecnie 217 pakietów w systemie. Na moim (słabym) komputerze konwersja zajęła trochę ponad pięć minut, ale się nie nudziłem - Hierophantize pokazuje na bieżąco co akurat porabia. Skonwertowane wpisy Hiero zajmują u mnie 5.1MB, a baza RPM z której powstały ma 7.7MB. Uff, źle bym się czuł gdyby moja (okrojona przecież) baza była większa ;) A jeśli w bazie Hiero skompresować listy plików gzipem, to całość zmniejsza się u mnie do 3.5MB. Nie, Hiero na razie nie przewiduje kompresji bazy, choć akurat dodanie wsparcia dla tej funkcjonalności wymagałoby naprawdę niewielkich przeróbek kodu. Na razie jednak nie uważam by wielkość bazy była problemem.

Ponieważ jednak mam już przekonwertowaną sporą bazę pakietów mogłem sprawdzić jak będzie się miała sprawa z wydajnością przy odpytywaniu. Wiadomo, RPM używa Berkeley DB. Binarna baza danych, optymalizowana, szybki dostęp do informacji, pisane w C procedury odpytywania informacji... ja stoję na drugim biegunie - dane w plaintekście, obróbka za pomocą coreutils... Największym kłopotem by było odczytywanie właściciela, grupy, uprawnień pliku. Sprawdzanie czasu modyfikacji. To się da spokojnie zrobić za pomocą zwykłych narzędzi, ale czas potrzebny na wykonanie tego dla kilkuset/kilku tysięcy plików rośnie zatrważająco. Więc tutaj bym musiał napisać jakiś sprytny programik w C, do tego jednego celu. Ale to później. Na razie sprawdzałem proste rzeczy, np. znalezienie plików należących do więcej niż jednego pakietu. Czas wykonywania ~0.6s :) Znalezienie niezaspokojonych zależności w całej bazie też wychodzi jakoś koło tego, poniżej sekundy. O dziwo, te globalne odpytywania wychodzą bardzo ładnie. Gorzej pewnie jest z namierzeniem "detalicznych" rzeczy, np. odszukaniem przynależności jakiegoś zadanego pliku. Np. "do jakiego pakietu należy /bin/ls?"... a, nie, zły przykład. Wynik jest dostępny po jakiejś 1 koma 1 sekundy, właśnie sprawdziłem (wystarczy egrep). Ale za to już weryfikacja całego pakietu na pewno będzie wymagała niezłych optymalizacji żeby osiągnąć zadowalającą szybkość... Ale na pewno nie jest źle. Bałem się, że wyląduję z prędkością operowania na bazie daleko za erpeemem. Ale chyba uniknąłem większości studni obliczeniowych i wyszło całkiem, całkiem...

No dobra, więc mam podstawowe skrypty, mam też przekonwertowaną bazę. Czas na testy :) O, mam gdzieś pod ręką gqview-1.5.0. Spróbuję go spakietować i zrobić upgrade... Chyba mogę ostrożnie zacząć używać Hiero i patrzeć, jak się sprawdza w praktyce. Dokumentację dorobię gdy tylko poprawki przestaną mieć tak rewolucyjny charakter. Prowizoryczna strona o Hiero jest już mocno nieaktualna, ale teraz naprawdę nie ma sensu bym brał się za dokumentowanie, jeśli codziennie bym musiał wprowadzać do tekstu jakieś poprawki...

Czy powinienem teraz trochę poblogować? Pewnie tak, ale nie mam sił. I nic się ciekawego nie wydarzyło. No, może tylko wspomnę, że się nie wyspałem dzisiaj. Nigdy nie daję rady wyspać się w nocy z niedzieli na poniedziałek. Nigdy. Ale za to pogoda była dzisiaj śliczna. Piętnaście stopni w plusie, czas wyciągnąć z szafy moją ulubioną zamszową kurtkę. A, no i przelotnie padał taki fajny, ciepły deszczyk. Prawdziwie wiosenny. Poza tym nic się nie wydarzyło. Rany, ależ jestem senny. Cały czas ziewam. Może to coś z ciśnieniem? Pewnie tak, skoro się tak nagle ociepliło...

Pozostaw dopisek: