Creare un pacchetto deb contenente script personali: differenze tra le versioni
S3v (discussione | contributi) m (uff) |
S3v (discussione | contributi) (→Rimuovere o rinominare uno script: (corretto grave errore)) |
||
Riga 212: | Riga 212: | ||
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> | ||
[ - | 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/> |
Versione delle 19:25, 22 nov 2014
Versioni Compatibili Tutte le versioni supportate di Debian |
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.
Il problema sorge quando gli script diventano tanti, le macchine tante e la memoria poca, per cui capire se uno script è aggiornato su un PC (o se è installato) diventa improbo.
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 /usr/bin/
.
È 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".
Il nome del pacchetto non è interessato da questo workaround, pertanto continua a dover essere scelto con estrema attenzione.
Pacchetti da installare
Per le operazioni che seguiranno sarà necessario installare alcuni pacchetti:
# apt-get install dh-make build-essential devscripts fakeroot
Operazioni preliminari
Innanzitutto creiamo una directory di lavoro nella nostra home. In questo caso la chiameremo "pacchetti":
$ cd ~ $ mkdir pacchetti
quindi spostiamoci nella directory appena creata:
$ cd pacchetti
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:
$ mkdir imieiscript-1.0
e spostiamoci al suo interno:
$ cd imieiscript-1.0
È giunto il momento di occuparci del pacchetto, creiamone lo "scheletro" con debhelper
:
$ dh_make -n
e rispondiamo "s" alla prima domanda (stiamo creando un pacchetto singolo) e premiamo "invio" alla seconda domanda per accettare i suggerimenti su e-mail, nome del maintainer, licenza etc.
A questo punto si può notare che è stata creata una directory "debian" che ha al suo interno diversi file e template di file.
A noi non interessano tutti ma solo i file: changelog
, compat
, control
, copyright
e rules
, per cui tutti gli altri possono essere tranquillamente eliminati.
Ci sarà bisogno anche di un file install
inizialmente vuoto. Dovremo crearlo in quanto ci servirà dopo.
Ora serve una directory che conterrà gli script che vogliamo installare per cui, accanto alla directory "debian", creiamo un'altra directory che possiamo chiamare, ad esempio, "script" e in cui verranno inseriti tutti gli script che vogliamo.
La situazione alla fine dovrebbe essere la seguente:
pacchetti/ └-- imieiscript-1.0/ ├-- debian/ | ├-- changelog | ├-- copyright | ├-- compat | ├-- control | ├-- install | └-- rules | └-- script/ ├-- script1 ├-- script2 └-- script3
Gli script
Nell'esempio precedente si è scelto come nome per gli script "script1", "script2" e "script3" ma, ovviamente, bisognerebbe scegliere un nome più significativo. La cosa importante è che il nome degli script sia assolutamente diverso da tutto ciò che si trova (o potrebbe trovarsi) in /usr/bin/
e che essi abbiamo i corretti permessi di esecuzione.
Ad esempio potrebbe essere conveniente dare i permessi di esecuzione a tutti ma di scrittura solo a root:
$ chmod 755 script1 script2 script3
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".
Ad esempio, per assegnare i permessi "755" a tutti i propri script, si possono aggiungere in fondo al file le seguenti righe:
override_dh_fixperms: dh_fixperms chmod 0755 debian/imieiscript/usr/bin/*
Attenzione agli spazi iniziali ad inizio riga. Questi devono essere ottenuti attraverso il tasto [TAB] e non con la barra spaziatrice.
Il file changelog
Questo è il file che tiene traccia dei cambiamenti nel pacchetto per ciascuna versione, all'inizio si presenta così:
imieiscript (1.0) unstable; urgency=low * Initial Release. -- s3v <s3v@localhost> Fri, 28 Jun 2013 21:46:24 +0200
e può essere lasciato inalterato. Se si vuole si può cambiarlo, ad esempio, così:
imieiscript (1.0) unstable; urgency=low * Versione iniziale del pacchetto che contiene i miei script personali. -- s3v <s3v@localhost> Fri, 28 Jun 2013 21:46:24 +0200
Il file control
Questo è il file più importante e contiene le informazioni sul pacchetto e le sue dipendenze. Questi sono i cambiamenti apportati:
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: Description: Questo pacchetto contiene gli script di s3v
La sezione scelta è "misc" e l'architettura "all" (poiché il pacchetto contiene script che e non dipendono dall'architettura); inoltre è stata inserita una breve descrizione e tolte le dipendenze.
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.
- 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
Inseriamo questo:
script/* usr/bin/
in questo modo tutti gli script contenuti nella directory "script" che abbiamo creato saranno copiati in /usr/bin/
.
Creazione e installazione del pacchetto
Ora è tutto pronto per creare il pacchetto. Spostarsi nella directory "imieiscript-1.0" ed eseguire:
$ dpkg-buildpackage -us -uc
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.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_all.deb
- il file .deb vero e proprio
È importante sottolineare che gli unici file essenziali per ricreare o modificare il pacchetto sono solo i primi due della lista. Il quarto file (il pacchetto .deb) può invece essere installato sulle macchine che si desidera con un:
# dpkg -i imieiscript_1.0_all.deb
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":
# 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. ...
Altra alternativa a questa operazione è utilizzare gdebi:
# gdebi imieiscript_1.0_all.deb
che, a differenza di "dpkg", risolve automaticamente le dipendenze.
Modifica del pacchetto
Supponiamo di dover modificare uno script e di voler creare la versione 1.1 del pacchetto. L'operazione a questo punto è banalissima. Se si hanno i due file di prima (.tar.gz
e .dsc
), basta un:
$ dpkg-source -x imieiscript_1.0.dsc
per ricreare la directory "imieiscript-1.0" e lavorare nuovamente sui file e gli script. Quando gli script sono stati modificati, cambiare il changelog così:
imieiscript (1.1) unstable; urgency=low * Tolta la funzione miafunzione() dallo script script1 -- s3v <s3v@localhost> Fri, 28 Jun 2013 22:19:11 +0200 imieiscript (1.0) unstable; urgency=low * Initial Release. -- s3v <s3v@localhost> Fri, 28 Jun 2013 21:46:24 +0200
Si può vedere che è stata aggiornata la versione (1.1), la data e aggiunta una spiegazione a quello che si è cambiato.
Un'alternativa che inserisce automaticamente versione e data è:
$ dch -i
che apre l'editor di default per permettere di documentare i cambiamenti effettuati.
Ora, come prima, basta un:
$ dpkg-buildpackage -us -uc
per ricreare altri quattro file che però, adesso, conterranno la versione aggiornata.
Rimuovere o rinominare uno script
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:
if [ -f /usr/bin/script1 ]; then rm /usr/bin/script1 fi
questo rimuoverà il file /usr/bin/script1
dalla directory /usr/bin/
al momento dell'installazione del pacchetto.
Lo stato di file e directory diventerà simile al seguente:
pacchetti/ └-- imieiscript-1.1/ ├-- debian/ | ├-- changelog | ├-- copyright | ├-- compat | ├-- control | ├-- install | ├-- rules | └-- preinst | └-- script/ ├-- script2 └-- script3
da cui si vede che è stato tolto dal pacchetto il file script1
e aggiunto il file preinst
.
Analogamente, per rinominare il file script1
la situazione sarà:
pacchetti/ └-- imieiscript-1.1/ ├-- debian/ | ├-- changelog | ├-- copyright | ├-- compat | ├-- control | ├-- install | ├-- rules | └-- preinst | └-- script/ ├-- script1-rinominato ├-- script2 └-- script3
Rimozione del pacchetto
Una volta installato, il pacchetto si comporta esattamente come tutti gli altri e quindi può essere rimosso con il classico:
# apt-get remove imieiscript
Controllare il pacchetto
Se si vuole controllare il pacchetto .deb creato, si può usare lintian:
$ lintian imieiscript_1.1_all.deb
che provvederà a fare un check sul pacchetto per controllare se esso contiene errori oppure ha bisogno di modifiche per aderire alla policy e entrare nei repository di Debian.
Il check, visto che si tratta di un pacchetto personale, non è necessario. Se siete amanti della precisione:
$ lintian imieiscript_1.1_all.deb E: imieiscript: debian-changelog-file-contains-invalid-email-address s3v@localhost E: imieiscript: debian-changelog-file-contains-invalid-email-address s3v@localhost E: imieiscript: helper-templates-in-copyright W: imieiscript: copyright-has-url-from-dh_make-boilerplate E: imieiscript: copyright-contains-dh_make-todo-boilerplate E: imieiscript: extended-description-is-empty E: imieiscript: maintainer-address-malformed s3v <s3v@localhost> E: imieiscript: maintainer-address-is-on-localhost s3v <s3v@localhost> W: imieiscript: binary-without-manpage usr/bin/script1 W: imieiscript: binary-without-manpage usr/bin/script2 W: imieiscript: binary-without-manpage usr/bin/script3
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.
Se si vogliono informazioni più dettagliate sui cambiamenti da effettuare:
$ lintian -i imieiscript_1.1_all.deb
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.
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 /usr/local/bin/imieiscript/
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 /usr/local/bin
.
Se /usr/local/bin
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:
script/* usr/local/bin/imieiscript/
Oppure:
script/* usr/local/bin/
se si vuole utilizzare la directory /usr/local/bin/
.
Il file rules
Aggiungere in fondo al file la seguente riga:
override_dh_usrlocal:
Nel caso si voglia anche impostare automaticamente i permessi degli script, aggiungere:
override_dh_usrlocal: override_dh_fixperms: dh_fixperms chmod 0755 debian/imieiscript/usr/local/bin/imieiscript/*
oppure, se si è scelto di installare gli script nella directory "/usr/local/bin":
override_dh_usrlocal: override_dh_fixperms: dh_fixperms chmod 0755 debian/imieiscript/usr/local/bin/*
Il file preinst
Poiché abbiamo deciso di installare i nostri script nella directory /usr/local/bin/imieiscript/
, questo file è necessario per crearla:
if [ ! -d /usr/local/bin/imieiscript/ ]; then mkdir -p /usr/local/bin/imieiscript fi
Il file non va creato se si è scelta /usr/local/bin/
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".
Bisogna prestare la massima attenzione a ricreare la directory con gli stessi permessi che aveva in precedenza, per cui è altamente consigliato eseguire un:
$ ls -l /usr/local ... drwxrwsr-x 2 root staff 4096 ott 15 11:39 bin ...
prima della disinstallazione e controllare i permessi per l'utente/gruppo in modo da poterli ricreare in caso di rimozione.
In questo caso una creazione da parte di root della directory porterà a:
... drwxr-sr-x 2 root staff 4096 ott 15 12:05 bin ...
come si vede, manca qualcosa: il permesso di scrittura per il gruppo "staff".
Creare quindi il file "postrm" con questo contenuto:
if [ ! -d /usr/local/bin ]; then mkdir -p /usr/local/bin chmod g+w /usr/local/bin fi
Se la directory "/usr/local/bin" non esiste, verrà ricreata e le verrà assegnato il permesso di scrittura per il gruppo "staff".
Conclusioni
L'albero file/directory sarà simile a:
pacchetti/ └-- imieiscript-1.0/ ├-- debian/ | ├-- changelog | ├-- copyright | ├-- compat | ├-- control | ├-- install | ├-- rules | ├-- preinst | └-- postrm | └-- script/ ├-- script1 ├-- script2 └-- script3
Si noti che, durante la rimozione del pacchetto, potrebbe venir mostrato il seguente messaggio:
dpkg: attenzione: nel rimuovere imieiscript, la directory "/usr/local" è risultata non vuota e non viene rimossa
Con cui "apt" ci avverte che è stata rimossa la directory "/usr/local/bin".
Niente paura: questa viene ricreata da "postrm" con i permessi originari:
$ ls -l /usr/local ... drwxrwsr-x 2 root staff 4096 ott 15 12:11 bin ...
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 e solo nel caso in cui il pacchetto sia stato già disinstallato.
Questo potrebbe essere il contenuto del file "postinst":
echo "-- ATTENZIONE -- Questo file viene creato dal pacchetto imieiscript per evitare la cancellazione della directory /usr/local/bin (se vuota) durante la sua disinstallazione. Rimuovere manualmente solo se il pacchetto imieiscript è stato disinstallato!" > /usr/local/bin/imieiscript.readme
La situazione di file e directory dovrebbe essere simile a:
pacchetti/ └-- imieiscript-1.0/ ├-- debian/ | ├-- changelog | ├-- copyright | ├-- compat | ├-- control | ├-- install | ├-- rules | ├-- preinst | └-- postinst | └-- script/ ├-- script1 ├-- script2 └-- script3
Il path degli script
Una volta installato correttamente il pacchetto, è venuto il momento di provare ad eseguire qualcuno dei propri script. L'esecuzione è possibile indicando il percorso assoluto oppure, più comodamente, il solo nome dello script da eseguire. Ad esempio:
$ script1
Questo dipende dalla directory in cui sono stati installati gli script e dal contenuto della variabile d'ambiente PATH.
Tipicamente, in un sistema Debian, questa variabile contiene:
$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
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:
export PATH=$PATH:/usr/local/bin/imieiscript
e impartire un:$ source ~/.bashrc
per rendere effettive le modifiche.
Guida scritta da: S3v 22:18, 28 giu 2013 (CEST) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |