«««
Pokazywanie postów oznaczonych etykietą bash. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą bash. Pokaż wszystkie posty

1 grudnia 2010

Znajdź mnie nim przepadnę

"To było gdzieś w zakładkach, coś z gnome w nazwie, a w tytule były gwiazdki."
Znasz to? Standardowy manager zakładek firefox'a jest fajny, ale nie potrafi wyszukiwać więcej niż jednego warunku. Na szczęście baza to SQLite i przy odrobinie trudu ładnie się obrabia.

moz_places.sh

W skrypcie trzeba zmienić pierwszy parametr srcdb na swoją bazę. Tworzymy kopię bazy, bo firefox blokuje do niej dostęp, jeśli jest włączony.
Na wyjściu skryptu dostajemy listę postaci:
link | tytuł
Można też ustawić wypisywanie tylko jednego z nich. Uzyskane dane można już dowolnie przeszukiwać, jeśli się tylko wie jak :). Do pobrania moz_places.sh lub obejrzenia:

#!/bin/bash

srcdb=$HOME/.mozilla/firefox/profil.lucas/places.sqlite
db=/dev/shm/places.sqlite # /dev/shm/ to RAM
[ -f $db ] && rm -f $db
cp $srcdb $db || exit 1
# ------------------------------------------------
usage(){
    echo "${0##*/} { b, bookmarks | h, history} [ -u,--url | -t,--title ]"
    exit $1
}
# ------------------------------------------------
get_history(){
    sqlite3 $db <<!
        SELECT $select
        FROM moz_places p, moz_historyvisits h
        WHERE p.hidden=0 AND p.id = h.place_id
        ;
!
}
# ------------------------------------------------
get_bookmarks(){
    sqlite3 $db <<!
        SELECT $select
        FROM moz_places p, moz_bookmarks b
        WHERE p.hidden=0 AND p.id = b.fk
        ;
!
}
# ------------------------------------------------
# wybieramy co wyświetlić: url, tytuł, wszystko
select='p.url , p.title'
[[ $2 ]] && {
    case "$2" in
        -u|--url)   select='p.url' ;;
        -t|--title) select='p.title' ;;
        *)          usage 1 ;;
    esac
}
# ------------------------------------------------
# wybieramy źródło: zakładki, historia
[[ $1 ]] && {
    case "$1" in
        h|history)   get_history ;;
        b|bookmarks) get_bookmarks ;;
        *)          usage 1 ;;
    esac
} || usage

Jak tego używać

Skrypty wymaga podania, z której tablicy w bazie korzystamy (historia, czy zakładki), a drugi parametr jest opcjonalny.

$ moz_places.sh
moz_places.sh { b, bookmarks | h, history} [ -u,--url | -t,--title ]

$ moz_places.sh b # or h
http://www.web.com|Web title
...

$ moz_places.sh b -u # or --url
http://www.web.com
...

$ moz_places.sh b -t # or --title
Web title
...
Szukaj w adresach ftp
$ moz_places.sh b | grep ^ftp
szukaj tytułu zaczynającego się od słowa fedora
$ moz_places.sh b | awk -F'|' '$2 ~/^fedora/ {print $0}'
... również z dużej litery
$ moz_places.sh b | awk -F'|' '$2 ~/^[fF]edora/ {print $0}'
szukaj tytułu zaczynającego się od słowa [fF]edora, ale w adresie strony nie może być słowa fedora
$ moz_places.sh b \
    | awk -F'|' '$2 ~/^[fF]edora/ {print $0}' \
    | awk -F'|' '$1 !~/fedora/ {print $0}'
Na koniec coś głupiego :) Która domena jest Twoim zdaniem najciekawsza?
$ moz_places.sh b \
    | awk -F'/' '{print $3}' \
    | sed 's:^www\.::g' \
    | sort | uniq -cd | sort -n | tail -n 7

Gdyby ktoś chciał pogrzebać w bazie, a ma zerowe doświadczenie proponuję wygodny GUI sqliteman lub konsole:
pomoc sqlite3 $db ".help"
lista tablic sqlite3 $db ".tables"
schemat wybranej tablicy sqlite3 $db ".schema moz_places"

12 października 2010

FTP jak Dropbox

Do codziennego przeglądania ftp korzystam z FileZilla, ale przydaje się czasem mechanizm bezmózgowej synchronizacji ftp z lokalnym folderem.
$ cat ./ftp.borzole.net.sh
#!/bin/bash

# synchronizacja z ftp://borzole.net

HOST="borzole.net"
USER="borzole"
PASS="123tajne"
LOCAL="${HOME}/studio/${HOST}" # lokalny korzeń
mkdir -p "$LOCAL"

