Unix Shell: Beagle – buszowanie w zbiorach

Opublikował siefca śr 18 mar 2009 00:18:00 GMT

Beagle to system indeksowania zawartości, który korzystając z odpowiednich modułów gmera po dyskach, udziałach sieciowych, kontaktach komunikatora i odwiedzonych stronach WWW. Wszystkie zebrane informacje zapisuje sobie w bazie danych, a nawet w kilku bazach, po to, aby można je było potem wyszukiwać. Jest to ta sama filozofia co znane z Mac OS-a X narzędzie Spotlight. Użytkownicy środowiska graficznego Gnome korzystają z Beagle’a, ponieważ jest on tam – jeśli mnie pamięć nie myli – domyślnie instalowany. W efekcie używając odpowiedniego skrótu klawiszowego możesz uruchomić dialog, do którego wpisujesz słowa kluczowe poszukiwanego zasobu; może to być wykonawca utworu wpisany w znaczniki wewnątrz pliku MP3, fragment tekstu dokumentacji w jakimś uniweralnym formacie, nazwa pliku, lub inne rozumiane przez narzędzie kryterium.

owca Przyczyną, dla której zainteresowałem się Beaglem był fakt, że potrzebowałem czegoś co będzie rozsądnie indeksowało zbiory. Na dyskach mam różnicowo-przyrostowe kopie zapasowe pięciu systemów i standardowe narzędzie locate a w zasadzie slocate i jego podprogram updatedb nie dawało mi czasem spać. Komputer rzęził głowicami dysków niczym krępowana drutem kolczastym, zgrzytająca zębami młoda owca cierpiąca na artretyzm. Potrafisz sobie wyobrazić taką sytuację? Jeśli nie, to nic trudnego – nagraj kilkaset gigabajtów danych i uruchom na nich updatedb stawiając komputer niedaleko łóżka.

Co wybrać?

Postanowiłem więc poszukać coś konkurencyjnego i trafiłem na projekt rlocate, którego celem jest stworzenie narzędzia podobnego do locate, ale wykorzystującego możliwości specjalnego modułu kernela Linux, który sprawdza, czy coś nie zmieniło się w systemie plików. Chodzi o to, aby bazy zawierająca informacje o plikach i katalogach nie była aktualizowana cyklicznie, ale na bieżąco, gdy w systemie plików coś się zmienia. Dzięki temu nie tracimy czasu na codzienne czytanie całej struktury katalogowej. Jednak pokusa, żeby indeksować nie tylko pliki i katalogi, ale też zawartości znanych typów zbiorów była na tyle silna, że zacząłem testować też narzędzie GNU doodle. Pozwala ono uruchamiać statyczne indeksowanie (np. raz w tygodniu) dla systemowych zbiorów, a dodatkowo daje użytkownikowi możliwość tworzenia własnej bazy. Jednak w praktyce okazało się, że proces tworzenia bazy zwyczajnie się ślimaczy. Mało tego, spróbuj wysłać do tego procesu sygnał przerwania pracy lub zakończenia, a baza stanie się niemożliwa do odczytania i trzeba ją będzie generować od początku. Co więcej, nie skończyłem nawet jej tworzyć, bo generowanie indeksu i skanowanie moich plików trwało ponad 30 godzin i nie chciało się zakończyć. Nie była to awaria, bo w trybie debug widziałem, który plik jest akurat przetwarzany. Zrezygnowałem więc z pomysłu używania doodle’a posiłkując się jeszcze argumentem mówiącym, że podczas uaktualniania bazy nie można korzystać z wyszukiwania. Czyli przez 2 dni w tygodniu mój komputer byłby nie dość, że włączony, to jeszcze upośledzony. Owca w drucie uderza głową w ogrodzenie!

Beagle?

owca
Indeksowanie podpatrzone
narzędziem beagle-status
Beagle okazał się najbardziej przyjaznym tworem. Pozwala zakładać różne statyczne indeksy, na przykład dla systemowych katalogów zawierających dokumentacje, czy dla kartoteki /usr/share/doc i /usr/share/man, ma modularną budowę, a do monitorowania wskazanych katalogów wykorzystuje systemowy mechanizm Inotify. Wygląda to tak, że w systemie mamy bazy danych z zapisanymi plikami i opcjonalnie zindeksowanymi zawartościami niektórych zbiorów, a także demona, który te bazy odczytuje i do nich zapisuje. Każdy użytkownik uruchamia własną instancję tej usługi, która jest w stanie przeczytać również bazy globalne, tworzone cyklicznie przez administratora, czy raczej przez będący na jego usługach skrypt. Ta instancja uruchamiana przez użytkownika tworzy też własne bazy, w których znajdują się informacje o zbiorach z katalogu domowego i innych wskazanych lokalizacji. Można zadawać demonowi pytania już w trakcie tworzenia bazy, można uruchamiając demona kazać mu użyć odpowiednich wtyczek (np. indeksujących foldery z pocztą elektroniczną czy plików zawierających historię odwiedzanych stron WWW). Po wysłaniu sygnału zakończenia lub przerwania pracy baza nie jest popsuta, bo program we właściwy sposób ją zamyka.

Narzędzie blocate

Zrezygnowałem z narzędzia locate, więc chciałbym mieć jakiś jego zamiennik. Na szczęście z pakietem dostarczany jest skrypt o nazwie blocate, który emuluje działanie tego polecenia. Nie jest to jednak dokładnie to i polegając na nim w skryptach możemy się zawieść. Po pierwsze każdy plik jest tam poprzedzony schematem unikatowego lokalizatora zasobu w postaci file:///, a po drugie zdarza się, że wyświetlane są nie tylko pliki, a przeszukiwane nie tylko ich nazwy, ale też zawartości. Poza tym, jeśli na dysku mamy zbiór o nazwie na przykład siefca, to zapytanie siefc nie spowoduje jego znalezienia. Wynika to nie tyle z niedokładnego odwzorowania działania narzędzia locate w skrypcie blocate, ale z faktu, że polecenie beagle-static-query trudno zmusić, aby dopasowywało nazwy plików do wzorców. Nie wiem, czy jest to kwestia wyłącznie posiadanej przeze mnie wersji, ale symbole gwiazdki działają wyśmienicie jedynie w wyszukiwaniu zawartości, a nie nazwy pliku czy lokalizatora zasobu.

Implementacja locate

Pokusiłem się o napisanie swojego skryptu na podstawie blocate, który jakoś imituje działanie pogrzebanego polecenia.

Jak to działa?

Najpierw pokażę, jak przygotowałem środowisko. Po pierwsze, do opcji montowania systemów plików, tam gdzie to możliwe dopisuję przyspieszającą pracę opcję user-xattr. Dzięki niej narzędzie będzie mogło zapisywać sobie niektóre potrzebne informacje używając rozszerzonych atrybutów plików. Po przemontowaniu systemów plikowych uruchamiam demona beagled ze swojego zbioru startowego .profile w następujący sposób:

  BEAGLE_HOME="${HOME}"
  export BEAGLE_HOME

  beagle-info --daemon-version >/dev/null 2>/dev/null || \
  beagled --backend +Thunderbird \
        --backend +Blam \
        --backend +Files \
        --backend +IndexingService \
        --backend +Labyrinth \
        --backend +Liferea \
        --backend +NautilusMetadata \
        --backend +Opera \
        --backend +Pidgin \
        --backend +Tomboy
        --backend +applications \
        --backend +configs \
        --backend +documentation \
        --backend +libraries \
        --backend +manpages \
        --backend +media

Dzięki temu zabiegowi demon indeksujący i pozwalający na zadawanie pytań będzie startował za każdym razem, gdy użytkownik zaloguje się w systemie. Komendy beagle-info używam, żeby zorientować się, czy przypadkiem już nie jest uruchomiona instancja programu. Z kolei parametry --backend oznaczają wtyczki indeksujące, z których ma korzystać beagled. Aby wyświetlić wszystkie dostępne użyj beagled --list-backends. Backendy dzielimy na systemowe i użytkownika. Te pierwsze powiązane są z globalnymi bazami zakładanymi przez wywoływane najczęściej cyklicznie (z Crona) polecenie beagle-build-index. Samo narzędzie wymaga podania sporej liczby opcji, więc najczęściej jest uruchamiane ze skryptu beagle-crawl-system, który uwzględnia konfiguracje poszczególnych baz (systemowych backendów) umieszczone w katalogu /etc/beagle/crawl-rules/. Oto przykład takiej konfiguracji:

  CRAWL_ENABLED="yes"
  CRAWL_INDEX_NAME="media"
  CRAWL_PATHS="/mnt/media"
  CRAWL_RECURSIVE="yes"
  CRAWL_DISABLE_FILTERING="no"
  CRAWL_DISABLE_DIRECTORIES="no"
  CRAWL_DISABLE_ON_BATTERY="yes"
  CRAWL_CACHE_TEXT="yes"
  CRAWL_REMOVE_DELETED_FILES="yes"

