poldek2mc czyli dselect dla ubogich
Jarek Poplawski
domat w klub.chip.pl
Pon, 13 Paź 2003, 08:12:39 CEST
Poldek to świetne narzędzie. Szczególnie spodobał mi się jego
shell. Ale od początku brakowało mi wygodnego przeglądu, co jest
zainstalowane, a co zostało do dyspozycji.
Początkowo myślałem o monitowaniu autora poldka
o dodanie informacji o statusie pakietu (przynajmniej czy
zainstalowany) przy wyniku poleceń ls i desc. Brakowało mi
czegoś w rodzaju dselect czy aptitude z debiana (czytałem
na liście, że jest wuch ale chyba nieukończony) lub choćby
prostych rozwiązań stosowanych przez Slackware i FreeBSD. Tam
opisy zainstalowanych pakietów przechowywane są jako osobne pliki
odpowiednio w /var/log/packages/ i /var/db/pkg/nazwa_pakietu/.
W lewym oknie Midnight Commandera otwierałem ten katalog,
w prawym CD i miałem w miarę szybką orientację. Za to w poldku
ćwiczyłem zapamiętywanie nazw pakietów i pisanie komend w stylu
'ls kde*' 'ls -I kde*' i jeszcze 'desc kdeartwork'. Problem tym
większy, że PLD często dzieli oryginalne pakiety na wiele
mniejszych.
Okazuje się, że w prosty sposób można uzyskac w PLD nawet
większy komfort i wydobyć z poldka informację o pakietach
zainstalowanych i dostępnych. Rozwiązanie jest proste
i podejrzewam, że nie jestem pierwszym, który na nie wpadł.
Niestety poszukiwanie informacji o zasobach PLD jest czasem
skomplikowane, więc musiałem poćwiczyć skryptowanie.
W załączeniu zamieszczam skrypt poldek2mc, który mam nadzieję
ułatwi życie użytkownikom ceniącym sobie wygodę (o ile
tacy używają PLD). Po uruchomieniu z konta root polecenia:
poldek2mc -a
po pewnym czasie (u mnie 90 sek.) powinniśmy otrzymać w katalogu
/var/log/packages/ pliki o nazwach pakietów PLD (u mnie z PLD 1.0
instalowanego z użyciem trzech CD powstało ponad 5000 plików
i zajęło 26MB). Pliki oznaczone w mc '*' (wykonywalne)
oznaczają pakiety zainstalowane. Podglądając zawarośc pliku,
poznamy pełny opis pakietu (wraz z wykazem plików). Jeśli
wystarczy nam podstawowy opis pakietów, to zaoszczędzimy dużo na
czasie i trochę miejsca na dysku pisząc:
poldek2mc -d
U mnie zajmuje to 6 sek. i 20MB. Jest jeszcze kilka innych opcji
(np. --help). Oczywiście po każdych zmianach w instalacji trzeba
taką komendę powtórzyć.
Zajętość dysku jest dość duża. Wynika to z dużej liczby małych
plików, które na ext2 i tak zajmują cały sektor (u mnie 4kB).
Wygoda ma swoją cenę. Na ReiserFS powinno być oszczędniej.
Jak wyżej wspomniałem skrypt testowałem w wersji PLD 1.0
(poldek-0.18). Jeśli w nowszych wersjach poldka zmieniono format
wyjścia komend ls i desc albo oznaczenia opcji, to skrypt może
działać nieprawidłowo.
Oczywiście uruchamianie skryptu z konta roota nie jest zbyt
bezpieczne. Można tego uniknąć np. przez ustawienie poldka
jako suid i zmianę katalogu docelowego w poldek2mc.
Życzę "no problems"
Jarek Popławski
-------------- następna część ---------
#!/bin/sh
# Name: poldek2mc
# Author: Jaroslaw Poplawski <domat w klub.chip.pl>
# Licence: GNU GPL
# Requires: poldek, awk, findutils, gzip
#
# Warning!!! This directory is removed and recreated each time!
DESTDIR='/var/log/packages'
unset DOPT, LOPT, ZOPT, ARG
usage_en()
{
echo "Usage: poldek2mc OPTION..."
echo "Create a directory with files describing PLD packages"
echo "for easy browsing in Midnight Commander."
echo ""
echo "Options:"
echo "-a, --all include all described fields (filenames etc.)"
echo "-d, --descr include basic description (much faster)"
echo "-I, --installed only installed packages (less space)"
echo "-z, --gzip filter files with gzip (less space if --all)"
echo " --help display this help and exit"
echo ""
echo "Installed packages are marked as executable (* in mc)."
echo "Warning: Disk usage on ext2 may exceed 30MB. Approximately:"
echo "(disk sector size)*(number of available packages)*(1.3 if --all)."
echo "You must have rights to run poldek and to create (write)"
echo "the directory: $DESTDIR"
}
usage_pl()
{
echo "Składnia: poldek2mc OPCJA..."
echo "Utwórz katalog z plikami opisów pakietów PLD"
echo "w celu wygodnego przeglądania w Midnight Commanderze."
echo ""
echo "Opcje:"
echo "-a, --all użyj wszystkich pól opisu (nazwy plików itp.)"
echo "-d, --descr użyj podstawowego opisu (znacznie szybciej)"
echo "-I, --installed tylko zainstalowane pakiety (mniej miejsca)"
echo "-z, --gzip filtruj pliki przez gzip (mniej miejsca jeśli --all)"
echo " --help pokaż tę pomoc i wyjdź"
echo ""
echo "Zainstalowane pakiety są oznaczone jako wykonywalne (* w mc)."
echo "Ostrzeżenie: Użycie dysku dla ext2 może przekroczyć 30MB. Szacunkowo:"
echo "(rozmiar sektora dysku)*(liczba dostępnych pakietów)*(1.3 jeżeli --all)."
echo "Trzeba mieć uprawnienia do uruchomienia poldka i do utworzenia (zapisu)"
echo "katalogu: $DESTDIR"
}
usage()
{
if [ "`echo $LANG | cut -c -5 -`" = "pl_PL" -o \
"`echo $LC_MESSAGES | cut -c -5 -`" = "pl_PL" ]; then
usage_pl
else
usage_en
fi
}
if [ "$1" = "" ]; then
usage
exit 1
fi
for ARG in $* ; do
case $ARG in
-a|--all)
DOPT='-a'
;;
-d|--descr)
DOPT='-d'
;;
-I|--installed)
LOPT='-I'
;;
-z|--gzip)
ZOPT='-z'
;;
--help|*)
usage
exit 1
;;
esac
done
if [ -d $DESTDIR ]; then
# some security
if [ "`find $DESTDIR -not -type f | wc -l`" -eq 1 ]; then
rm -R $DESTDIR
fi
fi
mkdir $DESTDIR
[ $? -eq 0 ] || exit 1
cd $DESTDIR
if [ "`pwd`" = "$DESTDIR" ]; then
if [ "`ls -A`" = "" ]; then
poldek -q --shcmd='ls -I' | xargs touch
ls -A | xargs chmod u+x
poldek -q -f --shcmd="desc $DOPT *" |\
if [ "$LOPT" = "-I" ]; then
# only installed packages
awk 'BEGIN {RS="\nPackage: "; FS="\n";};\
{if($0) if(getline line < $1 == 0) print ";"RS$0 >> $1 ; close($1); }'
else
awk 'BEGIN {RS="\nPackage: "; FS="\n";};\
{if($0) print ";"RS$0 >> $1 ; close($1); }'
fi
if [ "$ZOPT" = "-z" ]; then
## Optionaly gzip all files
ls -A | xargs gzip
fi
fi
fi
Więcej informacji o liście dyskusyjnej pld-users-pl