Add support for shortcuts to use configuration files in known locations like /usr/share/multistrap and /etc/multistrap.d/

git-svn-id: http://emdebian.org/svn/current@8057 563faec7-e20c-0410-992a-a66f704d0ccd
This commit is contained in:
codehelp 2011-07-30 08:31:45 +00:00
parent 3b4432fd7c
commit 88c7c4b40b
3 changed files with 85 additions and 43 deletions

4
debian/changelog vendored
View file

@ -4,8 +4,10 @@ multistrap (2.1.16) unstable; urgency=low
* Add support for MultiArch configuration files and checks for a * Add support for MultiArch configuration files and checks for a
suitable version of dpkg. suitable version of dpkg.
* Allow multiple keyring packages to be imported. (Closes: #635584) * Allow multiple keyring packages to be imported. (Closes: #635584)
* Add support for shortcuts to use configuration files in known
locations like /usr/share/multistrap and /etc/multistrap.d/
-- Neil Williams <codehelp@debian.org> Fri, 29 Jul 2011 13:36:42 +0200 -- Neil Williams <codehelp@debian.org> Sat, 30 Jul 2011 09:38:38 +0200
multistrap (2.1.15) unstable; urgency=low multistrap (2.1.15) unstable; urgency=low

View file

@ -52,7 +52,7 @@ while( @ARGV ) {
unshift(@ARGV,$_); unshift(@ARGV,$_);
last; last;
} elsif (/^(-\?|-h|--help|--version)$/) { } elsif (/^(-\?|-h|--help|--version)$/) {
&usageversion(); &usageversion();
exit( 0 ); exit( 0 );
} elsif (/^(-s|--shortcut)$/) { } elsif (/^(-s|--shortcut)$/) {
$use_shortcut = shift(@ARGV); $use_shortcut = shift(@ARGV);
@ -79,13 +79,9 @@ while( @ARGV ) {
} }
if (defined $use_shortcut) { if (defined $use_shortcut) {
my $short = "/usr/share/multistrap/".$use_shortcut.".conf"; my $short = "/usr/share/multistrap/".$use_shortcut.".conf";
if (-f $short) { $file = $short if (-f $short);
$file = $short;
}
$short = "/etc/multistrap.d/".$use_shortcut.".conf"; $short = "/etc/multistrap.d/".$use_shortcut.".conf";
if (-f $short) { $file = $short if (-f $short);
$file = $short;
}
} }
$msg = sprintf (_g("Need a configuration file - use %s -f\n"), $progname); $msg = sprintf (_g("Need a configuration file - use %s -f\n"), $progname);
die ($msg) die ($msg)
@ -116,6 +112,7 @@ if (defined $omitrequired and defined $addimportant) {
if (defined $dryrun) { if (defined $dryrun) {
warn("\n"); warn("\n");
&dump_config; &dump_config;
exit 0;
} }
exit (7); exit (7);
} }
@ -129,8 +126,10 @@ foreach my $line (@aptsources) {
$uniq{$line}++; $uniq{$line}++;
} }
@aptsources=sort keys %uniq; @aptsources=sort keys %uniq;
if (defined $dryrun) {
&dump_config if (defined $dryrun); &dump_config;
exit 0;
}
if (not defined $dir or not defined $arch) { if (not defined $dir or not defined $arch) {
&dump_config; &dump_config;
exit 3; exit 3;
@ -165,33 +164,27 @@ if ($dir =~ /^$/) {
my $msg = _g("No directory specified!"); my $msg = _g("No directory specified!");
die "$progname: $msg\n"; die "$progname: $msg\n";
} }
if (not -d "$dir") { &mkdir_fatal ($dir);
my $ret = system ("mkdir -p $dir");
$ret /= 256 if (defined $ret);
my $msg = sprintf (_g("Unable to create directory '%s'"),$dir);
die "$progname: $msg\n" if ($ret != 0);
}
$dir = realpath ($dir); $dir = realpath ($dir);
$dir .= ($dir =~ m:/$:) ? '' : "/"; $dir .= ($dir =~ m:/$:) ? '' : "/";
# add a do_it wrapper to check the retval of system system_fatal ("mkdir -p ${dir}${cachedir}") if (not -d "${dir}${cachedir}");
system ("mkdir -p ${dir}${cachedir}") if (not -d "${dir}${cachedir}"); system_fatal ("mkdir -p ${dir}${libdir}") if (not -d "${dir}${libdir}");
system ("mkdir -p ${dir}${libdir}") if (not -d "${dir}${libdir}"); system_fatal ("mkdir -p ${dir}${dpkgdir}") if (not -d "${dir}${dpkgdir}");
system ("mkdir -p ${dir}${dpkgdir}") if (not -d "${dir}${dpkgdir}"); system_fatal ("mkdir -p ${dir}etc/apt/sources.list.d/")
system ("mkdir -p ${dir}etc/apt/sources.list.d/")
if (not -d "${dir}etc/apt/sources.list.d/"); if (not -d "${dir}etc/apt/sources.list.d/");
system ("mkdir -p ${dir}etc/apt/trusted.gpg.d/") system_fatal ("mkdir -p ${dir}etc/apt/trusted.gpg.d/")
if (not -d "${dir}etc/apt/trusted.gpg.d/"); if (not -d "${dir}etc/apt/trusted.gpg.d/");
system ("mkdir -p ${dir}etc/apt/preferences.d/") system_fatal ("mkdir -p ${dir}etc/apt/preferences.d/")
if (not -d "${dir}etc/apt/preferences.d/"); if (not -d "${dir}etc/apt/preferences.d/");
system ("mkdir -p ${dir}usr/share/info/") system_fatal ("mkdir -p ${dir}usr/share/info/")
if (not -d "${dir}usr/share/info/"); if (not -d "${dir}usr/share/info/");
system ("touch ${dir}usr/share/info/dir"); system_fatal ("touch ${dir}usr/share/info/dir");
@dirs = qw/ alternatives info parts updates/; @dirs = qw/ alternatives info parts updates/;
@touch = qw/ diversions statoverride status lock/; @touch = qw/ diversions statoverride status lock/;
foreach my $dpkgd (@dirs) { foreach my $dpkgd (@dirs) {
if (not -d "${dir}${dpkgdir}$dpkgd") { if (not -d "${dir}${dpkgdir}$dpkgd") {
mkdir "${dir}${dpkgdir}$dpkgd"; mkdir_fatal ("${dir}${dpkgdir}$dpkgd");
} }
} }
foreach my $file (@touch) { foreach my $file (@touch) {
@ -202,15 +195,15 @@ utime(time, time, "${dir}etc/shells") or
(open(F, ">${dir}etc/shells") && close F ); (open(F, ">${dir}etc/shells") && close F );
if (not -d "${dir}etc/network") { if (not -d "${dir}etc/network") {
mkdir "${dir}etc/network"; mkdir_fatal ("${dir}etc/network");
} }
if (not -d "${dir}dev") { if (not -d "${dir}dev") {
mkdir "${dir}dev"; mkdir_fatal ("${dir}dev");
} }
if ($olddpkg != 0) { if ($olddpkg == 0) {
if (not -d "${dir}etc/dpkg/dpkg.cfg.d/") { if (not -d "${dir}etc/dpkg/dpkg.cfg.d/") {
system ("mkdir -p ${dir}etc/dpkg/dpkg.cfg.d/"); system_fatal ("mkdir -p ${dir}etc/dpkg/dpkg.cfg.d/");
} }
if (not -f "${dir}etc/dpkg/dpkg.cfg.d/multiarch") { if (not -f "${dir}etc/dpkg/dpkg.cfg.d/multiarch") {
open (MA, ">${dir}etc/dpkg/dpkg.cfg.d/multiarch"); open (MA, ">${dir}etc/dpkg/dpkg.cfg.d/multiarch");
@ -220,28 +213,28 @@ if ($olddpkg != 0) {
close (MA); close (MA);
} }
} }
die;
&guard_lib64($dir); &guard_lib64($dir);
system ("rm -rf ${dir}etc/apt/sources.list.d/*"); system_fatal ("rm -rf ${dir}etc/apt/sources.list.d/*");
unlink ("${dir}etc/apt/sources.list") unlink ("${dir}etc/apt/sources.list")
if (-f "${dir}etc/apt/sources.list"); if (-f "${dir}etc/apt/sources.list");
foreach $repo (sort keys %suites) { foreach $repo (sort keys %suites) {
if (not -e "${dir}${cachedir}") { if (not -e "${dir}${cachedir}") {
mkdir "${dir}${cachedir}"; mkdir_fatal ("${dir}${cachedir}");
} }
if (not -e "$dir/${libdir}lists") { if (not -e "$dir/${libdir}lists") {
mkdir "$dir/${libdir}lists"; mkdir_fatal ("$dir/${libdir}lists");
} }
if (not -e "$dir/${libdir}lists/partial") { if (not -e "$dir/${libdir}lists/partial") {
mkdir "$dir/${libdir}lists/partial"; mkdir_fatal ("$dir/${libdir}lists/partial");
} }
if (not -e "$dir/${cachedir}archives") { if (not -e "$dir/${cachedir}archives") {
mkdir "$dir/${cachedir}archives"; mkdir_fatal ("$dir/${cachedir}archives");
} }
if (not -e "$dir/${cachedir}archives/partial") { if (not -e "$dir/${cachedir}archives/partial") {
mkdir "$dir/${cachedir}archives/partial"; mkdir_fatal ("$dir/${cachedir}archives/partial");
} }
} }
foreach my $aptsrc (@debootstrap) { foreach my $aptsrc (@debootstrap) {
@ -309,18 +302,23 @@ if ((defined $k) and (not defined $noauth)) {
$retval = system ("gpg --no-default-keyring ". $retval = system ("gpg --no-default-keyring ".
"--homedir=${dir}/etc/apt/trusted.gpg.d/ ". "--homedir=${dir}/etc/apt/trusted.gpg.d/ ".
"--keyring=multistrap.gpg ". "--keyring=multistrap.gpg ".
" --import ${xdir}/usr/share/keyrings/${gpg}"); " --import ${xdir}/usr/share/keyrings/${gpg} 2>/dev/null");
$retval /= 256; $retval /= 256;
die (_g("Secure Apt handling failed - try without authentication.")) die (_g("Secure Apt handling failed - try without authentication."))
if ($retval != 0); if ($retval != 0);
} }
if (-f "${dir}/etc/apt/trusted.gpg.d/multistrap.gpg") {
system_fatal ("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."));
}
system ("rm -rf ${xdir}"); system ("rm -rf ${xdir}");
} }
} }
$config_str = ''; $config_str = '';
$config_str .= " -o Apt::Architecture=$arch"; $config_str .= " -o Apt::Architecture=$arch";
$config_str .= " -o Dir::Etc::TrustedParts=${dir}${etcdir}trusted.gpg.d"; $config_str .= " -o Dir::Etc::TrustedParts=${dir}${etcdir}trusted.gpg.d";
$config_str .= " -o Dir::Etc::Trusted=${dir}${etcdir}trusted.gpg"; $config_str .= " -o Dir::Etc::Trusted=${dir}${etcdir}trusted.gpg.d/trusted.gpg";
$config_str .= " -o Apt::Get::AllowUnauthenticated=true" $config_str .= " -o Apt::Get::AllowUnauthenticated=true"
if (defined $noauth); if (defined $noauth);
$config_str .= " -o Apt::Get::Download-Only=true"; $config_str .= " -o Apt::Get::Download-Only=true";
@ -578,7 +576,7 @@ sub force_unpack {
$src =~ s/ \(.*\)//; $src =~ s/ \(.*\)//;
$src = $pkg if ($src eq ""); $src = $pkg if ($src eq "");
push @dsclist, $src; push @dsclist, $src;
mkdir ("./tmp"); mkdir_fatal ("./tmp");
my $tmpdir = `mktemp -p ./tmp -d -t multistrap.XXXXXX`; my $tmpdir = `mktemp -p ./tmp -d -t multistrap.XXXXXX`;
chomp ($tmpdir); chomp ($tmpdir);
my $datatar = `LC_ALL=C dpkg -X ./${cachedir}archives/$deb ${dir}`; my $datatar = `LC_ALL=C dpkg -X ./${cachedir}archives/$deb ${dir}`;
@ -646,7 +644,7 @@ sub force_unpack {
close (SEED); close (SEED);
my $sfile = basename($seed); my $sfile = basename($seed);
printf (_g("I: Copying debconf preseed data to %s.\n"), $sfile); printf (_g("I: Copying debconf preseed data to %s.\n"), $sfile);
mkdir ("${dir}/tmp/preseeds"); mkdir_fatal ("${dir}/tmp/preseeds");
open (SEED, ">${dir}tmp/preseeds/$sfile"); open (SEED, ">${dir}tmp/preseeds/$sfile");
print SEED @s; print SEED @s;
close (SEED); close (SEED);
@ -736,7 +734,7 @@ sub guard_lib64 {
chdir ("$dir"); chdir ("$dir");
if ($host eq 'i386' and $arch eq 'amd64') { if ($host eq 'i386' and $arch eq 'amd64') {
printf (_g("I: Replaced ./lib64 -> /lib symbolic link with new %slib64 directory.\n"), $dir); printf (_g("I: Replaced ./lib64 -> /lib symbolic link with new %slib64 directory.\n"), $dir);
mkdir ("${dir}lib64"); mkdir_fatal ("${dir}lib64");
} else { } else {
printf (_g("I: Setting %slib64 -> %slib symbolic link.\n"), $dir, $dir); printf (_g("I: Setting %slib64 -> %slib symbolic link.\n"), $dir, $dir);
symlink "./lib", "lib64"; symlink "./lib", "lib64";
@ -1192,6 +1190,7 @@ sub cascade {
"Current dpkg version does not support MultiArch. ". "Current dpkg version does not support MultiArch. ".
"Packages for '%s' have been ignored.\n"), $section); "Packages for '%s' have been ignored.\n"), $section);
warn $dpkgmsg; warn $dpkgmsg;
$warn_count++;
} }
} else { } else {
if (ref ($keys{$section}{'packages'}) eq 'ARRAY') { if (ref ($keys{$section}{'packages'}) eq 'ARRAY') {
@ -1247,6 +1246,7 @@ sub check_multiarch_dpkg {
# fill in the version which gets this support in Debian # fill in the version which gets this support in Debian
$retval = system("dpkg --compare-versions $version '>=' 1.20"); $retval = system("dpkg --compare-versions $version '>=' 1.20");
$retval /= 256; $retval /= 256;
# returns 1 for Debian.
return $retval; return $retval;
} else { } else {
# only Ubuntu explicitly supported here # only Ubuntu explicitly supported here
@ -1260,6 +1260,26 @@ sub check_multiarch_dpkg {
} }
} }
sub system_fatal {
my $cmd = shift;
my $retval = system ("$cmd");
my $err = $!;
$retval /= 256;
return if ($retval == 0);
my $msg = sprintf(_g("ERR: system call failed: '%s' %s"), $cmd, $err);
die ("$msg\n");
}
sub mkdir_fatal {
my $d = shift;
if (not -d "$d") {
my $ret = system ("mkdir -p $d");
$ret /= 256 if (defined $ret);
my $msg = sprintf (_g("Unable to create directory '%s'"),$d);
die "$progname: $msg\n" if ($ret != 0);
}
}
sub _g { sub _g {
return gettext(shift); return gettext(shift);
} }
@ -1415,5 +1435,4 @@ sub dump_config {
warn ("\n$msg\n"); warn ("\n$msg\n");
exit 1; exit 1;
} }
exit 0;
} }

