Creazione di un pacchetto debian .deb

From RVM Wiki
Jump to navigation Jump to search
Attenzione questo articolo è ancora incompleto.
Sentiti libero di contribuire cliccando sul tasto edit.

CERCA/SOSTITUISCI export PKGHOME="~/debian-packages" => export PKGHOME=~/debian-packages

Installazione pacchetti sviluppatore

apt-get install dpkg-dev file gcc g++ libc6-dev make patch perl dh-make fakeroot devscripts lintian linda

Metodo veloce per script o dati

Questo metodo crea un pacchetto rozzissimo.

  • creare la directory che conterrà i files da installare:
cd ~
mkdir mypackage
  • Copiarci i files nelle posizioni dove dovranno essere messi, ad esempio
mypackage
        +etc
        |  +-mypackage
        |            +mypackage.conf
        |
        +-usr/bin/myscript
  • Creare al cartella
mypackage/DEBIAN
  • Crearci il file control
vi  mypackage/DEBIAN/control
Package: squidguard-blacklist
Version: 1.0.0-2011111801
Section: net
Priority: optional
Architecture: all
Depends: squidguard (>=1.4)
Maintainer: Gabriele Vivinetto <gabriele.mailing@rvmgroup.it>
Description: Blacklist for squidguard
 This is the blacklist from http://squidguard.mesd.k12.or.us/blacklists.tgz
  • Creare l'eventuale elenco dei files di configurazione (che così non verranno sovrascritti in caso di upgrade):
vi  mypackage/DEBIAN/conffiles
/etc/mypackage/mypackage.conf

  • Creare l'eventuale script da eseguire al termine:
vi  mypackage/DEBIAN/postinst
#!/bin/bash
/usr/bin/squidGuard -C all
/bin/chown -R proxy:proxy /var/lib/squidguard/db
chmod +x  mypackage/DEBIAN/postinst
  • Creare il pacchetto:
cd ~
fakeroot dpkg-deb --build squidguard-blacklist/ .
  • Se si vuole firmarlo:
sudo apt-get install dpkg-sig
dpkg-sig --sign builder squidguard-blacklist_1.0.0-2011111801_any.deb

Riferimenti

Creazione di un pacchetto per uno script

Si supponga di voler installare:

  • uno script
  • un file di configurazione
  • un file di cron

Supponiamo che lo script si chiami backup-remoto legga la sua configurazione da backup-remoto.conf e sia eseguito tutte le notti alle 20:00

Preparazione delle directory

export PKGHOME=~/debian-packages
export PKGNAME="backup-remoto"
export PKGVER="1.0.0"
mkdir -p ${PKGHOME}/${PKGNAME}/${PKGNAME}-${PKGVER}
cd ${PKGHOME}/${PKGNAME}/${PKGNAME}-${PKGVER}

Copiare in questa directory lo script ed il file di configurazione.

Preparazione del Makefile

Occorre creare un Makefile funzionante per l'installazione, in quanto viene usate da dpkg per installare il pacchetto.

Un esempio è:

export PKGHOME="~/debian-packages"
export PKGNAME=backup-remoto
cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0
cat | unexpand --first-only > Makefile <<'EOFile'
SBIN    = $(DESTDIR)/usr/sbin
ETC     = $(DESTDIR)/etc
DOC     = $(DESTDIR)/usr/share/doc
PKG     = backup-remoto

.PHONY: all install clean
all:    ;
clean:  ;
install:
        install -d $(SBIN)
        install -m 755 ./$(PKG) $(SBIN)/$(PKG)
        # installa l'eseguibile
        install -d $(DOC)/$(PKG)
        #install -m 644 ./README $(DOC)/$(PKG)/README
        # installa la documentazione
        install -d $(ETC)/$(PKG)
        install -m 644 ./$(PKG).conf $(ETC)/$(PKG)/$(PKG).conf
        #installa il file di configurazione
        install -d $(ETC)/cron.d
        install -m 644 ./$(PKG).cron $(ETC)/cron.d/$(PKG)
        #installa il file di cron
EOFile

Preparazione del file cron

Questo è un file di esempio:

export PKGHOME="~/debian-packages"
export PKGNAME="backup-remoto"
cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0
cat > $PKGNAME.cron <<EOFile
#m      h       dom     mon     dow     user    command
0      20       *       *       *       root    /usr/sbin/$PKGNAME > /dev/null
EOFile