LCD="$LOCAL/$2" # folder lokalny
RCD="/$2"       # folder zdalny

MIRROR='mirror'
MIRROR+=' --verbose'
MIRROR+=' --exclude-glob ".ftpquota"'  # ignorowany plik
MIRROR+=' --exclude-glob "mediawiki/"' # ignorowany folder

transfer(){
    lftp -c "set ftp:list-options -a;
    open ftp://$USER:$PASS@$HOST;
    $* "
}

case $1 in
    ls)   transfer "cd $RCD ; ls" ;;
    pull) transfer $MIRROR "$RCD" "$LCD" ;;
    push) transfer $MIRROR --reverse --delete "$LCD" "$RCD" ;;
    *) echo -e "Użycie:\n\t${0##*/} {ls|pull|push} doc/php" >&2 ;;
esac
O szczegółach jak to działa i co można dopisać proszę poczytać w man lftp
Wyjście z przykładowej sesji:
$ ftp.borzole.net.sh
Użycie:
    ftp.borzole.net.sh {ls|pull|push} doc/php
sprawdzam co jest na koncie
$ ftp.borzole.net.sh ls
drwx------    7 330        330              2048 Oct 12 11:53 .
drwx------    7 330        330              2048 Oct 12 11:53 ..
-rw-------    1 330        330                14 Oct 12 12:37 .ftpquota
-rw-r--r--    1 330        330               154 Jul 22  2009 .php.ini
drwxr-xr-x    2 330        330              2048 Oct 12 11:52 MySQLadmin
drwxr-xr-x    2 330        330              2048 Oct 12 11:52 PgSQLadmin
drwxr-xr-x    2 330        330              2048 Oct 12 11:47 borzole
drwxr-xr-x    4 330        330              2048 Oct 12 11:52 doc
-rw-r--r--    1 330        330               385 Mar  2  2010 index.php
drwxr-xr-x    9 330        330              2048 Oct 12 12:22 mediawiki
pobieram całość
$ ftp.borzole.net.sh pull
albo tylko wybrany folder
$ ftp.borzole.net.sh pull doc/php
Po wykonaniu modyfikacji mogę wysłać/zsynchronizować folder w drugą stronę
Uwaga! to polecenie usunie na zdalnym serwerze wszystkie pliki, których nie ma lokalnie.
Z tego powodu zalecam dwa razy się zastanowić, zanim coś wypchniemy na serwer.
$ ftp.borzole.net.sh push doc/php
Dobra, to czemu to jest lepsze niż np. FileZilla? Bo mogę połączyć to z inotify (fsniper, inotify-tools, incron) i mieć automatyczną synchronizację folderu podobnie jak to robi Dropbox. Używam do tego fsniper z prostą regułką:
$ cat ~/.config/fsniper/config
watch {
    ~/studio/borzole.net/doc {
        recurse = true
        * {
            handler = /path/to/script/ftp.borzole.net.sh push doc
        }
    }
}

30 września 2010

Zamknij drzwi za sobą

Przyszła mi dzisiaj potrzeba zrobić coś w nijakim czasie. Czas był tak nijaki, że się tylko na moment zamykania systemu nadawał. Chciałem dodać jakiś GUI, więc musiało to się odbywać przy wylogowywaniu z GNOME.
Pierwszy pomysł był na skróty. Wystarczy napisać skrypt z listą co ma się wykonać, a na końcu dodać:

gnome-session-save --logout-dialog
Drugi nie był lepszy i różnił się tylko tym, żeby skorzystać z d-bus. Poszukiwałem jednak przeznaczonego do tego miejsca.

Jeśli korzystamy z menadżera logowania GDM (domyślny dla GNOME, często domyślny również dla XFCE itp.) możemy skorzystać z pliku: /etc/gdm/PostSession/Default, który jest wykonywany jako root po zakończeniu sesji, ale zmienne środowiskowe ustawione są na użytkownika. Jest też pewna niejasność w dokumentacji. Teoretycznie X-y są w tym momencie zatrzymywane i może dojść do pewnych błędów w działaniu graficznych aplikacji. W praktyce okna straciły obramowanie (metacity), ale wszystko działa. W normalnej pracy przy wylogowaniu wszystkie otwarte okna są ubijane. Skrypt "PostSession" uruchamia się przed masakrą okien, ale już po usunięciu obramowania (to tak, żeby nie było zdziwienia).

Aby umożliwić każdemu użytkownikowi stworzenie własnego skryptu wylogowania, wystarczy w pliku /etc/gdm/PostSession/Default umieścić:

#!/bin/sh

if [ -f ~/.post_session ] ; then
    su -l $USER -c '/bin/bash ~/.post_session'
fi

exit 0
Teraz każdy użytkownik może utworzyć skrypt bash ~/.post_session, który wykona się przy wyjściu.

Spójrzmy jeszcze na sam skrypt. Przydałoby się widzieć, co się dzieje przy jego wykonywaniu. Najprościej będzie przekierować wyjście skryptu do pliku:

exec &> ~/.post_session.log
lub osobno błędy i standardowe wyjście
exec 1> ~/.post_session.log
exec 2> ~/.post_session.error
Jednak kiedy testujemy skrypt, wolelibyśmy widzieć wyjście zwyczajnie w terminalu. Można dodać jeszcze jeden trik i przekierowanie nastąpi tylko jeśli skrypt uruchomiony jest poza terminalem.
if ! tty -s ; then
    exec &> ~/.post_session.log
fi

No dobrze, ale do czego to się może przydać? Mam np. głupi zwyczaj zapominania, że jakaś maszynka wirtualna jest włączona i chciałbym, aby przy wyjściu były wszystkie usypiane. Tak mniej więcej wygląda kod do masowego usypiania:

for v in $(VBoxManage -q list runningvms | cut -d'"' -f2) ; do
    VBoxManage -q controlvm "$v" savestate
done
Dodajmy jeszcze trochę kosmetyki. Przydałby się pasek postępu zenity i ostatecznie skrypt ~/.post_session wygląda tak:
#!/bin/bash

# post_session

# przekieruj wyjście do logu, jeśli nie uruchomiono z terminala
if ! tty -s ; then
    exec &> ~/.post_session.log
fi

# pasek postępu, czyta z deskryptora 4
exec 4> >(zenity --progress --pulsate --width=300 --auto-close --auto-kill )

echo "# zamykanie systemów wirtualnych ..." >&4
for v in $(VBoxManage -q list runningvms | cut -d'"' -f2) ; do
    VBoxManage -q controlvm "$v" savestate
done

echo "100" >&4   # zamknięcie paska
exec 4>&-        # zamknięcie deskryptora

Mam nadzieję, że nikogo nie zanudziłem i ktoś dotarł do końca, a jeszcze jak się komuś przyda to hu! hu! :)

23 sierpnia 2010

cpufreq scaling governor

Przełącznik trybów pracy procesora. Przykładowo w trybie ondemand procesor skaluje częstotliwość do obecnego obciążenia, a w trybie performance będzie się męczył na maksa.
Trzeba mieć włączoną usługę cpuspeed. Skrypt ładuje brakujące moduły skalowania, wyświetla tylko dostępne tryby i uwzględnia wszystkie rdzenie.
Jeśli chcemy ustawić domyślnego zarządcę przy starcie fedory, wówczas należy w skrypcie startującym usługę:
/etc/rc.d/init.d/cpuspeed zmienić linię default_governor=powersaver
Do pobrania cpufreq_scaling_governor.sh (repo)

Aktualizacja: 2010.08.25-18:48

  • przed wyjściem usuwane są z kernela nieużyte moduły
  • zastąpiłem 'sudo' przez 'su -'
  • i kosmetyka

20 sierpnia 2010

Ikona w zasobniku dla wirtualnego serwera

Dziś będzie trochę odsmażany kotlet. Przebudowałem swój skrypt do włączania i usypiania maszyny wirtualnej. Wirtualnego serwera nie trzeba oglądać w okienku VirtualBox, ale przydałoby się wiedzieć czy jest uruchomiony i gdzie. Zrobiłem więc za pomocą zenity i notify-send taki mały skrypcik do kontroli. Zgodnie z zasadą "maximum treści, minimum słów" jadziem:
Menu → Internet → Fedora Server

[lucas@jedral ~]$ cat /usr/local/share/applications/fserver.desktop

[Desktop Entry]
Version=1.0
Encoding=UTF-8
Name=Fedora Server
Exec=fserver.sh
Icon=/usr/share/icons/Fedora/scalable/apps/anaconda.svg
Terminal=false
Type=Application
Categories=Network
Po włączeniu ikona jest w trybie nasłuchiwania (nie klikalna) do czasu aż serwer wystartuje:
po chmurce wiadomo, że już działa, a jeśli kliknąć na ikoną dostajemy możliwość zamknięcia serwera:
Skrypt do pobrania: fserver.sh (repo). Napisany jest chyba dość przejrzyście, więc łatwo go przerobić i dostosować, nawet jeśli ma monitorować coś zupełnie innego.
Gdyby kogoś interesowała tapeta ;P to tu proszę spojrzeć: nfsec.pl/galeria

