Molti di questi compiti richiedono azioni coordinate da parte di diversi script dei manutentori (preinst, postinst, prerm, postrm). Per evitare sbagli basta mettere la stessa chiamata in tutti gli script e il programma adatterà automaticamente il suo comportamento sulla base della variabile d'ambiente DPKG_MAINTSCRIPT_NAME e sugli argomenti per gli script dei manutentori che devono essere passati dopo un doppio trattino.
Se il file di configurazione non è stato fornito per diverse versioni, e si sta ora cercando di modificare gli script del manutentore per ripulire il file obsoleto, versione-prec dovrebbe essere basata sulla versione del pacchetto che si sta preparando ora, non sulla prima versione del pacchetto a cui mancava il file di configurazione. Ciò è vero similmente per tutte le altre azioni.
Per esempio, per un file di configurazione rimosso nella versione 2.0-1 di un pacchetto, versione-prec dovrebbe essere impostata a 2.0-1~. Ciò farà sì che il file di configurazione sia rimosso anche se l'utente ha ricompilato la versione precedente 1.0-1 come 1.0-1local1. Oppure un pacchetto che passa un percorso da un collegamento simbolico (fornito nella versione 1.0-1) ad una directory (fornita nella versione 2.0-1), ma che effettua l'effettivo cambiamento nello script del manutentore nella versione 3.0-1, dovrebbe impostare versione-prec a 3.0-1~.
Ciò significa che se un pacchetto deve rinominare o rimuovere un file di configurazione, deve farlo esplicitamente e dpkg-maintscript-helper può essere usato per implementare in modo pulito la cancellazione e lo spostamento di file di configurazione all'interno di script dei manutentori.
Se un file di configurazione viene completamente rimosso, dovrebbe essere rimosso dal disco a meno che l'utente non l'abbia modificato. Se ci sono modifiche locali, queste dovrebbero essere preservate. Se l'aggiornamento del pacchetto fallisce, il file di configurazione appena reso obsoleto non dovrebbe sparire.
Tutto ciò è implementato mettendo il seguente frammento shell negli script del manutentore preinst, postinst e postrm.
dpkg-maintscript-helper rm_conffile \
conffile prior-version package --- ``$@''
fileconf è il nome del file di configurazione da rimuovere.
Attuale implementazione: in preinst, controlla se il file di configurazione è stato modificato e lo rinomina in fileconf.dpkg-remove (se non modificato) o fileconf.dpkg-backup (se modificato). In postinst, quest'ultimo file viene rinominato in fileconf.dpkg-bak e mantenuto per riferimento dato che contiene le modifiche dell'utente ma il primo viene rimosso. Se l'aggiornamento del pacchetto fallisce, postrm reinstalla il file di configurazione originale. Durante l'eliminazione completa, postrm elimina anche il file .dpkg-bak fino ad allora preservato.
Un cambio di nome pulito può essere implementato mettendo il seguente frammento shell negli script del manutentore preinst, postinst e postrm.
dpkg-maintscript-helper mv_conffile \
old-conffile new-conffile prior-version package --- ``$@''
vecchio-fileconf e nuovo-fileconf sono il nome vecchio e quello nuovo del file di configurazione da rinominare.
Attuale implementazione: preinst controlla se il file di configurazione è stato modificato; se lo è stato viene lasciato al suo posto altrimenti viene rinominato in vecchio-fileconf.dpkg-remove. Durante la configurazione, postinst rimuove vecchio-fileconf.dpkg-remove e rinomina vecchio-fileconf in nuovo-fileconf se vecchio-fileconf è ancora disponibile. In caso di aggiornamento o installazione falliti, postrm rinomina vecchio-fileconf.dpkg-remove nuovamente in vecchio-fileconf, se necessario.
Un cambio di nome pulito può essere implementato mettendo il seguente frammento shell negli script del manutentore preinst, postinst e postrm.
dpkg-maintscript-helper symlink_to_dir \
pathname old-target prior-version package --- ``$@''
percorso è il nome assoluto del vecchio collegamento simbolico (il percorso sarà una directory al termine dell'installazione) e vecchia-destinaz è il nome della destinazione del vecchio collegamento simbolico percorso. Può essere sia assoluto sia relativo alla directory che contiene percorso.
Attuale implementazione: preinst controlla se il collegamento simbolico esiste e punta a vecchia-destinaz, se non è così allora viene lasciato al suo posto, altrimenti viene rinominato in percorso.dpkg-backup. Durante la configurazione postinst rimuove percorso.dpkg-backup se questo è ancora un collegamento simbolico. In caso di aggiornamento o installazione falliti, postrm rinomina percorso.dpkg-backup nuovamente in percorso se necessario.
Un passaggio pulito può essere implementato mettendo il seguente frammento shell negli script del manutentore preinst, postinst e postrm.
dpkg-maintscript-helper dir_to_symlink \
pathname new-target prior-version package --- ``$@''
percorso è il nome assoluto della vecchia directory (il percorso sarà un collegamento simbolico al termine dell'installazione) e nuova-destinaz è il nome del nuovo collegamento simbolico percorso. Può essere sia assoluto sia relativo alla directory che contiene percorso.
Attuale implementazione: preinst controlla se la directory esiste, non contiene file di configurazione, percorsi di proprietà di altri pacchetti o percorsi creati localmente; se non è così è lasciata al suo posto, altrimenti viene rinominata in percorso.dpkg-backup e viene creata una nuova directory vuota chiamata percorso marcata con un file in modo che dpkg possa tenerne traccia. Durante la configurazione postinst finisce il passaggio se percorso.dpkg-backup è ancora una directory e percorso è la directory contrassegnata; rimuove il file che contrassegna la directory, muove i file appena creati all'interno della directory contrassegnata nella destinazione del collegamento simbolico nuova-destinaz/, sostituisce la directory contrassegnata percorso ora vuota con un collegamento simbolico a nuova-destinaz e rimuove percorso.dpkg-backup. in caso di aggiornamento o installazione falliti, postrm rinomina percorso.dpkg-backup nuovamente in percorso se necessario.
Dato che dpkg-maintscript-helper viene usato in preinst, il suo uso incondizionato richiede una pre-dipendenza per assicurare che sia stata già spacchettata la versione richiesta di dpkg. La versione richiesta dipende dal comando usato: per rm_conffile e mv_conffile è 1.15.7.2, per symlink_to_dir e dir_to_symlink è 1.17.14:
Pre-Depends: dpkg (>= 1.17.14)
In molti casi però l'operazione effettuata dal programma non è critica per il pacchetto e invece di usare una pre-dipendenza si può chiamare il programma solo se si sa che il comando richiesto è supportato dalla versione di dpkg attualmente installata:
if dpkg-maintscript-helper supports command; then
dpkg-maintscript-helper command ...
fi
Il comando supports restituisce 0 in caso di successo e 1 altrimenti. Il comando supports controlla se le variabili d'ambiente impostate da dpkg e richiesta dallo script sono presenti e considera un fallimento se l'ambiente non è sufficiente.