* Add support for MultiArch configuration files and checks for a suitable version of dpkg. * Allow multiple keyring packages to be imported. (Closes: #635584)

git-svn-id: http://emdebian.org/svn/current@8055 563faec7-e20c-0410-992a-a66f704d0ccd
This commit is contained in:
codehelp 2011-07-29 13:12:05 +00:00
parent 04f394acd5
commit 99bbcbe436
10 changed files with 1304 additions and 650 deletions

5
debian/changelog vendored
View file

@ -1,8 +1,11 @@
multistrap (2.1.16) unstable; urgency=low
* Allow empty aptsources lines. (Closes: #633525)
* Add support for MultiArch configuration files and checks for a
suitable version of dpkg.
* Allow multiple keyring packages to be imported. (Closes: #635584)
-- Neil Williams <codehelp@debian.org> Mon, 11 Jul 2011 12:21:09 +0100
-- Neil Williams <codehelp@debian.org> Fri, 29 Jul 2011 13:36:42 +0200
multistrap (2.1.15) unstable; urgency=low

6
debian/control vendored
View file

@ -13,7 +13,7 @@ Vcs-Svn: http://www.emdebian.org/svn/current/
Package: multistrap
Section: admin
Architecture: all
Depends: ${perl:Depends}, ${misc:Depends}, apt,
Depends: ${perl:Depends}, ${misc:Depends}, apt (>= 0.8.15.2),
libconfig-auto-perl, libparse-debian-packages-perl
Recommends: emdebian-archive-keyring
Suggests: fakeroot
@ -32,7 +32,9 @@ Description: multiple repository bootstrap based on apt
packages have been unpacked but before being configured.
.
Unlike debootstrap, multistrap relies on working versions of
dpkg and apt outside the final filesystem.
dpkg and apt outside the final filesystem. If dpkg supports
MultiArch, foreign architecture libraries can be installed,
where available.
.
Multistrap supercedes emdebian-rootfs and replaces the previous
support for preparing root filesystems for specific machines and

1
debian/dirs vendored Normal file
View file

@ -0,0 +1 @@
/etc/multistrap.d/

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

44
examples/multiarch.conf Normal file
View file

@ -0,0 +1,44 @@
# Example multistrap configuration file for the sid shortcut.
[General]
arch=
directory=
# same as --tidy-up option if set to true
cleanup=true
# same as --no-auth option if set to true
# keyring packages listed in each debootstrap will
# still be installed.
noauth=false
# whether to add the /suite to be explicit about where apt
# needs to look for packages. Default is false.
explicitsuite=false
# extract all downloaded archives (default is true)
unpack=true
# enable MultiArch for the specified architectures
multiarch=armel armhf
# the order of sections is not important.
# the debootstrap option determines which repository
# is used to calculate the list of Priority: required packages.
debootstrap=Debian Foreign ForeignFloat
aptsources=Debian
[Debian]
packages=apt
source=http://ftp.uk.debian.org/debian
keyring=debian-archive-keyring
suite=sid
[Foreign]
packages=libgcc1
packages=libc6
architecture=armel
source=http://ftp.uk.debian.org/debian
keyring=debian-archive-keyring
suite=sid
[ForeignFloat]
packages=libgcc1 libc6
architecture=armhf
source=http://ftp.uk.debian.org/debian
keyring=debian-archive-keyring
suite=sid

View file

@ -35,7 +35,8 @@ use vars qw/ $progname $ourversion $dstrap $extra @aptsources $mirror
$omitpreinst @reinstall $tgzname %uniq %required $check @check %uniq
$explicit_suite $allow_recommends %omitdebsrc @dsclist @sectoutput
%flatfile %important $addimportant @debconf $hookdir %hooks
$warn_count /;
$warn_count $use_shortcut @foreignarches $olddpkg
%foreignpkgs /;
setlocale(LC_MESSAGES, "");
textdomain("multistrap");
@ -43,7 +44,7 @@ $progname = basename($0);
$ourversion = &our_version();
$unpack = "true";
%omitdebsrc=();
%foreignpkgs=();
while( @ARGV ) {
$_= shift( @ARGV );
last if m/^--$/;
@ -53,6 +54,8 @@ while( @ARGV ) {
} elsif (/^(-\?|-h|--help|--version)$/) {
&usageversion();
exit( 0 );
} elsif (/^(-s|--shortcut)$/) {
$use_shortcut = shift(@ARGV);
} elsif (/^(-f|--file)$/) {
$file = shift(@ARGV);
} elsif (/^(-a|--arch)$/) {
@ -74,6 +77,16 @@ while( @ARGV ) {
die "$progname: "._g("Unknown option")." $_.\n";
}
}
if (defined $use_shortcut) {
my $short = "/usr/share/multistrap/".$use_shortcut.".conf";
if (-f $short) {
$file = $short;
}
$short = "/etc/multistrap.d/".$use_shortcut.".conf";
if (-f $short) {
$file = $short;
}
}
$msg = sprintf (_g("Need a configuration file - use %s -f\n"), $progname);
die ($msg)
if (not defined $file);
@ -160,6 +173,7 @@ if (not -d "$dir") {
}
$dir = realpath ($dir);
$dir .= ($dir =~ m:/$:) ? '' : "/";
# add a do_it wrapper to check the retval of system
system ("mkdir -p ${dir}${cachedir}") if (not -d "${dir}${cachedir}");
system ("mkdir -p ${dir}${libdir}") if (not -d "${dir}${libdir}");
system ("mkdir -p ${dir}${dpkgdir}") if (not -d "${dir}${dpkgdir}");
@ -194,7 +208,19 @@ if (not -d "${dir}etc/network") {
if (not -d "${dir}dev") {
mkdir "${dir}dev";
}
if ($olddpkg != 0) {
if (not -d "${dir}etc/dpkg/dpkg.cfg.d/") {
system ("mkdir -p ${dir}etc/dpkg/dpkg.cfg.d/");
}
if (not -f "${dir}etc/dpkg/dpkg.cfg.d/multiarch") {
open (MA, ">${dir}etc/dpkg/dpkg.cfg.d/multiarch");
foreach my $farch (@foreignarches) {
print MA "foreign-architecture $farch\n";
}
close (MA);
}
}
die;
&guard_lib64($dir);
system ("rm -rf ${dir}etc/apt/sources.list.d/*");
@ -280,15 +306,13 @@ if ((defined $k) and (not defined $noauth)) {
}
foreach my $gpg (@files) {
next if ($gpg =~ /removed/);
system ("gpg --no-default-keyring ".
$retval = system ("gpg --no-default-keyring ".
"--homedir=${dir}/etc/apt/trusted.gpg.d/ ".
"--keyring=multistrap.gpg ".
" --import ${xdir}/usr/share/keyrings/${gpg} 2>/dev/null");
if (-f "${dir}/etc/apt/trusted.gpg.d/multistrap.gpg") {
system ("cp ${dir}/etc/apt/trusted.gpg.d/multistrap.gpg ${dir}/etc/apt/trusted.gpg.d/trustdb.gpg");
} else {
die (_g("Secure Apt handling failed - try without authentication."));
}
" --import ${xdir}/usr/share/keyrings/${gpg}");
$retval /= 256;
die (_g("Secure Apt handling failed - try without authentication."))
if ($retval != 0);
}
system ("rm -rf ${xdir}");
}
@ -370,7 +394,7 @@ if ((defined $setupsh) and (-x $setupsh)) {
$warn_count++;
}
}
# run first set of hooks
# run first set of hooks - probably unnecessary re setupscript.
&run_download_hooks(sort @{$hooks{'D'}}) if (defined $hooks{'D'});
my $err = &native if (not defined ($foreign) and $unpack eq "true");
if (defined $err and $err != 0) {
@ -1012,6 +1036,9 @@ cleanup=true
noauth=false
# extract all downloaded archives (default is true)
unpack=true
# enable MultiArch for the specified architectures
# default is empty
multiarch=
# aptsources is a list of sections to be used for downloading packages
# and lists and placed in the /etc/apt/sources.list.d/multistrap.sources.list
# of the target. Order is not important
@ -1046,6 +1073,7 @@ will be created - it is not packed into a .tgz once complete.
}
sub cascade {
$olddpkg = &check_multiarch_dpkg;
$file = shift;
$config = Config::Auto::parse($file, format => 'ini');
if (not defined $config or (scalar keys %$config) == 0) {
@ -1108,7 +1136,14 @@ sub cascade {
push (@{$hooks{'N'}}, $fl) if ($hf =~ /^native/);
}
}
my @d = split(' ', lc($keys{$section}{'debootstrap'}));
my @ma=();
if ($olddpkg != 0) {
@ma = split(' ',lc($keys{$section}{'multiarch'}))
if (defined $keys{$section}{'multiarch'});
}
push @foreignarches, @ma;
my @d=();
@d = split(' ', lc($keys{$section}{'debootstrap'}));
push @debootstrap, @d;
my @b = split(' ', lc($keys{$section}{'bootstrap'}))
if (defined $keys{$section}{'bootstrap'});
@ -1138,10 +1173,32 @@ sub cascade {
# don't set suite or component if URL is of apt-ftparchive trailing-slash form
# regexp is: optional string in '[]', string without '[' or ']', string ending in '/'
$flatfile{$section}++ if (($sources{$section} =~ /^(\[.*\] )*[^\[\]]+ .+\/$/));
if (ref ($keys{$section}{'packages'}) eq 'ARRAY') {
$packages{$section}=join(' ', @{$keys{$section}{'packages'}}) if (not exists $packages{$section});
if (exists $keys{$section}{'architecture'}) {
my $frgn_arch = $keys{$section}{'architecture'};
my @tmp=();
if (ref ($keys{$section}{'packages'}) eq 'ARRAY') {
foreach my $p (@{$keys{$section}{'packages'}}) {
push @tmp, "$p:$frgn_arch";
}
} else {
foreach my $p (split(' ', $keys{$section}{'packages'})) {
push @tmp, "$p:$frgn_arch";
}
}
if ($olddpkg == 0) {
$packages{$section} = join(' ', @tmp);
} else {
my $dpkgmsg = sprintf (_g("ERR: Unsupportable option: 'architecture'. ".
"Current dpkg version does not support MultiArch. ".
"Packages for '%s' have been ignored.\n"), $section);
warn $dpkgmsg;
}
} else {
$packages{$section}=join(' ', $keys{$section}{'packages'}) if (not exists $packages{$section});
if (ref ($keys{$section}{'packages'}) eq 'ARRAY') {
$packages{$section}=join(' ', @{$keys{$section}{'packages'}}) if (not exists $packages{$section});
} else {
$packages{$section}=join(' ', $keys{$section}{'packages'}) if (not exists $packages{$section});
}
}
$suites{$section}=$keys{$section}{'suite'}
if (not exists $suites{$section} and not exists $flatfile{$section});
@ -1170,6 +1227,39 @@ sub cascade {
@extrapkgs = keys %uniq;
}
# returns zero on success, non-zero on fail
sub check_multiarch_dpkg {
my $distro;
my $version;
my $retval = system ("which lsb_release >/dev/null");
$retval /= 256;
if ($retval == 1) {
# have to assume this is Debian, not Ubuntu
$distro = "debian";
} else {
$distro = lc(`lsb_release -is`);
chomp ($distro);
}
if ($distro eq "debian") {
$version = `dpkg -l dpkg|grep dpkg`;
chomp ($version);
$version =~ s/^ii[ ]+dpkg[ ]+([0-9\.]+)[ ]+.+$/$1/;
# fill in the version which gets this support in Debian
$retval = system("dpkg --compare-versions $version '>=' 1.20");
$retval /= 256;
return $retval;
} else {
# only Ubuntu explicitly supported here
# looking for >= 1.16.0~ubuntu4
$version = `dpkg -l dpkg|grep dpkg`;
chomp ($version);
$version =~ s/^ii[ ]+dpkg[ ]+([^ ]+)[ ]+.+$/$1/;
$retval = system("dpkg --compare-versions $version '>=' 1.16.0~ubuntu4");
$retval /= 256;
return $retval;
}
}
sub _g {
return gettext(shift);
}
@ -1272,10 +1362,16 @@ sub dump_config {
print "additional:\t\t$plural".join (", ", sort @extrapkgs)."\n" if (scalar @extrapkgs > 0);
print "reinstall:\t\t".join (", ", sort (@reinstall))."\n" if (scalar @reinstall > 0);
if (defined $arch and $arch ne "") {
printf ("arch:\t\t\t"._g("Architecture to download: %s\n"), $arch);
printf ("Architecture:\t\t"._g("Architecture to download: %s\n"), $arch);
} else {
$msg .= sprintf(_g("Cannot determine architecture from '%s'.\n"), $file);
}
if ($olddpkg != 0) {
printf "MultiArch:\t\t%s\n",_g("Currently installed dpkg does not support MultiArch.");
} else {
$plural = ngettext("Foreign architecture", "Foreign architectures", scalar @foreignarches);
printf ("MultiArch:\t\t%s: %s\n", $plural, join(" ", sort @foreignarches));
}
if (defined $dir and $dir ne "") {
printf ("dir:\t\t\t"._g("Output directory: '%s'\n"), $dir);
} else {

View file

@ -67,6 +67,9 @@ Example configuration:
# whether to add the /suite to be explicit about where apt
# needs to look for packages. Default is false.
explicitsuite=false
# enable MultiArch for the specified architectures
# default is empty
multiarch=
# aptsources is a list of sections to be used
# the /etc/apt/sources.list.d/multistrap.sources.list
# of the target. Order is not important
@ -675,4 +678,42 @@ people on the debian-embedded@lists.debian.org mailing list and
does not parse correctly. You would need to put the C<--simulate> output
on a pastebin website and put the URL in your message.
=head1 MultiArch support
To enable multiarch inside a chroot, there is no need to set the second
architecture in C<apt>, C<apt> will ask C<dpkg> which will look in
F</etc/dpkg/dpkg.cfg> or F</etc/dpkg/dpkg.cfg.d/> and then retrieve the
Packages data for each architecture specified using the option:
foreign-architecture armel
For multiple architectures, specify the option once for each
architecture.
Using the MultiArch option in the C<General> section of your C<multistrap>
configuration file will create a file F</etc/dpkg/dpkg.cfg.d/multiarch>
which will implement this support. This option can be repeated (for
compatibility with how dpkg works) or as a space-delimited list of
architectures on a single line.
See also http://wiki.debian.org/Multiarch/
[General]
...
MultiArch=armel armhf
Each Section will install packages from the base architecture unless
the C<Architecture> option is specified for particular sections.
[Foreign]
packages=libgcc1 libc6
architecture=armel
source=http://ftp.uk.debian.org/debian
keyring=debian-archive-keyring
suite=sid
In the C<--simulate> output, the architecture(s) specified in the
MultiArch option will be listed under the "Foreign architectures"
listing.
=cut