Creare un pacchetto deb contenente script personali: differenze tra le versioni

m
nessun oggetto della modifica
mNessun oggetto della modifica
 
(32 versioni intermedie di un altro utente non mostrate)
Riga 1: Riga 1:
{{Versioni compatibili}}
{{Versioni compatibili|Squeeze|Wheezy|Jessie}}
== Introduzione ==
== Introduzione ==
Portare in giro i propri [[script]] per poterli avere a disposizione su diverse macchine è un'operazione facile; basta metterli su una pendrive e copiarli all'occorrenza sul computer su cui verranno eseguiti.<br/>
Portare in giro i propri [[script]] per poterli avere a disposizione su diverse macchine è un'operazione facile; basta metterli su una pendrive e copiarli all'occorrenza sul computer su cui verranno eseguiti.<br/>
Riga 6: Riga 6:
In questa guida verrà spiegato sommariamente, e senza la pretesa dell'esaustività vista l'enorme mole del gigante "Debian Packaging", come crearsi un pacchetto .deb che non fa nient'altro che contenere un certo numero di script. Questi script verranno installati nella directory <code>/usr/bin/</code> .<br/>
In questa guida verrà spiegato sommariamente, e senza la pretesa dell'esaustività vista l'enorme mole del gigante "Debian Packaging", come crearsi un pacchetto .deb che non fa nient'altro che contenere un certo numero di script. Questi script verranno installati nella directory <code>/usr/bin/</code> .<br/>
'''È caldamente consigliato''' scegliere accuratamente il nome del pacchetto e degli script contenuti al suo interno, questo perché il pacchetto non è presente nei [[repository ufficiali]] e, quindi, potrebbe interferire con i nomi scelti da altri pacchetti.
'''È caldamente consigliato''' scegliere accuratamente il nome del pacchetto e degli script contenuti al suo interno, questo perché il pacchetto non è presente nei [[repository ufficiali]] e, quindi, potrebbe interferire con i nomi scelti da altri pacchetti.
Se non si vuole utilizzare la directory "/usr/bin" per l'installazione dei propri script, e quindi evitando il problema dei nomi, leggere il paragrafo "Installazione in /usr/local/bin".<br/>
Il nome del pacchetto non è interessato da questo workaround, pertanto continua a dover essere scelto con estrema attenzione.


== Pacchetti da installare ==
== Pacchetti da installare ==
Per le operazioni che seguiranno sarà necessario installare alcuni pacchetti:
Per le operazioni che seguiranno sarà necessario installare alcuni pacchetti:
<pre>
<pre>
# apt-get install dh-make build-essential devscripts
# apt-get install dh-make build-essential devscripts fakeroot
</pre>
</pre>