Creazione della tarball

export PKGHOME="$HOME/debian-packages"
export PKGNAME="backup-remoto"
cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0
cd ..
tar cvzf $PKGNAME-1.0.0.tar.gz $PKGNAME-1.0.0

Debianizzazione

export PKGHOME="~/debian-packages"
export PKGNAME="backup-remoto"
cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0
export DEBFULLNAME="Gabriele Vivinetto"
export DEBEMAIL=gabriele.mailing@rvmgroup.it
dh_make -e gabriele.mailing@rvmgroup.it -f ../$PKGNAME-1.0.0.tar.gz

Ora la situazione dovrebbe essere:

export PKGHOME="~/debian-packages"
export PKGNAME="backup-remoto"
cd $PKGHOME/$PKGNAME
ls
total 28
drwxr-xr-x  3 mnt.vvngrl mnt.vvngrl 4096 2006-03-16 19:58 .
drwxr-xr-x  3 mnt.vvngrl mnt.vvngrl 4096 2006-03-16 19:58 ..
-rwxr-xr-x  1 mnt.vvngrl mnt.vvngrl 2023 2006-03-16 19:43 backup-remoto
-rw-r--r--  1 mnt.vvngrl mnt.vvngrl 1158 2006-03-16 19:46 backup-remoto.conf
-rw-r--r--  1 mnt.vvngrl mnt.vvngrl  140 2006-03-16 19:47 backup-remoto.cron
drwxr-xr-x  2 mnt.vvngrl mnt.vvngrl 4096 2006-03-16 19:58 debian
-rw-r--r--  1 mnt.vvngrl mnt.vvngrl  452 2006-03-16 19:09 Makefile


Customizazione del file control

Il file control contiene i parametri essenziali per la descrizione del pacchetto, il suo tagging e soprattutto le dipendenze.

Analizare lo script, e per ogni binario richiamato, trovare il pacchetto corrispondente e la versione.

Ad esempio, nello script si usa ilcomando "ssh", quindi, utiliando i comandi di seguito, si ottengono le stringe da inserire come dipendenze, seprate da ", ":

export BIN_NAME="ssh"
export COLUMNS=132
DEBPKG_NAME=$(dpkg -S $(which $BIN_NAME) | cut -f 1 --delim=":")
DEBPKG_VERSION=$(dpkg -l $(dpkg -S $(which $BIN_NAME) | cut -f 1 --delim=":") | grep $(dpkg -S $(which $BIN_NAME) | cut -f 1 --delim=":") | tr -s " "  | cut -f 3 --delim=" ")
echo "$DEBPKG_NAME (>= $DEBPKG_VERSION)"

Inserire le dipendenze nella riga

Depends:
export PKGHOME="~/debian-packages"
export PKGNAME="backup-remoto"
cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0/debian
vi control

Inserire *una* breve Descrizione nella riga

Description:

Inserire di seguito, indentando di una colonna una descrizione al massimo di 60 caratteri.

Attenzione: andare a capo manualmente, scrivere ogni riga terminata da <invio>

Questo file di solito è sufficente

export PKGHOME="~/debian-packages"
export PKGNAME="backup-remoto"
cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0/debian
cat > copyright <<EOFile
This package was debianized by Gabriele Vivinetto <gabriele.mailing@rvmgroup.it> on
$(date -R)

It was downloaded from http://people.rvmgroup.it/gabriele.vivinetto

Copyright Holder: Gabriele Vivinetto <gabriele.mailing@rvmgroup.it>

License: GNU GPL
EOFile

Modifica del file README.Debian

Inserire in questo files le note relative al pacchetto.

Altre personalizzazioni

Se si vuole è possibile modifcare anche il file changelog

Pulizia della deirectory debian/

Eliminare i files di esempio:

rm -f *.ex;  rm -f *.EX

Creazione del pacchetto

Creare il pacchetto:

export PKGHOME=~/debian-packages
export PKGNAME="backup-remoto"
cd $PKGHOME/$PKGNAME/$PKGNAME-1.0.0
dpkg-buildpackage -rfakeroot -kF6D289F6

Se tutto procede bene, le ultime righe saranno:

