forked from josch/mmdebstrap
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