View file

@ -27,6 +27,8 @@ bare summary.
-f|--file - configuration file for multistrap [required] -f|--file - configuration file for multistrap [required]
-s|--shortcut - shortened version of -f for files in known locations.
--tidy-up - remove apt cache data, downloaded Packages files and --tidy-up - remove apt cache data, downloaded Packages files and
the apt package cache. Same as cleanup=true. the apt package cache. Same as cleanup=true.
@ -51,6 +53,9 @@ The aim is to create a complete bootstrap / root filesystem with
all packages installed and configured, instead of just the base all packages installed and configured, instead of just the base
system. system.
In most cases, users will need to create a configuration file for
each different multistrap usage.
Example configuration: Example configuration:
[General] [General]
@ -115,6 +120,22 @@ more information on getting specific packages from specific suites.
'Architecture' and 'directory' can be overridden on the command line. 'Architecture' and 'directory' can be overridden on the command line.
Some other general options also have command line options. Some other general options also have command line options.
=head1 Shortcuts
In a similar manner to C<debootstrap>, C<multistrap> supports referring
to configuration files in known locations by shortcuts. When using the
C<--shortcut> option, C<multistrap> will look for files in
F</usr/share/multistrap> and then F</etc/multistrap.d/>, appending a
'.conf' suffix to the specified shortcut.
These two commands are equivalent:
$ sudo multistrap -s sid
$ sudo multistrap -f /usr/share/multistrap/sid.conf
Note that C<multistrap> will still fail if the configuration file
itself does not set the directory or the architecture.
=head1 Repositories =head1 Repositories
C<aptsources> lists the sections which should be used to create the C<aptsources> lists the sections which should be used to create the