...
dpkg-deb: building package `backup-remoto' in `../backup-remoto_1.0.0-1_i386.deb'.
dpkg-genchanges
dpkg-genchanges: including full source code in upload
dpkg-buildpackage: full upload (original source is included)

Debianizzazione di un pacchetto binario esistente

Preparazione Directory e Archivio Esistente

Preparare le directory:

export PKGHOME="~/debian-packages"
export PKGNAME="mcafee-virusscan"
mkdir -p $PKGHOME/$PKGNAME
cd $PKGHOME/$PKGNAME

Prendere la tarball esistente e rinominarla secondo lo schema packagename-x.y.z.tar.{gz|Z}

Estrazione dei files

Estrarre i files in una directory con nome packagename-x.y.z

ATTENZIONE, conservare l'archivio originale al di fuori della cartella, in quanto serve alla compilazione del pacchetto E per gli upgrade.


Debianizzazione

export PKGHOME="~/debian-packages"
export PKGNAME="mcafee-virusscan"
export PKGVER="4.4.0"
cd $PKGHOME/$PKGNAME/$PKGNAME-$PKGVER
export DEBFULLNAME="Gabriele Vivinetto"
export DEBEMAIL=gabriele.mailing@rvmgroup.it
dh_make -e gabriele.mailing@rvmgroup.it -f ../$PKGNAME-$PKGVER.tar.*

Preparazione / Personalizzazione del Makefile

cat > Makefile <<'EOFile'
SBIN    = $DESTDIR/usr/sbin
ETC     = $DESTDIR/etc
DOC     = $DESTDIR/usr/share/doc

install:  odmrd-target
                install -d $(SBIN)
                install -m755 ./odmrd09rc9.pl $(SBIN)/odmrd
                install -m755 ./odmrspool $(SBIN)/odmrspool
                install -d ./odmrd.conf $(ETC)/odmrd/odmrd.conf
                install -d $(DESTDIR)/usr/share/doc/odmrd
                cp -a readme.html $(DESTDIR)/usr/share/doc/odmrd
                adduser --system odmr
                addgroup --system odmr
EOFile

Se nel makefile ci sono dei link, occorre toglierli e metterli in un file debian/package.links indicando

path/sorgente path/destinazione

Vedi

man dh_links

Preparazione del pacchetto in formato tar.gz

lynx plonk.de
mkdir odmrd09rc9
cd odmrd09rc9
tar xvzf ../odmrd09rc9.tar.gz
cd ..
mv odmrd09rc9 odmrd-0.9.0rc9
cd odmrd-0.9.0rc9
wget http://plonk.de/sw/odmr/odmrspool.pl

Creazione del control file

cd debian 
cat > control <<'EOFile'
Source: odmrd
Section: mail
Priority: extra
Maintainer: Gabriele Vivinetto <gabriele.mailing@rvmgroup.it-f>
Build-Depends: debhelper (>= 4.0.0)
Standards-Version: 3.6.1

Package: odmrd
Architecture: all
Depends: postfix (>= 2.1.5-9), libmime-perl (>= 5.417-1), libdbd-mysql-perl (>= 2.9006-1) ${shlibs:Depends}, ${misc:Depends}
Description: An On Demad Mail Relay Daemon that uses ATRN to deliver Mail
 ODMR is "SMTP with Dynamic IP Addresses". It uses an "Authenticated TURN"
 (ATRN) to deliver queued mail to a mailserver with a dynamic IP address.
 It works with Postfix (and Exim too).
EOFile

Preparazione degli altri file

cat >copyright <<'EOFile'
This package was debianized by Gabriele Vivinetto <gabriele.mailing@rvmgroup.it-f> on
Fri, 17 Jun 2005 17:12:48 +0200.

It was downloaded from http://plonk.de/sw/odmr/

Copyright Holder: Jakob Hirsch <odmrd@plonk.de>

License: GNU GPL
EOFile

Creazione del pacchetto

Firma del pacchetto

Nel caso si voglia firmare il pacchetto, procedere come segue, altrimenti saltare la sezione.

  • Creare una chiave GPG apposita
  • Creare il file
vi ~/.devscripts
...
DEBEMAIL="gabriele.mailing@rvmgroup.it"
DEBFULLNAME="Gabriele Vivinetto"
DEBSIGN_KEYID="XXXXXXXX"
..

