add hooks/copy-host-apt-sources-and-preferences
This commit is contained in:
parent
5a6883970a
commit
e523741610
2 changed files with 87 additions and 0 deletions
44
hooks/copy-host-apt-sources-and-preferences/customize00.pl
Executable file
44
hooks/copy-host-apt-sources-and-preferences/customize00.pl
Executable file
|
@ -0,0 +1,44 @@
|
|||
#!/usr/bin/perl
|
||||
#
|
||||
# This script makes sure that all packages that are installed both locally as
|
||||
# well as inside the chroot have the same version.
|
||||
#
|
||||
# It is implemented in Perl because there are no associative arrays in POSIX
|
||||
# shell.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
sub get_pkgs {
|
||||
my $root = shift;
|
||||
my %pkgs = ();
|
||||
open(my $fh, '-|', 'dpkg-query', "--root=$root", '--showformat',
|
||||
'${binary:Package}=${Version}\n', '--show')
|
||||
// die "cannot exec dpkg-query";
|
||||
while (my $line = <$fh>) {
|
||||
my ($pkg, $ver) = split(/=/, $line, 2);
|
||||
$pkgs{$pkg} = $ver;
|
||||
}
|
||||
close $fh;
|
||||
if ($? != 0) { die "failed to run dpkg-query" }
|
||||
return %pkgs;
|
||||
}
|
||||
|
||||
my %pkgs_local = get_pkgs('/');
|
||||
my %pkgs_chroot = get_pkgs($ARGV[0]);
|
||||
|
||||
my @diff = ();
|
||||
foreach my $pkg (keys %pkgs_chroot) {
|
||||
next unless exists $pkgs_local{$pkg};
|
||||
if ($pkgs_local{$pkg} ne $pkgs_chroot{$pkg}) {
|
||||
push @diff, $pkg;
|
||||
}
|
||||
}
|
||||
|
||||
if (scalar @diff > 0) {
|
||||
print STDERR "E: packages from the host and the chroot differ:\n";
|
||||
foreach my $pkg (@diff) {
|
||||
print STDERR "E: $pkg $pkgs_local{$pkg} $pkgs_chroot{$pkg}\n";
|
||||
}
|
||||
exit 1;
|
||||
}
|
43
hooks/copy-host-apt-sources-and-preferences/setup00.sh
Executable file
43
hooks/copy-host-apt-sources-and-preferences/setup00.sh
Executable file
|
@ -0,0 +1,43 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -eu
|
||||
|
||||
if [ "${MMDEBSTRAP_VERBOSITY:-1}" -ge 3 ]; then
|
||||
set -x
|
||||
fi
|
||||
|
||||
if [ -n "${MMDEBSTRAP_SUITE:-}" ]; then
|
||||
if [ "${MMDEBSTRAP_VERBOSITY:-1}" -ge 1 ]; then
|
||||
echo "W: using a non-empty suite name $MMDEBSTRAP_SUITE does not make sense with this hook and might select the wrong Essential:yes package set" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
rootdir="$1"
|
||||
|
||||
SOURCELIST="/etc/apt/sources.list"
|
||||
eval "$(apt-config shell SOURCELIST Dir::Etc::SourceList/f)"
|
||||
SOURCEPARTS="/etc/apt/sources.d/"
|
||||
eval "$(apt-config shell SOURCEPARTS Dir::Etc::SourceParts/d)"
|
||||
PREFERENCES="/etc/apt/preferences"
|
||||
eval "$(apt-config shell PREFERENCES Dir::Etc::Preferences/f)"
|
||||
PREFERENCESPARTS="/etc/apt/preferences.d/"
|
||||
eval "$(apt-config shell PREFERENCESPARTS Dir::Etc::PreferencesParts/d)"
|
||||
|
||||
for f in "$SOURCELIST" \
|
||||
"$SOURCEPARTS"/*.list \
|
||||
"$SOURCEPARTS"/*.sources \
|
||||
"$PREFERENCES" \
|
||||
"$PREFERENCESPARTS"/*; do
|
||||
[ -e "$f" ] || continue
|
||||
if [ -e "$rootdir/$f" ]; then
|
||||
if [ "${MMDEBSTRAP_VERBOSITY:-1}" -ge 2 ]; then
|
||||
echo "I: $f already exists in chroot, appending..." >&2
|
||||
fi
|
||||
echo >> "$rootdir/$f"
|
||||
fi
|
||||
cat "$f" >> "$rootdir/$f"
|
||||
if [ "${MMDEBSTRAP_VERBOSITY:-1}" -ge 3 ]; then
|
||||
echo "D: contents of $f inside the chroot:" >&2
|
||||
cat "$rootdir/$f" >&2
|
||||
fi
|
||||
done
|
Loading…
Reference in a new issue