Package: dpkg
Version: 1.20.7.1
Severity: important
X-Debbugs-Cc: plore...@disroot.org

Dear maintainer,

I want one of my packages to divert files from an essential package: I used 
code 
from examples (with --rename option) online [1] that works fine, but lintian 
complains.
Moving essential files can be dangerous, use the --no-rename.
Ok. So I assumend that the same code would work fine, just replacing '--rename' 
with
'no-rename', silly me.. instead it broke my system.
It is true that the manpage states under [ --add/remove]
"The file is currently not renamed, see --rename"
However reading the --rename/--no-rename description I was under the impression 
that the
--no-rename was a safer option - overwrite during unpack instead of moving aside
before the unpack, and that it's safer also when the diversion is removed.
This is not the case, or maybe there is an easy way that i'm not considering
but it's not documented anywere and also serching the code base for examples [2]
provides no clue.

Somehow i found a way but it requires some additional code in preinst and 
giving that
lintian screams in all the four cardinal direction I suspect it's not the right 
way
[ example appended at the end ]

I'm having the following problems with --no-rename:

* At preinst, it doesn't create a copy of the original file "file.real"

* at postrm, the file disappear and it's not replaced by anything;
  also, if there is a copy "file.real" is left there (i guess piuparts would 
complain)

Even if one use the --rename option in postrm, the "file.real" is not granted
to exists untill the package that ship the original file is upgraded or 
reinstalled.
Finally, while during the unpack the file is overwritten, during the removal 
there is
still a moment where the file disappear (am I wrong?) so overall it does look 
more
complex to handle but not that safer than a standard --rename.

Regards,
Lorenzo

[1] https://www.debian.org/doc/debian-policy/ap-pkg-diversions.html
[2] https://codesearch.debian.net/search?q=dpkg-divert+--no-rename&literal=1


Example

$ cat runit-init.preinst 
#!/bin/sh

set -e
# make sure that the *.real diverted file exists when postrm is called
# as with --no-rename the diverted file is not created: if this package
# is removed before init-system-helpers is upgraded the system will be
# left without helpers!! see postrm
if [ upgrade != "$1" ] || dpkg --compare-versions "$2" lt 2.1.2-41; then
    for file in /usr/sbin/invoke-rc.d /usr/sbin/service /usr/sbin/update-rc.d ; 
do
        if [ ! -e "$file".real ] ; then
            cp "$file" "$file".real
        fi
    done
fi

# install helpers with runit support
if [ upgrade != "$1" ] || dpkg --compare-versions "$2" lt 2.1.2-41; then
    dpkg-divert --package runit-init --add --no-rename \
        --divert /usr/sbin/invoke-rc.d.real /usr/sbin/invoke-rc.d
    dpkg-divert --package runit-init --add --no-rename \
        --divert /usr/sbin/service.real /usr/sbin/service
    dpkg-divert --package runit-init --add --no-rename \
        --divert /usr/sbin/update-rc.d.real /usr/sbin/update-rc.d
fi

#DEBHELPER#

exit 0

-------------------

$ cat runit-init.postrm 
#!/bin/sh

set -e

# need to use --rename here, with --no-rename the *.real diverted file will
# not be back and the system is left without helpers!
# *.real is granted to be there because of preinst
if [ "$1" = "remove" ] || [ "$1" = "abort-install" ] || [ "$1" = "disappear" ] 
; then
        dpkg-divert --package runit-init --remove --rename \
          --divert /usr/sbin/invoke-rc.d.real /usr/sbin/invoke-rc.d
        dpkg-divert --package runit-init --remove --rename \
          --divert /usr/sbin/service.real /usr/sbin/service
        dpkg-divert --package runit-init --remove --rename \
          --divert /usr/sbin/update-rc.d.real /usr/sbin/update-rc.d
fi

#the following can be removed as runit 2.1.2-41 is out of oldoldstable
if [ "abort-upgrade" = "$1" ] && dpkg --compare-versions "$2" lt 2.1.2-41; then
        dpkg-divert --package runit-init --remove --rename \
          --divert /usr/sbin/invoke-rc.d.real /usr/sbin/invoke-rc.d
        dpkg-divert --package runit-init --remove --rename \
          --divert /usr/sbin/service.real /usr/sbin/service
        dpkg-divert --package runit-init --remove --rename \
          --divert /usr/sbin/update-rc.d.real /usr/sbin/update-rc.d
fi

#DEBHELPER#

exit 0

--------------------

$ cat runit-init.install 
debian/contrib/helpers/invoke-rc.d    /usr/sbin
debian/contrib/helpers/service    /usr/sbin
debian/contrib/helpers/update-rc.d    /usr/sbin

---------------------

$ lintian -Ev --pedantic runit_2.1.2-41_amd64.changes 
N: Using profile debian/main.
N: Starting on group runit/2.1.2-41
N: Finished processing group runit/2.1.2-41
E: runit-init: diversion-for-unknown-file --no-rename/usr/sbin/invoke-rc.d 
preinst:19
E: runit-init: diversion-for-unknown-file --no-rename/usr/sbin/service 
preinst:21
E: runit-init: diversion-for-unknown-file --no-rename/usr/sbin/update-rc.d 
preinst:23
E: runit-init: orphaned-diversion --no-rename/usr/sbin/invoke-rc.d preinst
E: runit-init: orphaned-diversion --no-rename/usr/sbin/service preinst
E: runit-init: orphaned-diversion --no-rename/usr/sbin/update-rc.d preinst
E: runit-init: remove-of-unknown-diversion usr/sbin/invoke-rc.d postrm:10
E: runit-init: remove-of-unknown-diversion usr/sbin/invoke-rc.d postrm:20
E: runit-init: remove-of-unknown-diversion usr/sbin/service postrm:12
E: runit-init: remove-of-unknown-diversion usr/sbin/service postrm:22
E: runit-init: remove-of-unknown-diversion usr/sbin/update-rc.d postrm:14
E: runit-init: remove-of-unknown-diversion usr/sbin/update-rc.d postrm:24
W: runit-init: no-manual-page usr/sbin/invoke-rc.d
W: runit-init: no-manual-page usr/sbin/service
W: runit-init: no-manual-page usr/sbin/update-rc.d
X: runit source: debian-watch-does-not-check-gpg-signature
X: runit-run: systemd-service-file-missing-hardening-features 
lib/systemd/system/runit.service
N: 13 hints overridden (1 warning, 12 info)



[1] https://www.debian.org/doc/debian-policy/ap-pkg-diversions.html
[2] https://codesearch.debian.net/search?q=dpkg-divert+--no-rename&literal=1




-- Package-specific info:

-- System Information:
Debian Release: bullseye/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 5.7.0-1-amd64 (SMP w/4 CPU threads)
Kernel taint flags: TAINT_FIRMWARE_WORKAROUND, TAINT_OOT_MODULE, 
TAINT_UNSIGNED_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_US:en
Shell: /bin/sh linked to /bin/dash
Init: runit (via /run/runit.stopit)

Versions of packages dpkg depends on:
ii  libbz2-1.0   1.0.8-4
ii  libc6        2.31-11
ii  liblzma5     5.2.5-2
ii  libselinux1  3.1-3
ii  tar          1.34+dfsg-1
ii  zlib1g       1:1.2.11.dfsg-2

dpkg recommends no packages.

Versions of packages dpkg suggests:
ii  apt            2.2.2
pn  debsig-verify  <none>

-- no debconf information

Reply via email to