Purtroppo sembra non funzionare.

Esportare le prime due variabili da

vi ~/.bashrc

...
export DEBEMAIL="gabriele.mailing@rvmgroup.it"
export DEBFULLNAME="Gabriele Vivinetto"
...

Costruire il pacchetto

Con il comando seguente viene scritto il pacchetto.

Se non dovesse chiedere la password per firmarlo, specificare la chiave GPG da usare con -k:

cd ..
dpkg-buildpackage -rfakeroot -kXXXXXXXX

Aggiornamento del pacchetto

Aggiornamento in caso di correzione BUG

Modificare il Changelog:

export DEBFULLNAME="Gabriele Vivinetto"
export DEBEMAIL=gabriele.mailing@rvmgroup.it
dch -i


Applicare le correzioni necessarie ai sorgenti.

Riscostruire il pacchetto:

dpkg-buildpackage -rfakeroot -kF6D289F6 -tc

Ora si può caricare nel repository il pacchetto costruito, che avrà versione x.y.z-+1

Aggiornamento con Nuova Versione

  • Scaricare la nuova versione
export PKGHOME="~/debian-packages"
export PKGNAME="backup-remoto"
export LASTVER="1.38"
export NEWVER="1.52"
wget http://www.example.com/$PKGNAME-$NEWVER.tar.gz
  • Creare il sorgente della vecchia versione se none esistente
export PKGHOME="~/debian-packages"
export PKGNAME="backup-remoto"
export LASTVER="1.38"
export NEWVER="1.52"
cd $PKGHOME
dpkg-source -b $PKGNAME-$LASTVER
  • Si avranno così i files .dsc .tar.gz e .orig.tar.bz2
  • Lanciare l'upgrade
export PKGHOME="~/debian-packages"
export PKGNAME="backup-remoto"
export LASTVER="1.38"
cd $PKGHOME/$PKGNAME/$PKGNAME-$LASTVER
uupdate -u ../$PKGNAME-$NEWVER.tar.gz

Così si creerà la nuova directory di versione, e sarà possibile costruire il nuovo pacchetto con:

export PKGHOME="~/debian-packages"
export PKGNAME="backup-remoto"
export NEWVER="1.52"
cd $PKGHOME/$PKGNAME/$PKGNAME-$NEWVER
dpkg-buildpackage -rfakeroot -kF6D289F6
  • Se dalla directory della nuova versione si vogliono produrr ei pacchetti source (dsc tar.gz e .orig.tar.bz2), usare
dpkg-source -b $PKGNAME-$NEWVER

Script di upload dei pacchetti

ATTENZIONE: QUESTO SCRIPT NON È PIÙ VALIDO, PERCHÈ SI USA UN REPOSITORY FIRMATO.

Questo script è utile per caricare via scp i pacchetti creati sul proprio repository.

#!/bin/bash
test $1 || {
        echo "Usage: upload-debrvm package.deb"
        exit 1
}
SHORTNAME=$(echo $1 | cut -f 1 --delim="_")
echo "* Uploading $SHORTNAME"
scp -pq $1 support.rvmgroup.it:/var/www/rvmgroup.it/support/html/debian/binary
echo "* Cleaning up and updating repository"
#scp -pq /home/mnt.vvngrl/bin/update_repository support.rvmgroup.it:/var/www/rvmgroup.it/support/html/debian/
cat | ssh support.rvmgroup.it "
        cat > /var/www/rvmgroup.it/support/html/debian/update_repository;
        cd /var/www/rvmgroup.it/support/html/debian;
        chmod +x ./update_repository;
        ./update_repository $SHORTNAME;
        rm -f ./update_repository;
        dpkg-scanpackages binary/ /dev/null | gzip -9c > binary/Packages.gz" <<'EOFile'
#!/bin/bash
cd /var/www/rvmgroup.it/support/html/debian
SHORTNAME=$1
RIGHE=$(/bin/ls -1 binary/$SHORTNAME* | sort -n | wc -l)
RIGHE_DA_CANC=$(($RIGHE - 1))
if (( $RIGHE > 0 ))
        then
                for DATA in $( find . -name  $SHORTNAME\* | sort -n | head -n $RIGHE_DA_CANC)
                do
                        echo "* Deleting $DATA"
                        rm -f $DATA
                done
fi
EOFile