Creare file di configurazione in /etc nei pacchetti Debian
Attualmente sto lavorando ad una versione aggiornata di picockpit-client, che dovrebbe aggiungere ulteriori file di configurazione in /etc/picockpit-client per i singoli moduli (PiDoctor & PiControl).
picockpit-client è un pacchetto Raspbian per picockpit.com, che collega la piattaforma web con il proprio Raspberry Pi.
Poiché Raspbian è basata su Debian, le seguenti informazioni sono valide per i pacchetti generali per Debian e derivati (ad esempio Ubuntu).
dh-virtualenv
Consiglio vivamente il mio altro articolo sui pacchetti Debian come introduzione e materiale aggiuntivo, nel caso siate interessati a pacchettizzare applicazioni Python.
In questo articolo discuterò i concetti generali relativi al packaging, e in particolare l'installazione di file in /etc/
Una nota in anticipo: Il "punto di ingresso" per costruire un pacchetto è il makefile debian/regole.
E potete costruire i pacchetti usando il seguente comando:
dpkg-buildpackage -uc -us -b
Questo comando viene eseguito dalla directory principale del vostro pacchetto, non dalla directory debian/.
Panoramica di base
Puoi vedere una struttura di cartelle necessaria per un pacchetto Debian (contenuta nella cartella picockpit-client-package).
La cosa più importante è che contiene una cartella debianche contiene diversi file di configurazione usati per costruire il pacchetto.
Questo layout di file è usato per costruire il pacchetto usando debhelperche la maggior parte dei pacchetti usa perché automatizza molti compiti.
changelog
Questo file contiene informazioni sul changelog (per il pacchetto debian). È usato per impostare la versione del pacchetto.
Esempio di contenuto:
Notate che l'indentazione per spazi è necessaria (due spazi prima del simbolo *, uno spazio prima del simbolo -)
Nel mio esempio la versione più recente del pacchetto (voce in alto) è 0.18.5
compat
Questo file contiene un numero seguito da una nuova linea:
Questa è la versione di debhelper con cui la vostra applicazione è compatibile. (A partire dalla versione 12 questo può essere specificato anche in debian/control, ma sarà ancora supportato in debian/compat per la compatibilità all'indietro - vedi questo manpage)
controllare
Questo file è usato per fornire le dipendenze, il nome del pacchetto e altri metadati rilevanti del pacchetto.
copyright
Questo file fornisce informazioni sul copyright del vostro pacchetto.
.install
Nel mio caso, il file si chiama picockpit-client.install poiché il mio pacchetto è il pacchetto picockpit-client.
Questo file è valutato da dh_installazione (che fa parte di debhelper). Copia un file o diversi file in una directory del pacchetto (da installare in questa posizione assoluta del sistema in seguito).
In questo caso, voglio che il file etc/dinosaur/dinosaur.cfg da installare in /etc/dinosaur, come /etc/dinosaur/dinosaur.cfg
Un problema in cui mi sono imbattuto durante la ricerca di questo argomento è capire, dove posizionare etc/dinosaur/dinosaur.cfg, relativamente a picockpit-client.install.
È importante sapere in cui i luoghi di ricerca dh_install cerca questi file.
Ecco la risposta:
Per impostazione predefinita cerca in "." e "debian/tmp".
"." è la directory in cui è contenuta la cartella debian.
Perciò, osservate la struttura delle cartelle:
Quindi, come vedi, "etc" è allo stesso livello della cartella "debian". Si noti che avrei potuto nominarlo arbitrariamente, dato che ho specificato la posizione in picockpit-client.install:
etc/dinosauro/dinosauro.cfg etc/dinosauro
Potrei modificare questo per essere semplicemente dinosaur.cfg, poi dinosaur.cfg deve essere nella stessa directory madre della cartella debian.
Si veda più avanti per maggiori informazioni sul ruolo speciale dei file che vanno in /etc, e un importante suggerimento per il debug di dh_install.
.links
Questo imposterà i collegamenti simbolici, ad esempio per aggiungere la vostra applicazione al percorso di sistema in cui vengono cercati i binari:
.postinst
Uno script che viene eseguito dopo l'installazione. set -e è importante in questo script, deve anche restituire 0 per indicare il successo (in modo che l'installazione del pacchetto possa essere completata).
Ho l'impostazione predefinita da un modello:
.servizio
Questa è una voce di servizio systemd da aggiungere per la vostra applicazione. Ho, per esempio
.trigger
Non sono del tutto sicuro a cosa serva; per me è così (e funziona):
regole
è un makefile usato per costruire il pacchetto. Questo varia a seconda del tipo di pacchetto che si costruisce. Sto riproducendo il mio file di regole qui per vostra comodità.
Come potete vedere, usa dh_virtualenvche è una soluzione per creare ambienti virtuali per il codice Python (permettendo a pacchetti incompatibili di coesistere sullo stesso sistema, e a voi di essere in grado di controllare l'ambiente in cui distribuire).
Se siete interessati a dh_virtualenv, leggete il mio articolo su come impacchettare pacchetti Python per Raspbian con dh_virtualenv.
#!/usr/bin/make -f
#
# Costruire il pacchetto Debian usando https://github.com/spotify/dh-virtualenv
#
# I seguenti obiettivi creano una copia pulita del workdir tramite
# usando "sdist", altrimenti "pip" va in tilt quando si installa da
# sourcedir ".", perché questo include la fase di compilazione di debian,
# e ne consegue un'esplosione ricorsiva quando si seguono i symlink.
#
# Assicura anche che il tuo MANIFESTO sia completo e copra almeno
# tutti i file necessari per una build di rilascio.# Aumenta la registrazione delle tracce, vedere debhelper(7) (decommentare per abilitare)
#DH_VERBOSE=1esportare DH_VIRTUALENV_INSTALL_ROOT=/usr/share
SNAKE=/usr/bin/python3
EXTRA_REQUIREMENTS=-preinstallazione "setuptools>=17.1,=7" -preinstallazione "wheel" -preinstallazione "no-manylinux1"
DH_VENV_ARGS=-con python-virtualenv -setuptools -python $(SNAKE) $(EXTRA_REQUIREMENTS) #-v
PACKAGE=$(shell dh_listpackages)
VERSION=$(shell $(SNAKE) setup.py -version)
SDIST_DIR=debian/$(PACKAGE)-$(VERSION)pulito:
test ! -d dist || rm -rf dist
test ! -d $(SDIST_DIR) || rm -rf $(SDIST_DIR)
dh $@ $(DH_VENV_ARGS)costruire-arch:
$(SNAKE) setup.py sdist -formats tar
mkdir -p $(SDIST_DIR)
tar -x -C $(SDIST_DIR) -strip-components=1 -exclude '*.egg-info' -f dist/*.tar
#dh $@ $(DH_VENV_ARGS) -sourcedir $(SDIST_DIR) -sourcedir .
dh $@ $(DH_VENV_ARGS) -sourcedir .%:
#dh $@ $(DH_VENV_ARGS) -sourcedir $(SDIST_DIR) -sourcedir .
dh $@ $(DH_VENV_ARGS) -sourcedir .
Si prega di notare che WordPress tende a incasinare la sintassi del codice, quindi usate questo solo come una guida approssimativa, non per copiare e incollare!
Maggiori informazioni su /etc e dh_install
Importante nota a margine / bugfix
Ho passato un sacco di tempo a debuggare il seguente problema:
dh_install: Impossibile trovare (qualsiasi corrispondenza per) "etc/dinosaur/dinosaur.cfg" (provato in debian/picockpit-client-0.18.5, debian/tmp)
dh_install: picockpit-client file mancanti: etc/dinosaur/dinosaur.cfg
dh_install: file mancanti, aborto
Questo problema è legato a una voce "sbagliata" in debian/regole
come potete vedere qui, in questa sintassi (per i principianti) piuttosto travolgente e criptica, un parametro chiamato -sourcedir viene impostato per il comando dh sulle voci build-arch e %:
Nel documentazione dh_installsiamo in grado di leggere che questo parametro configura in quale directory di origine i file devono essere cercati per l'installazione.
Dal momento che questo era stato impostato nel mio debian/regole dh_install stava cercando in debian/picockpit-client-0.18.5 e debian/tmp - ma non nella directory di primo livello.
La soluzione è semplice:
dh $@ $(DH_VENV_ARGS) -sourcedir .
Passo semplicemente "." come nome di directory a -sourcedir
Si prega di notare che il passaggio di due voci sourcedir non funzionerà come previsto:
in questo caso, la prima voce sarà sovrascritta:
Quindi solo "." sarà controllato, e la directory passata in $(SDIST_DIR) no.
ecc è speciale
dh_install tratta i file da installare in etc come cosiddetti conffiles.
Questo viene determinato automaticamente, non è necessario aggiungere alcuna configurazione aggiuntiva per questo (basta aggiungere il file di configurazione come una linea nel vostro file .install).
Per dirlo di nuovo: se usate debhelper per il vostro packaging, fate non bisogno di creare il conffiles nella directory debian manualmente. debhelper lo farà per voi.
dpkg gestisce questi file di configurazione, e assicura che la configurazione dell'utente sia salvata tra gli aggiornamenti dei pacchetti e durante la semplice rimozione dei pacchetti.
Leggete questa meravigliosa panoramica su cosa significano i conffili per gli utenti di Raphael Hertzog.
Diciamo che ho installato il mio pacchetto (con un fittizio /etc/dinosaur/dinosaur.cfg ).
Ho poi aggiunto una voce aggiuntiva "New Dino adventures" in /etc/dinosaur/dinosaur.cfg
Se rimuovo semplicemente il pacchetto:
apt-get remove picockpit-client
Poi il pacchetto sarà rimosso, ma il file di configurazione rimarrà indietro:
Per sbarazzarsi anche del file di configurazione modificato, abbiamo bisogno di eliminare il pacchetto:
apt-get purge picockpit-client
Ti informerà su ciò che sta facendo: "Purging configuration files for picockpit-client (0.18.5) ..."
Nota: non è necessario modificare il file di configurazione perché rimanga se si rimuove il pacchetto. Anche un file non modificato rimarrà indietro.
OK, ora diciamo che avete modificato il file e state per aggiornare o reinstallare il pacchetto:
In questo caso, la tua versione modificata rimarrà (o ti verrà richiesto):
Le versioni dei file di configurazione e su quale versione si basano le vostre modifiche derivano dalle somme MD5.
Potete ispezionare queste md5sum da:
dpkg -status picockpit-client
Come potete vedere, nella sezione Conffiles il file /etc/dinosaur/dinosaur.cfg è mostrato con la sua somma MD5 originale.
dpkg può confrontare la somma MD5 tra gli aggiornamenti del pacchetto e vedere se la versione del manutentore cambia.
Se non si modifica il file di configurazione originale (come utente del sistema), verrà installata la nuova versione del manutentore.
Se entrambi hanno modificato i loro file, allora vi verrà richiesto di fare una scelta.
Riferimenti
- debhelper manpage (inclusa una lista di comandi debhelper dh_xx)
- Informazioni di Raphael Hertzog sui conffili
- https://www.debian.org/doc/manuals/maint-guide/dother.en.html
- https://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.en.pdf
- https://vincent.bernat.ch/en/blog/2019-pragmatic-debian-packaging
- https://manpages.debian.org/buster/debhelper/dh_installdeb.1.en.html
Per dh_virtualenv:
- https://pi3g.com/2019/04/19/packaging-python-projects-for-debian-raspbian-with-dh-virtualenv/
- https://dh-virtualenv.readthedocs.io/en/1.1/
- https://github.com/1and1/debianized-jupyterhub (un esempio che contiene anche un file .install)