Z rzeczy mniej "innowacyjnych". VirtualBox domyślnie ustawia sieć na NAT, więc trochę poklikałem w globalnych ustawieniach VirtualBox. Dodałem kartę "host-only" obok NAT. Nie wiem czy tak jest dobrze i poprawnie, ale działa.
Dla wygody używania, włączyłem ssh, dorobiłem kluczyki i mogę montować przez sshfs aliasami w ~/.bashrc

alias fsserver-on="sshfs server:/ $HOME/studio/fserver"
alias fsserver-off="fusermount -u $HOME/studio/fserver"

12 lipca 2010

Zielony konfigurator

Zielony to skrypt bash (a właściwie ich zbiór), który docelowo miał ułatwić początkującym użytkownikom Fedory korzystanie z systemu. Chciałem, aby skrypt pozwalał się łatwą rozbudowywać o nowe funkcjonalności. W tym celu wymyśliłem prosty mechanizm automenu, budujący automatycznie menu na podstawie zawartości folderu. Opis poszczególnych elementów menu jest pobierany przez autoinfo jako pierwszy komentarz w skrypcie, oddzielony z góry i z dołu pustą linią. Tym samym, skrypt sam w sobie nic nie robi, a jedynie umożliwia poruszanie się po menu zbudowanego z właściwych skryptów i kategorii z podfolderów. Taka budowa pozwoliła rozbudowywać skrypt przez wrzucenie pliku (dowolny skrypt/program ) do właściwego folderu. Pluginy (poprawnie rozszerzenia) mogą być dostarczone jako paczki "rpm" z repo. Zielony posiada wbudowany mechanizm do instalacji i usuwania pluginów. Wbudowany został też mechanizm włączania repozytoriów. Jedno z menu umożliwia płynne przejście z root w tryb użytkownika.

Ostatecznie pomysł porzuciłem z racji ograniczeń bash i miałem tego skryptu nie opisywać. Mechanizm "menu" działa wybornie, jednakże budowany przy pomocy zenity interfejs wymaga zbyt wiele klikania.

Zrzuty ekranowe można zobaczyć w poście na forum.fedora.pl

do pobrania:

tarball oraz rpm dla fedory w repo

26 maja 2010

Słucham tylko mamy

Wszechobecna randomizacja

Naskrobałem skrypt dla audacious losujący ustaloną ilość piosenek do listy odtwarzania: audacious-rand.sh (repo). Player ciężko znosił przeciążone listy i potrafi się wywrócić kopytkami do góry. Więc teraz to bash losuje za niego ~100 utworów ze zbioru (suwak 5-500) i generuje listę. Całkiem zgrabnie mi to wyszło :P

Czas zagłady

Jakiś czas temu zrobiłem skrypt, który przenosi aktualnie graną piosenkę w audacious do kosza z GNOME. Można pobrać stąd: audacious-delete.sh (repo)
Dla wygody użytkowania podpiąłem go pod skrót w GNOME
gconftool-2 -s /apps/metacity/global_keybindings/run_command_10 -t str "<Super>F10"
gconftool-2 -s /apps/metacity/keybinding_commands/command_10 -t str "audacious-delete.sh"
Gdy tylko zaskrzeczy kawałek, przy którym scyzoryk się w kieszeni otwiera, wciskam Win+F10 i


Dziadyga wyląduje w koszu z pełną ścieżką, więc jakby co to idzie się kapnąć gdzie to było.
Sajonara!

25 marca 2010

Pupa pod gilotyną

O matko, ale jestem leniwy. Nawet opis musiałem przekopiować.
#!/bin/bash

# gilotyna.sh -- sieka plakat (obraz) na części
#
# wymaga:           ImageMagick, zenity
# licencja:         GPLv2+
# autor:            Łukasz Jędral, borzole@gmail.com, http://jedral.one.pl
...

Po resztę trzeba zajrzeć do źródła: gilotyna.sh (repo) i wywołać:
gilotyna.sh --help
Skrypt może działać jako aplikacja GUI (zenity), w tym "nautilus-scripts" lub całkowicie bez X-ów
gilotyna.sh -c pupa.jpg 3 4
Sposób jest bardzo prosty. Obrazek jest przycinany dla każdej części od nowa. Nie jest to zbyt wydajna metoda, ale lepszej nie znalazłem (właściwie to nie znalazłem żadnej)
Jeśli posiekany ma być PDF, a nie obrazek to najpierw trzeba go skonwertować do obrazka:
convert -density 300 plik.pdf plik.png"
lub użyć takiej ładnej oprawki jako nautilus-scripts: pdf2png.sh (repo)



Pupa znacznie mniej mi się podoba po posiekaniu (trochę się jej urosło).

Natomiast sieczka totalna wygląda tak: