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
suitable version of dpkg.
* 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

View file

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

View file

@ -27,6 +27,8 @@ bare summary.
-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
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
system.
In most cases, users will need to create a configuration file for
each different multistrap usage.
Example configuration:
[General]
@ -115,6 +120,22 @@ more information on getting specific packages from specific suites.
'Architecture' and 'directory' can be overridden on the command line.
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
C<aptsources> lists the sections which should be used to create the