After going a bit further down the road, I realized that the
before/after tarballs of /var/lib/dpkg/alternatives are not as useful
as I had assumed they would be: when installing non-trivial packages
(with a bunch of dependencies), they contain changes caused by a
number of different packages, whereas I need the changes of precisely
one package.

Hence, I think using a custom script to log update-alternatives
command lines is actually more useful:

$ head -50 custom-scripts/scripts-log-alternatives/*
==> custom-scripts/scripts-log-alternatives/pre_install_log_alternatives <==
#!/bin/sh

# Do nothing if the script already ran.
# The pre_install step can be run multiple times.
[ -e /usr/bin/update-alternatives.orig ] && exit 0

mv /usr/bin/update-alternatives /usr/bin/update-alternatives.orig
cat >/usr/bin/update-alternatives <<'EOT'
#!/bin/sh
echo "LOG-ALTERNATIVES: dpkg=${DPKG_MAINTSCRIPT_PACKAGE}:
piuparts=${PIUPARTS_OBJECTS}: $0 $@"
exec /usr/bin/update-alternatives.orig "$@"
EOT
chmod +x /usr/bin/update-alternatives

==> custom-scripts/scripts-log-alternatives/post_install_log_alternatives <==
#!/bin/sh

[ ! -e /usr/bin/update-alternatives.orig ] && exit 0
mv /usr/bin/update-alternatives.orig /usr/bin/update-alternatives

The resulting log lines look like this example:

    LOG-ALTERNATIVES: dpkg=vim: piuparts=vim:
/usr/bin/update-alternatives --install /usr/bin/vi vi
/usr/bin/vim.basic 30 --slave /usr/share/man/fr/man1/vi.1.gz
vi.fr.1.gz /usr/share/man/fr/man1/vim.1.gz --slave
/usr/share/man/it/man1/vi.1.gz vi.it.1.gz
/usr/share/man/it/man1/vim.1.gz --slave /usr/share/man/pl/man1/vi.1.gz
vi.pl.1.gz /usr/share/man/pl/man1/vim.1.gz --slave
/usr/share/man/ru/man1/vi.1.gz vi.ru.1.gz
/usr/share/man/ru/man1/vim.1.gz --slave /usr/share/man/ja/man1/vi.1.gz
vi.ja.1.gz /usr/share/man/ja/man1/vim.1.gz --slave
/usr/share/man/man1/vi.1.gz vi.1.gz /usr/share/man/man1/vim.1.gz

What do you think about this approach? Is that suitable for deployment
on piuparts.d.o?

On Sun, Jan 22, 2017 at 4:49 PM, Michael Stapelberg
<stapelb...@debian.org> wrote:
> On Sun, Jan 22, 2017 at 3:41 PM, Andreas Beckmann <a...@debian.org> wrote:
>> On 2017-01-22 14:43, Michael Stapelberg wrote:
>>> Thanks for the review! Answers inline:
>>
>> I'm thinking about making this more generally useful.
>>
>> For the piuparts command you want something like
>>
>>   piuparts ... --copy-file-from-chroot <filename-inside-chroot>
>> <filename-outside-chroot>
>>
>> I don't think exporting more than one file is feasible with a
>> master-slave setup.
>
> Why? The current patch exports any number of files, so clearly it’s
> technically possible. What makes you say that it’s not feasible?
>
>>
>> Then you could implement *anything* via custom scripts inside the
>> chroot, e.g. exporting the alternatives in
>> pre_install_export_alternatives, post_install_export_alternatives and
>> build a final single tarball in post_purge_export_alternatives.
>> Report the md5sum of the export file from post_purge_export_alternatives
>> (just in case something gets mixed up later on).
>> If you need extra packages in the chroot for these scripts, use
>> --fake-essential-packages
>>
>> These scripts would be given with an extra
>>   --scriptsdir /etc/piuparts/scripts-export-alternatives
>>
>> The slave should send the aux file immediately before the corresponding
>> log file and after sending logs for a section delete all unknown aux
>> files. aux files without log file should be deleted, not sent to master.
>>
>> master-bin/archive_old_logs should also handle old aux files.
>>
>> piuparts-slave should only pass the --copy-file-from-chroot option (or
>> however it is named) if the section is set up for exporting some stuff
>> The filename-inside-chroot should come from the section config.
>> The filename-outside-chroot should be generated by piuparts-slave, in
>> the package_version.extension format, the extension being something
>> general like .blob, don't assume a special format like .tar.xz.
>> By default this new feature should be disabled.
>
> This implies that the URL on piuparts.d.o would be something like
> /sid/libva1_1.7.3-2-aux.blob, correct? If so, I’m confused. How
> exactly would we deploy the alternatives-extraction on piuparts.d.o in
> such a way that other such steps can be added in the future?
>
>>
>> For the final patch I would probably want to see it as a series of
>> commits e.g. master-slave protocol support, piuparts support, glueing it
>> together.
>>
>> I expect this will be a project for buster, not stretch, I don't want to
>> hurry this into piuparts for stretch.
>
> Which version of piuparts is generally running on piuparts.d.o? I.e.,
> will the deployment of this change have to wait for the stretch
> release?
>
> --
> Best regards,
> Michael



-- 
Best regards,
Michael
From 3656788aaa8de08b87aadadea7b6fb59041521df Mon Sep 17 00:00:00 2001
From: Michael Stapelberg <stapelb...@debian.org>
Date: Sun, 22 Jan 2017 18:58:55 +0100
Subject: [PATCH] Add log-alternatives custom script

This script replaces /usr/bin/update-alternatives with a wrapper script
that logs its invocations, generating output like the following:

    LOG-ALTERNATIVES: dpkg=vim: piuparts=vim: /usr/bin/update-alternatives --install /usr/bin/vi vi /usr/bin/vim.basic 30 --slave /usr/share/man/fr/man1/vi.1.gz vi.fr.1.gz /usr/share/man/fr/man1/vim.1.gz --slave /usr/share/man/it/man1/vi.1.gz vi.it.1.gz /usr/share/man/it/man1/vim.1.gz --slave /usr/share/man/pl/man1/vi.1.gz vi.pl.1.gz /usr/share/man/pl/man1/vim.1.gz --slave /usr/share/man/ru/man1/vi.1.gz vi.ru.1.gz /usr/share/man/ru/man1/vim.1.gz --slave /usr/share/man/ja/man1/vi.1.gz vi.ja.1.gz /usr/share/man/ja/man1/vim.1.gz --slave /usr/share/man/man1/vi.1.gz vi.1.gz /usr/share/man/man1/vim.1.gz

Closes: #850917
---
 .../scripts-log-alternatives/post_install_log_alternatives  |  4 ++++
 .../scripts-log-alternatives/pre_install_log_alternatives   | 13 +++++++++++++
 2 files changed, 17 insertions(+)
 create mode 100755 custom-scripts/scripts-log-alternatives/post_install_log_alternatives
 create mode 100755 custom-scripts/scripts-log-alternatives/pre_install_log_alternatives

diff --git a/custom-scripts/scripts-log-alternatives/post_install_log_alternatives b/custom-scripts/scripts-log-alternatives/post_install_log_alternatives
new file mode 100755
index 00000000..0cf99e94
--- /dev/null
+++ b/custom-scripts/scripts-log-alternatives/post_install_log_alternatives
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+[ ! -e /usr/bin/update-alternatives.orig ] && exit 0
+mv /usr/bin/update-alternatives.orig /usr/bin/update-alternatives
diff --git a/custom-scripts/scripts-log-alternatives/pre_install_log_alternatives b/custom-scripts/scripts-log-alternatives/pre_install_log_alternatives
new file mode 100755
index 00000000..00bc0567
--- /dev/null
+++ b/custom-scripts/scripts-log-alternatives/pre_install_log_alternatives
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# Do nothing if the script already ran.
+# The pre_install step can be run multiple times.
+[ -e /usr/bin/update-alternatives.orig ] && exit 0
+
+mv /usr/bin/update-alternatives /usr/bin/update-alternatives.orig
+cat >/usr/bin/update-alternatives <<'EOT'
+#!/bin/sh
+echo "LOG-ALTERNATIVES: dpkg=${DPKG_MAINTSCRIPT_PACKAGE}: piuparts=${PIUPARTS_OBJECTS}: $0 $@"
+exec /usr/bin/update-alternatives.orig "$@"
+EOT
+chmod +x /usr/bin/update-alternatives
-- 
2.11.0

Reply via email to