Instalacja zamkniętego oprogramowania za pomocą sourcext
From WikiDoc
Contents |
Sourcext
Aplikacja do instalacji programów o zamkniętych źródłach nie mogących się znaleźć w repozytorium z racji licencji. Obecnie paczkę z programem można ściągnąć: http://www.zhr.pl/~johny/KateOS/sourcext-0.1-i486-2.tgz
Buildy
Aplikacja oparta jest o buildy (skrypty w bashu). Każdy z nich zawiera odpowiednie funkcje wywoływane później przez sourcext a. Oto one:
Funkcje
- _mkdir - tworzy katalog dla buildu
- _download - ściąga potrzebne dla siebie pliki
- _extract - Rozpakowuje pliki w odpowiednie miejsca
- _patch - nakłada łatki na instalatory
- _install - wykonuje czynności instalacyjne
- _makepkg - tworzy paczkę
- _installpkg - instaluje paczkę w systemie
- _clear - czyści śmieci
Zmienne
Do dyspozycji mamy następujące zmienne
Zdefiniowane przez sourcext
- ${tmp} - katalog tymczasowy = ${TMP:-/tmp/}
- ${tmp_dir} - katalog tymczasowy gdzie dzieją się wszystkie cudeńka zanim zrobimy paczkę = ${tmp}sourcext/
- ${var_dir} - katalog w którym lądują paczki po stworzeniu = /var/sourcext
- ${lib_dir} - spolszczenia i pliczki do includowania oraz inne
Opis ściąganego pliku
- ${installer} - nazwa pliku instalera danej aplikacji
- ${filename} - nazwa ściągniętego pliku (bez rozszerzenia)
- ${dirname} - nazwa katalogu, po rozpakowaniu ściągniętego pliku (zazwyczaj = ${filename})
- ${ext} - rozszerzenie ściąganego pliku
- ${url} - domyślna lokacja skąd możemy ściągnąć plik
- ${url_pl_PL} - lokacje charakterystyczne
- ${url_en_US} - dla danych państw na podstawie
- ${url_${LANG}} - zmiennej systemowej LANG
Opis katalogów i ścieżek
Wszystkie ścieżki kończą się /
- ${dir} - Ścieżka do katalogu gdzie będziemy grzebać z naszym programem
- ${extractdir} - Ścieżka do katalogu gdzie wylądują pliki po rozpakowaniu
- ${pkgdir} - Ścieżka do katalogu gdzie wylądują pliki gotowe do spaczkowania
Opis innych plików
- ${program} - nazwa programu, którą podało się w linii poleceń jako parametr install
- ${pkg} - ścieżka do paczki
Uwagi do funkcji
- _mkdir - powinno czyścić pozostałości po ostatnich śmieciach - czyli tak np. katalog ${dir} - wywala po prostu wszystko
- _download - wget. Na pewno co opcją -c na wypadek gdyby była kiedyś możliwość dociągania niedociągniętych plików
- _extract - rozpakowanie plików. Generalnie żadna filozofia. Tylko wcześniej wejść do ${dir}, żeby tam się pliki rozpakowały
- _patch - albo przez echo "wyjście_diff a" | patch -p0 - pliczek, albo brzez seda nałożenie łatej na instalator. Te tekstowe instalatory są popierdzielone i czasami trzeba je poprawić.
- _install - stworzenie w ${pkgdir} całego (poza install) systemu plików , jaki powinien posiadać programik. Nadanie odpowiednich praw itd... sourcext udostępnia funkcję autoinstall() o dwóch parametrach:
- pierwszy parametr to polecenie, które należy wykonać
- drugi to stdin, jaki należy przekazać do wywołanych poleceń
- _makepkg - przygotowanie katalogu install w ${pkgdir} i wykonanie makepkg i testpkg
- _installpkg - wykonanie pkg -r ${program} pkg -i ${pkg}
Autoinstall
Funkcja służy głównie do obsłużenia tekstowych instalatorów. Powiedzmy, że instalator zadaje dwa pytania na pierwsze chcemy odpowiedzieć "y" na drugie chcemy odpowiedzieć "no". plik instalatora nazywa się (${installer})=install.sh i chcemy go obsłużyć przez checkinstall, tak aby automatycznie wyłapał pliki, które instalator gdzieś kopiuje. Do tego install.sh podamy dodatkowy paramter --prefix/usr. Zrobimy to tak:
autoinstall "checkinstall -S -y --nodoc ${extractdir}${installer} --prefix=/usr" "y\nno\n\n"
Na pierwsze pytanie odpowiedzlieśmy "y" i podaliśmy za nim "\n" (zatwierdzenie [ENTER]). Później odpowiedzieliśmy "no" i znowu [ENTER] ("\n") i na końcu [ENTER] ("\n") ponieważ checkinstall zgłasza błąd, który trzeba potwierdzić :P
Uwagi do checkinstall
Checkinstall nie wyłapuje plików tworzonych metodą:
echo " " > /path/do pliku
Należy wtedy zmodyfikować instalator tak aby wcześniej robił "touch" na tym pliku. Mało wyszukana metoda działająca gdy echo jest w jednej linijce:
sed -e 's/^\(.*\) > \(.*\)$/touch \2 ; \1 > \2/' ${extractdir}${installer} > ${extractdir}${installer}_
mv ${extractdir}${installer}_ ${extractdir}${installer}
chmod u+x ${extractdir}${installer}
Obecny przykładowy build [Opera]
##
# EXTRACT file
##
installer='install.sh'
filename=opera-9.22-20070716.6-shared-qt.i386-en
dirname=opera-9.22-20070716.6-shared-qt.i386-en-655
ext=tar.gz
url=http://get.opera.com/pub/opera/linux/922/final/en/i386/shared/${filename}.${ext}
url_pl_PL=http://ftp.task.gda.pl/pub/opera/linux/922/final/en/i386/shared/${filename}.${ext}
url_en_US=http://ftp.ussg.iu.edu/opera/linux/922/final/en/i386/shared/${filename}.${ext}
##
# Directories
##
dir=${tmp_dir}${program}/
extractdir=${dir}${dirname}/
pkgdir=${dir}${program}_makepkg/
##
# PKG file
##
arch=i386
version=9.22
build=1
pkg=${var_dir}${program}-${version}-${arch}-${build}.tgz
##
# Clear catalog
##
_clear () {
if [ -e ${dir} ]; then
rm -fr ${dir}
fi
}
_mkdir () {
_clear
mkdir -p ${dir}
}
##
# Downloading file
##
_download () {
eval langURL=\${url_${LANG}}
if [ -n $langURL ]; then
url=$langURL
fi
wget -c $url -O ${dir}${filename}.${ext}
}
##
# Extract file to current directory
##
_extract () {
cd ${dir}
tar zxf ${dir}${filename}.${ext}
}
##
# Set patchs if need
##
_patch () {
sed -e 's/^\(.*\) > \(.*\)$/touch \2 ; \1 > \2/' ${extractdir}${installer} > ${extractdir}${installer}_
mv ${extractdir}${installer}_ ${extractdir}${installer}
chmod u+x ${extractdir}${installer}
}
##
# Run installer with automatic params
##
_install () {
mkdir ${pkgdir}
(
cd ${extractdir}
if [ -e ${extractdir}${dirname}-${arch}-${build}.tgz ]; then
rm -fr ${extractdir}${dirname}-${arch}-${build}.tgz
fi
autoinstall "checkinstall -S -y --nodoc ${extractdir}${installer} --prefix=/usr" "y\ny\n\n"
)
mkdir -p ${pkgdir}usr/doc/${program}-${version}
cp ${extractdir}LICENSE ${pkgdir}usr/doc/${program}-${version}
chgrp bin ${pkgdir}usr/bin/*
chmod 0755 ${pkgdir}usr/bin/*
gzip ${pkgdir}usr/share/man/man1/*
mv ${pkgdir}usr/share/doc/opera ${pkgdir}usr/share/doc/${program}-${version}
}
##
# Delete old package if exist
##
_delpkg () {
if [ -e $pkg ]; then
rm -fr $pkg
fi
}
##
# Prepare files to package and make it
##
_makepkg () {
_delpkg
(
cd ${pkgdir}
tar zxf ${extractdir}${dirname}-${arch}-${build}.tgz
find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
)
local slackdesc="${program}: $program (Opera webbrowser)
${program}:
${program}: Popular fast and usefull webbrowser
${program}:
${program}: http://www.opera.com/
${program}:"
echo "${slackdesc}" > ${pkgdir}install/slack-desc
local slackdescpl="${program}: $program (Przeglądarka Opera)
${program}:
${program}: Popularna szybka i użyteczna przezglądarka
${program}:
${program}: http://www.opera.com/
${program}:"
echo "${slackdescpl}" > ${pkgdir}install/slack-desc.pl_PL
cd ${pkgdir}
makepkg -c y -l y -d y ${pkg}
testpkg ${pkg}
}
##
# Install package
##
_installpkg () {
pkg -r ${program} 2> /dev/null
pkg -i ${pkg}
}