Riga 21: Riga 24:
quindi spostiamoci nella directory appena creata:
quindi spostiamoci nella directory appena creata:
<pre>$ cd pacchetti</pre>
<pre>$ cd pacchetti</pre>
e creiamo un'ulteriore directory che conterrà tutti i file specifici per il nostro pacchetto. Questo è anche il momento di scegliere il nome del pacchetto; con uno sforzo di fantasia chiameremo il pacchetto "imieiscript" e la sua versione partirà dalla 1.0 . Creiamo la directory:
e creiamo un'ulteriore directory che conterrà tutti i file specifici per il nostro pacchetto. Questo è anche il momento di sceglierne il nome; con uno sforzo di fantasia lo chiameremo "imieiscript" e la sua versione partirà dalla 1.0 . Creiamo la directory:
<pre>$ mkdir imieiscript-1.0</pre>
<pre>$ mkdir imieiscript-1.0</pre>
e spostiamoci al suo interno:
e spostiamoci al suo interno:
Riga 56: Riga 59:
<pre>$ chmod 755 script1 script2 script3</pre>
<pre>$ chmod 755 script1 script2 script3</pre>
non preoccupatevi del proprietario (utente:gruppo) del file, questo sarà sempre cambiato in root:root .
non preoccupatevi del proprietario (utente:gruppo) del file, questo sarà sempre cambiato in root:root .
== Il file rules ==
La precedente operazione può essere automatizzata in modo da assegnare i corretti permessi agli script. Per ottenere questo risultato servirà modificare leggermente il file "rules".<br/>
Ad esempio, per assegnare i permessi "755" a tutti i propri script, si possono aggiungere in fondo al file le seguenti righe:
<pre>
override_dh_fixperms:
        dh_fixperms
        chmod 0755 debian/imieiscript/usr/bin/*
</pre>
L'aggiunta di una modifica simile può diventare molto conveniente nel caso in cui si debbano configurare permessi differenti per script differenti, impostare anche proprietario/gruppo per uno o più file oppure se ci si deve confrontare con la presenza di tanti script per i quali il settaggio dei permessi da linea di comando diventa decisamente gravoso e suscettibile di errori.<br/>
Attenzione agli spazi iniziali ad inizio riga. Questi devono essere ottenuti attraverso il tasto [TAB] e non con la barra spaziatrice.


== Il file changelog ==
== Il file changelog ==
Riga 91: Riga 106:
Description: Questo pacchetto contiene gli script di s3v
Description: Questo pacchetto contiene gli script di s3v
</pre>
</pre>
La sezione scelta è "misc" e l'architettura "all" (poiché il pacchetto contiene script che girano sotto Bash e non dipendono dall'architettura); inoltre è stata inserita una breve descrizione e tolte le [[dipendenze]].<br/>
La sezione scelta è "misc" e l'architettura "all" (poiché il pacchetto contiene script che non dipendono dall'[[architettura]]); inoltre è stata inserita una breve descrizione e tolte le [[dipendenze]].<br/>
La scelta di togliere le dipendenze comporta l'installazione dei pacchetti necessari al funzionamento degli script, installazione che non avviene automaticamente. Quindi vi sono due strade:
La scelta di togliere le dipendenze comporta l'installazione dei pacchetti necessari al funzionamento degli script, installazione che non avviene automaticamente. Quindi vi sono due strade:
# Non si inseriscono le dipendenze e si installano separatamente i pacchetti necessari. Ad esempio uno script potrebbe fare uso di ''wget'' contenuto nel pacchetto omonimo e che dovrà essere installato in un secondo momento.
# Non si inseriscono le dipendenze e si installano separatamente i pacchetti necessari. Ad esempio uno script potrebbe fare uso di ''wget'' contenuto nel pacchetto omonimo e che dovrà essere installato in un secondo momento.
# Si riempie il campo ''Depends'' con il nome del pacchetto da installare e ci si affida ad [[APT]] per la risoluzione delle dipendenze.
# Si riempie il campo ''Depends'' con il nome del pacchetto da installare e ci si affida ad [[APT]] o a [[gdebi]] per la risoluzione delle dipendenze.
 
Quindi, se il nostro .deb necessita della presenza del [[pacchetto]] "wget":
Source: imieiscript
Section: misc
Priority: optional
Maintainer: s3v <s3v@localhost>
Build-Depends: debhelper (>= 8.0.0)
Standards-Version: 3.9.4
Homepage:
Package: imieiscript
Architecture: all
Depends: '''wget'''
Description: Questo pacchetto contiene gli script di s3v


== Il file install ==
== Il file install ==
Riga 109: Riga 138:
</pre>
</pre>
Alla fine saranno creati nella directory "pacchetti" quattro file:
Alla fine saranno creati nella directory "pacchetti" quattro file:
;imieiscript_1.0.tar.gz:il file compresso che contiene tutti i file del pacchetto
;imieiscript_1.0.tar.gz:il file compresso che contiene tutti i file del pacchetto (sorgenti del pacchetto)
;imieiscript_1.0.dsc: contiene la firma del file .tar.gz e le informazioni del pacchetto
;imieiscript_1.0.dsc: contiene la firma del file .tar.gz e le informazioni del pacchetto
;imieiscript_1.0_i386.changes:il file che contiene i cambiamenti e l'hash per verificare l'autenticità dei file (i386 può cambiare, qui è dovuto al fatto che ho compilato su architettura i386)
;imieiscript_1.0_i386.changes:il file che contiene i cambiamenti e l'hash per verificare l'autenticità dei file (i386 può cambiare, qui è dovuto al fatto che ho compilato su architettura i386)
Riga 117: Riga 146:
<pre># dpkg -i imieiscript_1.0_all.deb</pre>
<pre># dpkg -i imieiscript_1.0_all.deb</pre>
tutto il resto non è più necessario e può essere tranquillamente cancellato.
tutto il resto non è più necessario e può essere tranquillamente cancellato.
Attenzione al fatto che [[dpkg]] non risolve eventuali dipendenze; per questo motivo, se il campo "Depends" non è vuoto, sarà necessaria una preventiva installazione manuale di tutti i pacchetti indicati come dipendenze oppure utilizzare "apt-get -f install":
<pre>
# dpkg -i imieiscript_1.0_all.deb
Selezionato il pacchetto imieiscript non precedentemente selezionato.
(Lettura del database... 127459 file e directory attualmente installati.)
Preparativi per estrarre imieiscript_1.0_all.deb...
Estrazione di imieiscript (1.0)...
dpkg: problemi con le dipendenze impediscono la configurazione di imieiscript:
imieiscript dipende da wget; comunque:
  Il pacchetto wget non è installato.
dpkg: errore nell'elaborare il pacchetto imieiscript (--install):
problemi con le dipendenze - lasciato non configurato
Si sono verificati degli errori nell'elaborazione:
imieiscript
# apt-get -f install
Lettura elenco dei pacchetti... Fatto
Generazione albero delle dipendenze     
Lettura informazioni sullo stato... Fatto
Correzione delle dipendenze... Fatto
I seguenti pacchetti saranno inoltre installati:
  wget
I seguenti pacchetti NUOVI saranno installati:
  wget
0 aggiornati, 1 installati, 0 da rimuovere e 0 non aggiornati.
...
</pre>
Altra alternativa a questa operazione è utilizzare [[gdebi]]:
<pre>
# gdebi imieiscript_1.0_all.deb
</pre>
che, a differenza di "dpkg", risolve automaticamente le dipendenze.


== Modifica del pacchetto ==
== Modifica del pacchetto ==
Riga 150: Riga 214:
Se ci si accorge che uno script non serve oppure che va rinominato, si può ricorrere alla potenza del sistema di pacchettizzazione senza dover effettuare tutto manualmente. Per questo scopo ci servirà un ulteriore file chiamato "preinst" all'interno della directory ''debian'' che conterrà ad esempio:
Se ci si accorge che uno script non serve oppure che va rinominato, si può ricorrere alla potenza del sistema di pacchettizzazione senza dover effettuare tutto manualmente. Per questo scopo ci servirà un ulteriore file chiamato "preinst" all'interno della directory ''debian'' che conterrà ad esempio:
<pre>
<pre>
[ -x /usr/bin/script1 ] && rm /usr/bin/script1
if [ -f /usr/bin/script1 ]; then
rm /usr/bin/script1
fi
</pre>
</pre>
questo rimuoverà il file <code>/usr/bin/script1</code> dalla directory <code>/usr/bin/</code> al momento dell'installazione del pacchetto.<br/>
questo rimuoverà il file <code>/usr/bin/script1</code> dalla directory <code>/usr/bin/</code> al momento dell'installazione del pacchetto.<br/>
Riga 158: Riga 224:
       └-- imieiscript-1.1/
       └-- imieiscript-1.1/
                       ├-- debian/
                       ├-- debian/
                       |     ├-- changelog
                       |     ├-- changelog
                       |     ├-- copyright
                       |     ├-- copyright
                       |     ├-- compat
                       |     ├-- compat
                       |     ├-- control
                       |     ├-- control
                       |     ├-- install
                       |     ├-- install
                       |     ├-- rules
                       |     ├-- rules
                       |     └-- preinst
                       |     └-- preinst
                       |
                       |
                       └-- script/
                       └-- script/
                            ├-- script2
                              ├-- script2
                            └-- script3
                              └-- script3
</pre>
</pre>
da cui si vede che è stato tolto dal pacchetto il file <code>script1</code> e aggiunto il file <code>preinst</code>.<br/>
da cui si vede che è stato tolto dal pacchetto il file <code>script1</code> e aggiunto il file <code>preinst</code>.<br/>
Riga 215: Riga 281:
W: imieiscript: binary-without-manpage usr/bin/script3
W: imieiscript: binary-without-manpage usr/bin/script3
</pre>
</pre>
Questo output ci informerà che l'indirizzo e-mail non è corretto, il file "copyright" va modificato, gli script andrebbero accompagnati da una [[manpage]] (come impone la policy Debian) e nel file "control" manca una descrizione completa del pacchetto.<br/>
Questo output ci informerà che l'indirizzo e-mail non è corretto, il file "copyright" va modificato, gli script andrebbero accompagnati da una [[manpage]] (come impone la [[policy]] Debian) e nel file "control" manca una descrizione completa del pacchetto.<br/>
Se si vogliono informazioni più dettagliate sui cambiamenti da effettuare:
Se si vogliono informazioni più dettagliate sui cambiamenti da effettuare:
<pre>$ lintian -i imieiscript_1.1_all.deb</pre>
<pre>$ lintian -i imieiscript_1.1_all.deb</pre>
== Installazione in /usr/local/bin/ ==
L'installazione in "/usr/bin/" è una pratica permessa ma altamente rischiosa in quanto il nome dei propri script potrebbe essere già "occupato" da altri eseguibili installati (o che verranno installati) nella stessa directory. Il pericolo è quello di andare a cancellare file con lo stesso nome oppure che installazioni di altri pacchetti vadano a cancellare gli script.
Per dormire sogni tranquilli è necessario spostare la directory di installazione da "/usr/bin" a "/usr/local/bin": quest'ultima directory, infatti, non conterrà mai alcun eseguibile proveniente da pacchetti ufficiali Debian.<br/>
Purtroppo, essendo una directory non molto ben vista dal sistema di gestione dei pacchetti che la considera come "non privilegiata", verrà cancellata (se vuota) al momento della disinstallazione del pacchetto. La costruzione di un rimedio a questo comportamento necessiterà di qualche altra modifica.
In questo caso si è scelto di utilizzare la sotto-directory <code>/usr/local/bin/imieiscript/</code> sia per una mera questione di "pulizia" sia per evitare che vengano cancellati, durante l'installazione del pacchetto, eventuali file con lo stesso nome all'interno della directory <code>/usr/local/bin</code>.<br/>
Se <code>/usr/local/bin</code> non contiene script con lo stesso nome di quelli installati dal pacchetto, si può sceglierla tranquillamente come directory di destinazione.
La procedura è uguale a quella descritta precedentemente, tranne che per i seguenti cambiamenti.
=== Il file install ===
Va cambiata la directory di installazione dei nostri script:
<pre>
script/* usr/local/bin/imieiscript/
</pre>
Oppure:
<pre>
script/* usr/local/bin/
</pre>
se si vuole utilizzare la directory <code>/usr/local/bin/</code> .
=== Il file rules ===
Aggiungere in fondo al file la seguente riga:
<pre>
override_dh_usrlocal:
</pre>
Nel caso si voglia anche impostare automaticamente i permessi degli script, aggiungere:
<pre>
override_dh_usrlocal:
override_dh_fixperms:
        dh_fixperms
        chmod 0755 debian/imieiscript/usr/local/bin/imieiscript/*
</pre>
oppure, se si è scelto di installare gli script nella directory "/usr/local/bin":
<pre>
override_dh_usrlocal:
override_dh_fixperms:
        dh_fixperms
        chmod 0755 debian/imieiscript/usr/local/bin/*
</pre>
=== Il file preinst ===
Poiché abbiamo deciso di installare i nostri script nella directory <code>/usr/local/bin/imieiscript/</code>, questo file è necessario per crearla:
<pre>
if [ ! -d /usr/local/bin/imieiscript/ ]; then
  mkdir -p /usr/local/bin/imieiscript
fi
</pre>
Il file non va creato se si è scelta <code>/usr/local/bin/</code> come directory di installazione.
=== Il file postrm ===
Questo è il cambiamento più importante in quanto permetterà di ricreare la directory "/usr/local/bin" nel caso in cui venisse rimossa (se vuota) dopo la disinstallazione del pacchetto "imieiscript".<br/>
Bisogna prestare la massima attenzione a ricreare la directory con gli stessi permessi che aveva in precedenza, per cui è altamente consigliato eseguire un:
<pre>
$ ls -l /usr/local
...
drwxrwsr-x 2 root staff 4096 ott 15 11:39 bin
...
</pre>
prima della disinstallazione e controllare i permessi per l'utente/gruppo in modo da poterli ricreare in caso di rimozione.<br/>
In questo caso una creazione da parte di [[root]] della directory porterà a:
<pre>
...
drwxr-sr-x 2 root staff 4096 ott 15 12:05 bin
...
</pre>
come si vede, manca qualcosa: il permesso di scrittura per il gruppo "staff".
Creare quindi il file "postrm" con questo contenuto:
<pre>
if [ ! -d /usr/local/bin ]; then
  mkdir -p /usr/local/bin
  chmod g+w /usr/local/bin
fi
</pre>
Se la directory "/usr/local/bin" non esiste, verrà ricreata e le verrà assegnato il permesso di scrittura per il gruppo "staff".
{{Warningbox|Il contenuto del file "postrm" va adattato alla propria situazione. Quello appena descritto potrebbe essere solo un caso specifico e/o un caso generale ma suscettibile di variazioni future se dovessero cambiare le scelte degli sviluppatori.<br/>Lo scopo di questo file deve essere sempre quello di ricreare la directory con gli stessi permessi che aveva originariamente.}}
=== Conclusioni ===
L'albero file/directory sarà simile a:
<pre>
pacchetti/
      └-- imieiscript-1.0/
                      ├-- debian/
                      |      ├-- changelog
                      |      ├-- copyright
                      |      ├-- compat
                      |      ├-- control
                      |      ├-- install
                      |      ├-- rules
                      |      ├-- preinst
                      |      └-- postrm
                      |
                      └-- script/
                              ├-- script1
                              ├-- script2
                              └-- script3
</pre>
Si noti che, durante la rimozione del pacchetto, potrebbe venir mostrato il seguente messaggio:
<pre>
dpkg: attenzione: nel rimuovere imieiscript, la directory "/usr/local" è risultata non vuota e non viene rimossa
</pre>
Con cui "apt" ci avverte che è stata rimossa la directory "/usr/local/bin".<br/>
Niente paura: questa viene ricreata da "postrm" con i permessi originari:
<pre>
$ ls -l /usr/local
...
drwxrwsr-x 2 root staff 4096 ott 15 12:11 bin
...
</pre>
=== Workaround ===
Il precedente metodo può essere efficace per installazioni su una singola macchina e, in ogni caso, i permessi andrebbero periodicamente controllati per adattare il file "postrm". Su molte macchine questo è assolutamente impraticabile.
Un possibile workaround consiste nel creare un file all'interno della directory "/usr/local/bin" in modo tale da impedirne la cancellazione (se vuota). Questo file (il cui nome dovrebbe essere significativo, ad esempio "imieiscript.readme") va creato utilizzando il file "preinst" (o "postinst"). La sua rimozione, sfortunatamente, non può essere effettuata automaticamente ma solo manualmente <u> e solo nel caso in cui il pacchetto sia stato già disinstallato</u>.<br/>
Questo potrebbe essere il contenuto del file "postinst":
<pre>
echo "-- ATTENZIONE --
Questo file viene creato dal pacchetto imieiscript
per evitare la cancellazione della directory
/usr/local/bin (se vuota) durante la sua disinstallazione.
Rimuoverlo manualmente solo se il pacchetto imieiscript è
stato disinstallato!" > /usr/local/bin/imieiscript.readme
</pre>
La situazione di file e directory dovrebbe essere simile a:
<pre>
pacchetti/
      └-- imieiscript-1.0/
                      ├-- debian/
                      |      ├-- changelog
                      |      ├-- copyright
                      |      ├-- compat
                      |      ├-- control
                      |      ├-- install
                      |      ├-- rules
                      |      ├-- preinst
                      |      └-- postinst
                      |
                      └-- script/
                              ├-- script1
                              ├-- script2
                              └-- script3
</pre>
In caso di rimozione del pacchetto "imieiscript" verrà visualizzata la seguente riga:
<pre>
...
dpkg: attenzione: nel rimuovere imieiscript, la directory "/usr/local/bin" è risultata non vuota e non viene rimossa
...
</pre>
Per cui la directory "/usr/local/bin" non verrà rimossa in quanto esiste ''almeno'' il file "imieiscript.readme".
== Il path degli script ==
Una volta installato correttamente il [[pacchetto]], è venuto il momento di provare qualcuno dei propri script. L'esecuzione è possibile indicando il percorso assoluto oppure, più comodamente, il solo nome dello script da eseguire. Ad esempio:
<pre>
$ script1
</pre>
Questo dipende dalla directory in cui sono stati installati gli script e dal contenuto della variabile d'ambiente [[Esecuzione di programmi: la variabile PATH | PATH]].<br/>
Tipicamente, in un sistema Debian, questa variabile contiene:
<pre>
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
</pre>
Per cui si possono avere tre casi diversi in base alla directory di installazione scelta.
; /usr/bin/
:directory già inclusa nel path. Non servono modifiche.
; /usr/local/bin/
:directory già inclusa nel path. Non servono modifiche.
; /usr/local/bin/imieiscript/
:è necessario fare in modo che questa directory sia inclusa nel proprio path aggiungendo al file "~/.bashrc" la riga:<pre>export PATH=$PATH:/usr/local/bin/imieiscript</pre> e impartire un:<pre>$ source ~/.bashrc</pre> per rendere effettive le modifiche.
== Manpage del pacchetto ==
L'esistenza di una [[manpage]] per il pacchetto non è fondamentale ma potrebbe rivelarsi utile per almeno tre buoni motivi:
* Gli script potrebbero essere eseguiti anche da altre persone che vorrebbero, giustamente, capire cosa sono e come utilizzarli.
* Conoscere rapidamente la versione del pacchetto.
* Conoscere rapidamente quanti e quali script sono disponibili.
=== Pacchetti necessari ===
Installeremo il comodo "txt2man" che permette la conversione di un normale file di testo in un secondo file con formato proprio di una manpage (troff).
<pre>
# apt-get install txt2man
</pre>
=== Creazione della manpage ===
Creare nella directory "debian" un file di testo "imieiscript.manpage.txt" e inserirvi:
<pre>
NAME
imieiscript - i miei script personali
DESCRIZIONE
Questo pacchetto contiene i miei script personali installati nella directory /usr/local/bin/imieiscript
LISTA DEGLI SCRIPT
script1  script che mostra a video "Hello world!"
script2  script che cancella il file /tmp/pippo
script3  script che crea il file /home/pippo/myfile
Leggere il contenuto iniziale degli script o eseguirli con l'opzione --help per ottenere maggiori informazioni sul loro utilizzo.
</pre>
Successivamente bisogna convertire questo file:
<pre>
$ txt2man -v "versione 1.0" -s 1 -t IMIEISCRIPT imieiscript.manpage.txt > imiescript.manpage
</pre>
per ottenere il file <code>imieiscript.manpage</code> in formato troff.<br/>
Notare l'opzione '-v "versione 1.0"' che può essere omessa oppure modificata in base alla versione del pacchetto che si sta costruendo.<br/>
Si rimanda alla manpage di "txt2man" per maggiori informazioni sulla sintassi e i parametri utilizzati.
Prima di proseguire con la costruzione del pacchetto, è opportuno eseguire il comando:
<pre>
$ man -l imieiscript.manpage
</pre>
per visualizzare la manpage generata.
Il passo finale consiste nella creazione, all'interno della directory "debian", del file "manpages" contenente:
<pre>
debian/imieiscript.manpage
</pre>
Dopo la costruzione e installazione del pacchetto sarà possibile visualizzare la manpage nel consueto modo:
<pre>
$ man imieiscript
</pre>
{{Box|Nota|Benché sia possibile cancellare il file di testo "imieiscript.manpage.txt", è consigliabile mantenerlo al suo posto in caso di future modifiche della manpage.}}


{{Autori
{{Autori
3 581

contributi