Installation de fichier via paquet .deb

Bonjour,
J’ai un CD d’installation preseed (ou simplecdd mais le problème va être le même).
Dans cette installation complètement automatisée, j’ai besoin de remplacer des fichiers de configurations de certains paquets officiels.
Le besoin de les remplacer est tout simplement du au fait qu’il est bien trop difficile de modifier le fichier existant, soit parce qu’il y a trop de choses à modifier, soit parce que sa structure est trop complexe pour le faire et qu’il est plus simple de le remplacer avec la version voulue.
Le nombre de ces fichiers est assez important (en l’état actuel 83 fichiers pour être exact).

J’ai donc créé un package Debian, .deb, pour installer ces fichiers. Étant donné qu’il ne s’agit que de poser des fichiers sans compilation et autres manipulations c’est assez simple à faire, du moins en apparence.

En apparence car quand on veut installer le fichier avec un simple dpkg -i paquet.deb, il y a un message d’erreur indiquant qu’il y a des ficheirs appartenant à d’autres paquets (comme par exemple dhcpd.conf qui appartient à isc-dhcp-server) et qu’il ne peut pas réaliser l’opération.
Normal et tout à fait compréhensible. Le seul moyen à ce moment pour installer le fichier c’est de faire dpkg -i --force-overwrite paquet.deb.
A ce moment là, l’opération se réalise avec une information de remplacement du fichier d’un autre paquet.
Seulement, si le paquet d’origine doit être mis à jour, par apt update && apt upgrade, il y a alors une erreur sur les paquets correspondant aux fichiers remplacés, et l’installation des paquets en question se termine en erreur, parce que le fichier existant n’est plus un fichier du paquet mais celui de mon paquet.
dans mon exemple, le fichier /etc/dhcp/dhcpd.conf n’appartien plus à isc-dhcp-server mais à monpaquet.deb.
je pense qu’il doit y avoir un problème de checksum ou quelque chose d’approchant quelque part.

Y-a-t-il un moyen de faire en sorte de pouvoir installer les fichier via un paquet .deb unofficial, sans que cela génère ensuite une erreur à la mise à jour du paquet official auquel le fichier modifié correspond?

Deux paquets différents (je mets de côté le cas particulier des architectures différentes d’un même paquet) qui n’ont pas de dépendance de type « conflicts » ne doivent pas installer le « même » fichier (au sens du pathname).

Pourquoi veux-tu installer tes fichiers de configuration avec un paquet ? Une simple archive tar ou équivalent ne suffirait pas ? Si ces fichiers sont correctement gérés en « conffiles », alors la mise à jour des paquets ne devrait pas les remplacer automatiquement.

Il existe aussi un système de « détournement » avec dpkg-divert pour renommer/déplacer un fichier installé par un paquet. Cela peut être utilisé par un autre paquet pour éviter un conflit avec son propre fichier. Mais je ne sais pas si ça fonctionne avec les conffiles.

Le soucis c’est qu’un tar devra disperser des fichiers dans pas mal d’endroits:

├── boot
│   └── grub
│       └── layouts
│           └── fr.gkb
├── DEBIAN
│   ├── control
│   ├── postinst
│   ├── postrm
│   ├── preinst
│   └── prerm
├── etc
│   ├── apt
│   │   └── sources.list.d
│   │       └── webmin.list
│   ├── audit
│   │   ├── auditd.conf
│   │   └── rules.d
│   │       ├── 00-audit.rules
│   │       ├── 01-time-change.rules
│   │       ├── 02-identity.rules
│   │       ├── 03-system-locale.rules
│   │       ├── 04-MAC-policy.rules
│   │       ├── 05-logins.rules
│   │       ├── 06-sessions.rules
│   │       ├── 07-perm_mod.rules
│   │       ├── 08-access.rules
│   │       ├── 09-privileged.rules
│   │       ├── 10-mounts.rules
│   │       ├── 11-delete.rules
│   │       ├── 12-scope.rules
│   │       ├── 13-actions.rules
│   │       ├── 14-modules.rules
│   │       └── 99-finalize.rules
│   ├── bash.bashrc
│   ├── bind
│   │   ├── bind.keys
│   │   ├── db.0
│   │   ├── db.127
│   │   ├── db.255
│   │   ├── db.empty
│   │   ├── db.local
│   │   ├── named.conf
│   │   ├── named.conf.default-zones
│   │   ├── named.conf.local
│   │   ├── named.conf.options
│   │   ├── rndc.conf
│   │   ├── rndc.key
│   │   └── zones.rfc1918
│   ├── default
│   │   ├── aide
│   │   ├── grub
│   │   └── shorewall-init
│   ├── dhcp
│   │   ├── dhclient.conf
│   │   ├── dhcpd6.conf
│   │   ├── dhcpd.conf
│   │   └── rndc.key
│   ├── gai.conf
│   ├── GeoIP.conf
│   ├── issue
│   ├── issue.net
│   ├── login.defs
│   ├── neofetch
│   │   └── neofetch.conf
│   ├── ntp.conf
│   ├── pam.d
│   │   ├── common-auth
│   │   ├── common-password
│   │   └── su
│   ├── profile
│   ├── rsyslog.conf
│   ├── securetty
│   ├── security
│   │   └── pwquality.conf
│   ├── skel
│       ├──vimrc
│   ├── ssh
│   │   └── sshd_config
│   ├── sudoers
│   ├── sysctl.d
│   │   ├── 98-sysctl.conf
│   │   └── 99-sysctl.conf
│   ├── systemd
│   │   └── system
│   │       ├── aidecheck.service
│   │       └── aidecheck.timer
│   ├── ulogd.conf
│   ├── update-motd.d
│   │   └── 00-header
│   ├── vim
│   │   └── vimrc
│   └── webmin
│       └── config
├── home
│   └── user
│       ├──.vimrc
├── root
│   └── .vimrc
│   ├── conffiles
│   │   └── routeur.fwmodel
│   └── scripts
│       ├── reboot_exec.sh
│       ├── update-initial-setup.sh
│       └── update-interfaces.pl
└── var
    └── lib
        └── bind
            ├── lan1.rev
            ├── lan2.rev
            ├── lan3.rev
            ├── bind9-default.md5sum
            ├── dynamic
            ├── f******10.rev
            ├── f******20.rev
            ├── f******30.rev
            └── my.domain.tld.db

Ça fait quand même pas mal. je n’étais pas sur qu’avec un tar je pourrais tout faire.
Et, bien que ce ne soit pas encore le cas, j’aurais surement dans un avenir assez proche besoin d’un script de postinstall, et éventuellement des règles pour certains fichiers. Car par exemple, si le paquet est déployé sur une machine où bind9 n’a pas été déployé, je ne veux pas installer les fichiers /etc/bind et /var/lib/bind. Mais ça, c’est pour plus tard.

En quoi est-ce un souci ?

Je ne sais pas de façon certaine. Les droits et propriétaires des fichiers seront-ils bien conservé? Que se passe-t-il si, par exemple, les droits d’un répertoire déjà existant sont différents de celui que je veux mettre/modifier?

Il y a de grandes chances que tous ces fichiers appartiennent à root.

Ben non, il y a du root:root, du user:user, du root:bind, entre autres :slight_smile:

Alors il suffira de mettre les même permissions sur les fichiers de ton archive ou de ton paquet.

Ok. c’est déjà le cas du fait d’avoir utilisé un .deb
Par contre il me faut un tar pour chaque possibilité d’installation, et c’est là le problème.
Avec un .deb je pouvais avoir un seul fichier mais pour différentes utilisations:
par exemple si isc-dhcp-server est present, alors le fichier /etc/dhcp/dhcpd.conf est deployé sinon il ne l’est pas.

Comment fais-tu ça avec un .deb ?

A priori, c’est entre les postinst, preinst et les rules, mais je n’ai pas réussi à voir clairement on fait ça pour le moment :slight_smile:

Je ne connais pas les rules, mais si tu comptes utiliser le script postinst (preinst est exécuté avant le dépaquetage des fichiers) pour mettre en place les fichiers de configuration conditionnellement, ça implique que tous les fichiers soient dépaquetés quelque part. Tu pourrais aussi bien le faire sans passer par un paquet.