Lors de leur installation, certains logiciels livrés en paquets Debian (.deb) posent des questions dans une interface semi-graphique (bleu/gris, ncurses).
La plupart d'entre eux prévoient un choix par défaut. Donc on peut réclamer le silence durant leur installation : sudo DEBIAN_FRONTEND=noninteractive dpkg -i <paquet>.deb
.
Mais certains logiciels exigent une réponse et leur installation échoue si on leur réclame le silence. Exemple ? Cisco PacketTracer qui veut que l'on accepte son contrat de licence.
L'écosystème Debian propose des outils pour parer à cette situation en provisionnant des réponses : debconf-get-selections
, debconf-set-selections
, debconf-communicate
.
On n'en attend pas moins d'un système qui permet déjà de fournir des réponses pré-enregistrées (preseed) pour son installation.
D'abord, on récupère toutes les réponses déjà provisionnées : debconf-get-selections | sort > debconf_avant_PT.txt
.
Il faut trier la sortie car debconf-get-selections
ne régurgite pas les réponses dans le même ordre entre deux exécutions. :(
Puis on installe le paquet pénible normalement, en répondant aux questions afin que l'installation soit conforme à ce qu'on attend, à la cible : sudo dpkg -i CiscoPacketTracer_801_Ubuntu_64bit.deb
.
Puis, on récupère à nouveau la liste des réponses provisionnées : debconf-get-selections | sort > debconf_apres_PT.txt
.
On compare les deux listes afin de trouver les configurations ajoutées par Packet Tracer : diff debconf_avant_PT.txt debconf_apres_PT.txt
. Résultat :
PacketTracer PacketTracer_800_amd64/accept-eula boolean true
PacketTracer PacketTracer_800_amd64/show-eula note
On supprime les réponses pré-enregistrées pour/par Packet Tracer : echo PURGE | sudo debconf-communicate PacketTracer
. (Le paramètre est la première chaîne de caractères d'une ligne debconf-get-selections
qui est au format « propriétaire clé/sous-clé valeur »).
On désinstalle le logiciel puis on retente son installation : sudo DEBIAN_FRONTEND=noninteractive dpkg -i CiscoPacketTracer_801_Ubuntu_64bit.deb
. Il demande à nouveau de valider son contrat de licence. Jusque-là, tout va bien.
On le désinstalle à nouveau.
On provisionne les réponses :
echo 'PacketTracer PacketTracer_800_amd64/accept-eula boolean true
PacketTracer PacketTracer_800_amd64/show-eula note' | sudo debconf-set-selections
On installe le paquet normalement (sudo dpkg -i CiscoPacketTracer_801_Ubuntu_64bit.deb
) : aucune question et l'installation est réussie. \o/
On peut donc automatiser l'installation de ce logiciel sur tout un parc d'ordinateurs (avec un script, Puppet, peu importe) : il suffit d'utiliser debconf-set-selections
avant dpkg -i
.
A priori, les réponses pré-enregistrées sont ignorées par dpkg-reconfigure <nom_logiciel>
. J'ai testé avec le paquet unattended-upgrades (voir ici). C'est sensé : dpkg-reconfigure
stocke la réponse dans le même dépôt accessible à debconf-get|set-selections
. Si dpkg-reconfigure
utilisait ce dépôt pour provisionner, il serait impossible de reconfigurer un logiciel (réponse déjà dans le dépôt, je la prends, donc logiciel pas reconfiguré) alors que c'est le but de la commande.
Merci Alex de m'avoir appris l'existence de ces outils. :)