Instalacja zamkniętego oprogramowania za pomocą sourcext

From WikiDoc

Jump to: navigation, search

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}
}
Personal tools