Jeśli chcesz stworzyć taki własny backend, to po prostu załóż tam plik o nazwie crawl-nazwa_backendu i dostosuj opcje. W podręcznikach ekranowych i na stronie projektu są wyjaśnienia tych parametrów. Poza tym, jeżeli chcesz korzystając z blocate brać pod uwagę dodane backendy, to warto zajrzeć potem do /etc/beagle/blocate.conf.

Konfiguracje backendów użytkownika rezydują w jego katalogu domowym, w podkatalogu .beagle, natomiast ustawienia blocate w .beagle/config.

Wrapper

Kolejny krok to stworzenie skryptu imitującego działanie locate. Można go zapisać np. jako /usr/local/bin/locate:

#!/bin/bash
#
# locate wrapper for beagle-query
# 
# Copyright (C) 2009 Paweł Wilk <pw-at-gnu.org>
# License: GNU GPL version 3 or higher
#
QUERY="$*"

# Get the config directory
if [ -n "${BEAGLE_HOME}" ]; then
        CONFDIR="${BEAGLE_HOME}/.beagle/config"
elif [ -n "${BEAGLE_STORAGE}" ]; then
        CONFDIR="${BEAGLE_STORAGE}/config"
elif [ -n "${BEAGLE_CONF_DIR}" ]; then
        CONFDIR="${BEAGLE_CONF_DIR}"
else
        CONFDIR="/etc/beagle"
fi

CONFFILE="${CONFDIR}/locate.conf"

if ! [ -e "${CONFFILE}" ]; then
        echo "Error: config file \"${CONFFILE}\" does not exist"
        exit 1
fi

# Read config settings
source "${CONFFILE}"

unset OPTS
for i in ${STATIC_INDEXES}; do
    OPTS=("${OPTS[@]}" "--add-static-backend" "${i}")
done
for i in ${BACKENDS}; do
    OPTS=("${OPTS[@]}" "--backend" "${i}")
done

exec beagle-static-query ${OPTS[@]}  \
          type:file -inarchive:true "*${QUERY}*" \
          --backend none | \
          grep "${QUERY}" | sed 's/^file:\/\///'

Uwaga: Opcja --backend none jest celowa i zapobiega używaniu wszystkich backendów, jeśli we wczytywanym pliku konfiguracyjnym nie podano żadnego.

Następnie należy założyć plik konfiguracyjny, który będzie miał na początku taką samą składnię, jak ten dla blocate:

  cp /etc/beagle/blocate.conf /etc/beagle/locate.conf

Warto jednak go dostosować i wyłączyć niepotrzebne backendy, a w szczególności IndexingService. U mnie wygląda on tak:

  BACKENDS="configs applications monodoc \
            documentation manpages \
            libraries media Files"

  # System-wide static indexes
  # Use full path of non-system static indexes
  STATIC_INDEXES=""

Zakładając, że uruchomiliśmy wcześniej beagle-crawl-system i uruchomiony jest demon beagled działający na prawach naszego użytkownika, możemy już napisać: locate nazwaplikulubjegoczęści i powinniśmy uzyskać sensowne wyniki.

Podziel się

Trackbacki

Użyj następującego trackbacka na swojej stronie:

http://randomseed.pl/trackbacks?article_id=unix-shell-beagle-%E2%80%93-buszowanie-w-zbiorach&day=18&month=03&year=2009

Komentarze

  1. linux powiedział over 2 years later:

    I think this is one of the most important information for me. And i’m glad reading your article. But wanna remark on few general things, The website style is great, the articles is really excellent. Good job, cheers

    Ten komentarz oczekuje na akceptację. Nie ukaże się do czasu zaakceptowania przez autora..

(leave url/email »)

   Pomoc języka formatowania Obejrzyj komentarz