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