přejít na obsah přejít na navigaci

Linux E X P R E S, Tvorba instalačních balíčků v Linuxu

Tvorba instalačních balíčků v Linuxu

ikonka.png

Programujete v Linuxu a potřebujete vytvořit instalační balíček, který je nezávislý na typu linuxové distribuce? Na první pohled se zdá tato otázka možná absurdní. Přesto řešení existuje.


Je tomu pár dní, kdy jsem něco podobného potřeboval. Sám používám CentOS, přátelé a klienti však mají rozličné distribuce. Od Ubuntu na desktopu, přes serverové instalace Slackware, CentOS, RHEL nebo Debian. Potřeboval jsem vytvořit instalační balíček, který by byl nezávislý na distribuci a uživatelsky přívětivý. Zároveň jsem nechtěl udržovat různé typy instalací (DEB, RPM …) nebo dokonce programovat vlastní instalátor ke každé své aplikaci. Ze začátku jsem tento problém řešil přes balíčky tar.gz nebo zip a k tomu vytvořený instalační sh skript. To vše zabaleno ke stažení. Správce serveru si s tímto způsobem hravě poradil, ale běžný uživatel měl problém. Přeci jen se v shellu moc nepohybuje a převod RPM na DEB a naopak, nebo dokonce instalaci podpory instalace těchto balíčků na jiných distribucích, jsem po nich nemohl chtit. Na MS Windows je tohle o něco jednodušší. Stačí použít Install Creator od firmy ClickTeam (http://www.clickteam.com/), či jiný produkt tohoto typu a pak jen maximálně řešit spuštění pod admin právy ve Vistách či jen pod pouhým uživatelem.

Po dlouhém hledání jsem našel program GlassWorks (http://www.halogenware.com/), který pracuje obdobným způsobem. Bohužel má jednu nevýhodu. Pro svůj chod potřebuje mít v systému nainstalovanou podporu Javy a funguje pouze s GUI. Takže na server s shellem bez GUI stejně použít nelze.

glasswork1.png

Program GlassWorks

Hledal jsem různé možnosti. Tvorba RPM pomocí programu pkgbuilder (http://rpm-pkgbuild.sourceforge.net/), přes tvorbu DEB programem Debian Package Maker (http://brainstorm.ubuntu.com/idea/8258/) a zjišťování jejich možností. Nakonec jsem narazil, při instalaci nvidia driverů u svého notebooku a při instalaci některých programů, na sh skripty (s příponou sh nebo run), které měly v sobě zabudovaný binární balíček. To mne zaujalo. Na NETu jsem hledal, ale nic moc nenašel. Zoufale jsem tedy napsal dotaz na fórum ubuntu, zda s těmito skripty nemá již někdo zkušennost. Tam se našli milí lidé, co poradili. Poslali odkaz na článek časopisu Linux Journal (http://www.linuxjournal.com/content/add-binary-payload-your-shell-scripts) s poznámkou, ať to vyzkouším a dám zpětně vědět výsledek. Řekl jsem si, že klidně budu “pokusným králíkem”, hlavně když svůj problém vyřeším. Článek jsem pročetl, skripty jsem otestoval. Musel jsem provést drobné úpravy, ale vše fungovalo. Nakonec jsem drze zkusil do nich zabudovat práci s dialogovými okny (dialog, gdialog, zenity …). A výsledný sh skript s binární částí byl na světě, a to včetně možnosti práce s GUI.

pkgbuild1.png
Program PKGBuilder


Debian Package Maker
Program Debian Package Maker

Postup:

1. Vytvoříte si skript, který vám daný výsledný instalační sh skript s binární částí vytvoří. Například "add_to_install.sh". Tento skript vytvoří výsledný skript s názvem install.sh a s právy 755.

#!/bin/bash

# Check for payload format option (default is uuencode).
uuencode=1
if [[ "$1" == '--binary' ]]; then
binary=1
uuencode=0
shift
fi
if [[ "$1" == '--uuencode' ]]; then
binary=0
uuencode=1
shift
fi

if [[ ! "$1" ]]; then
echo "Usage: $0 [--binary | --uuencode] PAYLOAD_FILE"
exit 1
fi


if [[ $binary -ne 0 ]]; then
# Append binary data.
sed \
-e 's/uuencode=./uuencode=0/' \
-e 's/binary=./binary=1/' \
install.sh.in >install.sh
echo "PAYLOAD:" >> install.sh

cat $1 >>install.sh
fi
if [[ $uuencode -ne 0 ]]; then
# Append uuencoded data.
sed \
-e 's/uuencode=./uuencode=1/' \
-e 's/binary=./binary=0/' \
install.sh.in >install.sh
echo "PAYLOAD:" >> install.sh

cat $1 | uuencode - >>install.sh
fi

chmod 755 install.sh add_to_install.sh

2. Vytvoříte si instalační skript, který danou binární část zpracuje. Řekněme šablonu instalace (pro zjednodušení). Tu si můžeme nazvat např. "install.sh.in".

#!/bin/bash

uuencode=1
binary=0

function untar_payload()
{
match=$(grep --text --line-number '^PAYLOAD:$' $0 | cut -d ':' -f 1)
payload_start=$((match + 1))
if [[ $binary -ne 0 ]]; then
your_target=`cat cil.txt`
tail -n +$payload_start $0 | tar xvfz - --directory=$your_target
fi
if [[ $uuencode -ne 0 ]]; then
your_target=`cat cil.txt`
tail -n +$payload_start $0 | uudecode | tar xvfz - --directory=$your_target
fi
}


dialog --backtitle "INSTALACE ..." \
--title "" \
--yesno "Chcete pokračovat v instalaci?" 6 25
return_choice=$?
clear

if [ $return_choice == "0" ]
then
dialog --backtitle "INSTALACE ..." \
--title "" \
--msgbox "\nVítejte v instalaci ...\n" 7 35
clear
dialog --backtitle "INSTALACE ..." --title "Zadej cíl pro instalaci aplikace" --no-shadow --inputbox "Cíl:" 0 0 "" 2> cil.txt
clear
untar_payload
rm cil.txt
# Do remainder of install steps.
else
dialog --title "" \
--msgbox "\nAkce byla zrušena !" 7 35
clear
fi

exit 0

install.sh.in

3. Nyní si zabalíme svůj program do balíčku *.tar.gz, který chceme tímto způsobem distribuovat. Například "muj_program.tar.gz".
4. Spustíme v shellu tvorbu instalačního sh skriptu, a to následovně:

sh add_to_install.sh --uuencode muj_program.tar.gz

5. Takto nám vznikne soubor install.sh, který má v sobě zabudovaný náš .tar.gz balíček.

Jak tento výsledný instalační sh skript funguje? Skript install.sh obsahuje funkce pro instalaci tak, jak jsme si to připravili a na konci tohoto skriptu jsou připojeny binární data balíčku "muj_program.tar.gz". Pro tento způsob zpracování lze použít balíček  tar nebo gzip.

A jak vypadá výsledná instalace pomocí takovéhoto skriptu a za použití dialogů "dialog" v shell verzi?

dialog1.png

dialog2.png

dialog3.png

Pokud se na výsledný instalační skript podíváte nějakým textovým prohlížečem (např. v mc), uvidíte zhruba následující informace.

glasswork_install.png

Ukázka obsahu instalačního sh skriptu programu GlassWorks

Kdybych býval nepotřeboval nezávislý instalátor, asi by mne jen tak nenapadlo něco takového vymýšlet. Rád bych touto cestou poděkoval všem na ubuntu fóru, co mi pomohli, nebo se alespoň snažili pomoc.

Přeji mnoho úspěchů při používání této varianty instalace.

Nahoru

Odkazy

Odpovědět

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Top články z OpenOffice.cz

René Baran

René Baran

René Baran (*1972) vystudoval pedagogickou fakultu JCU v Českých Budějovicích obor "Výpočetní technika a informatika". Ve volném čase se věnuje sportu, četbě, hudbě, programování a fotografování.


  • Distribuce: Debian / Mint
  • Grafické prostředí: MATE

| proč linux | blog