|
|
|
@ -23,7 +23,7 @@
|
|
|
|
|
use strict;
|
|
|
|
|
use warnings;
|
|
|
|
|
|
|
|
|
|
our $VERSION = '1.2.5';
|
|
|
|
|
our $VERSION = '1.3.0';
|
|
|
|
|
|
|
|
|
|
use English;
|
|
|
|
|
use Getopt::Long;
|
|
|
|
@ -2072,7 +2072,7 @@ sub run_setup() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# write /etc/apt/sources.list and files in /etc/apt/sources.list.d/
|
|
|
|
|
{
|
|
|
|
|
if (scalar @{ $options->{sourceslists} } > 0) {
|
|
|
|
|
my $firstentry = $options->{sourceslists}->[0];
|
|
|
|
|
# if the first sources.list entry is of one-line type and without
|
|
|
|
|
# explicit filename, then write out an actual /etc/apt/sources.list
|
|
|
|
@ -2275,8 +2275,19 @@ sub run_update() {
|
|
|
|
|
CHDIR => $options->{root},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
info "running apt-get update...";
|
|
|
|
|
run_apt_progress($aptopts);
|
|
|
|
|
# Maybe "apt-get update" was already run in the setup hook? If yes, skip
|
|
|
|
|
# running it here. We are overly strict on purpose because better to run it
|
|
|
|
|
# twice on accident than not at all.
|
|
|
|
|
if ( !-d "$options->{root}/var/lib/apt/lists/auxfiles"
|
|
|
|
|
|| !-d "$options->{root}/var/lib/apt/lists/partial"
|
|
|
|
|
|| !-e "$options->{root}/var/lib/apt/lists/lock"
|
|
|
|
|
|| !-e "$options->{root}/var/cache/apt/pkgcache.bin"
|
|
|
|
|
|| !-e "$options->{root}/var/cache/apt/srcpkgcache.bin") {
|
|
|
|
|
info "running apt-get update...";
|
|
|
|
|
run_apt_progress($aptopts);
|
|
|
|
|
} else {
|
|
|
|
|
info "skipping apt-get update because it was already run";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# check if anything was downloaded at all
|
|
|
|
|
{
|
|
|
|
@ -2287,11 +2298,36 @@ sub run_update() {
|
|
|
|
|
);
|
|
|
|
|
close $fh;
|
|
|
|
|
if ($indextargets eq '') {
|
|
|
|
|
if ($verbosity_level >= 1) {
|
|
|
|
|
0 == system('apt-cache', 'policy')
|
|
|
|
|
or error "apt-cache failed: $?";
|
|
|
|
|
warning("apt-get indextargets output is empty");
|
|
|
|
|
if (scalar @{ $options->{sourceslists} } == 0) {
|
|
|
|
|
warning "no known apt sources.list entry";
|
|
|
|
|
}
|
|
|
|
|
for my $list (@{ $options->{sourceslists} }) {
|
|
|
|
|
if (defined $list->{fname}) {
|
|
|
|
|
info("Filename: $list->{fname}");
|
|
|
|
|
}
|
|
|
|
|
info("Type: $list->{type}");
|
|
|
|
|
info("Content:");
|
|
|
|
|
for my $line (split "\n", $list->{content}) {
|
|
|
|
|
info(" $line");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
open(my $fh, '-|', 'apt-cache', 'policy')
|
|
|
|
|
// error "failed to fork(): $!";
|
|
|
|
|
while (my $line = <$fh>) {
|
|
|
|
|
chomp $line;
|
|
|
|
|
info $line;
|
|
|
|
|
}
|
|
|
|
|
close $fh;
|
|
|
|
|
my $msg
|
|
|
|
|
= "apt-get update did not find any indices "
|
|
|
|
|
. "for architecture '$options->{nativearch}' in ";
|
|
|
|
|
if (length $options->{suite}) {
|
|
|
|
|
$msg .= "suite '$options->{suite}'";
|
|
|
|
|
} else {
|
|
|
|
|
$msg .= "the configured apt sources";
|
|
|
|
|
}
|
|
|
|
|
error "apt-get update didn't download anything";
|
|
|
|
|
error $msg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2341,18 +2377,7 @@ sub run_download() {
|
|
|
|
|
info "nothing to download -- skipping...";
|
|
|
|
|
return ([], \@cached_debs);
|
|
|
|
|
}
|
|
|
|
|
my @apt_argv = ('install');
|
|
|
|
|
for my $incl (@{ $options->{include} }) {
|
|
|
|
|
for my $pkg (split /[,\s]+/, $incl) {
|
|
|
|
|
# strip leading and trailing whitespace
|
|
|
|
|
$pkg =~ s/^\s+|\s+$//g;
|
|
|
|
|
# skip if the remainder is an empty string
|
|
|
|
|
if ($pkg eq '') {
|
|
|
|
|
next;
|
|
|
|
|
}
|
|
|
|
|
push @apt_argv, $pkg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
my @apt_argv = ('install', @{ $options->{include} });
|
|
|
|
|
|
|
|
|
|
@dl_debs = run_apt_download_progress({
|
|
|
|
|
APT_ARGV => [@apt_argv],
|
|
|
|
@ -2880,20 +2905,9 @@ sub run_essential() {
|
|
|
|
|
sub run_install() {
|
|
|
|
|
my $options = shift;
|
|
|
|
|
|
|
|
|
|
my %pkgs_to_install;
|
|
|
|
|
for my $incl (@{ $options->{include} }) {
|
|
|
|
|
for my $pkg (split /[,\s]+/, $incl) {
|
|
|
|
|
# strip leading and trailing whitespace
|
|
|
|
|
$pkg =~ s/^\s+|\s+$//g;
|
|
|
|
|
# skip if the remainder is an empty string
|
|
|
|
|
if ($pkg eq '') {
|
|
|
|
|
next;
|
|
|
|
|
}
|
|
|
|
|
$pkgs_to_install{$pkg} = ();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
my @pkgs_to_install = (@{ $options->{include} });
|
|
|
|
|
if ($options->{variant} eq 'buildd') {
|
|
|
|
|
$pkgs_to_install{'build-essential'} = ();
|
|
|
|
|
push @pkgs_to_install, 'build-essential';
|
|
|
|
|
}
|
|
|
|
|
if (any { $_ eq $options->{variant} }
|
|
|
|
|
('required', 'important', 'standard', 'buildd')) {
|
|
|
|
@ -2910,7 +2924,8 @@ sub run_install() {
|
|
|
|
|
$priority = '?and(?or(~prequired,~pimportant,~pstandard),'
|
|
|
|
|
. '?not(?essential))';
|
|
|
|
|
}
|
|
|
|
|
$pkgs_to_install{
|
|
|
|
|
push @pkgs_to_install,
|
|
|
|
|
(
|
|
|
|
|
"?narrow("
|
|
|
|
|
. (
|
|
|
|
|
length($options->{suite})
|
|
|
|
@ -2922,9 +2937,8 @@ sub run_install() {
|
|
|
|
|
)
|
|
|
|
|
. "?architecture($options->{nativearch}),"
|
|
|
|
|
. "$priority)"
|
|
|
|
|
} = ();
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
my @pkgs_to_install = keys %pkgs_to_install;
|
|
|
|
|
|
|
|
|
|
if ($options->{mode} eq 'chrootless') {
|
|
|
|
|
if (scalar @pkgs_to_install > 0) {
|
|
|
|
@ -4493,13 +4507,27 @@ sub main() {
|
|
|
|
|
opendir(my $dh, $opt_value)
|
|
|
|
|
or error "Can't opendir($opt_value): $!";
|
|
|
|
|
while (my $entry = readdir $dh) {
|
|
|
|
|
# skip the "." and ".." entries
|
|
|
|
|
next if $entry eq ".";
|
|
|
|
|
next if $entry eq "..";
|
|
|
|
|
my $found = 0;
|
|
|
|
|
foreach
|
|
|
|
|
my $hook ('setup', 'extract', 'essential', 'customize') {
|
|
|
|
|
if ($entry =~ m/^\Q$hook\E/ and -x "$opt_value/$entry") {
|
|
|
|
|
push @{ $scripts{$hook} }, "$opt_value/$entry";
|
|
|
|
|
$count += 1;
|
|
|
|
|
if ($entry =~ m/^\Q$hook\E/) {
|
|
|
|
|
if (-x "$opt_value/$entry") {
|
|
|
|
|
push @{ $scripts{$hook} }, "$opt_value/$entry";
|
|
|
|
|
$count += 1;
|
|
|
|
|
$found = 1;
|
|
|
|
|
} else {
|
|
|
|
|
warning("$opt_value/$entry is named like a "
|
|
|
|
|
. "hook but not executable");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!$found && -x "$opt_value/$entry") {
|
|
|
|
|
warning("$opt_value/$entry: is executable "
|
|
|
|
|
. "but not prefixed with a hook name");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
closedir($dh);
|
|
|
|
|
if ($count == 0) {
|
|
|
|
@ -5057,17 +5085,21 @@ sub main() {
|
|
|
|
|
## no critic (InputOutput::ProhibitExplicitStdin)
|
|
|
|
|
<STDIN>;
|
|
|
|
|
};
|
|
|
|
|
my $type = guess_sources_format($content);
|
|
|
|
|
if (!defined $type
|
|
|
|
|
|| ($type ne "deb822" and $type ne "one-line")) {
|
|
|
|
|
error "cannot determine sources.list format";
|
|
|
|
|
if ($content eq "") {
|
|
|
|
|
warning "sources.list from standard input is empty";
|
|
|
|
|
} else {
|
|
|
|
|
my $type = guess_sources_format($content);
|
|
|
|
|
if (!defined $type
|
|
|
|
|
|| ($type ne "deb822" and $type ne "one-line")) {
|
|
|
|
|
error "cannot determine sources.list format";
|
|
|
|
|
}
|
|
|
|
|
push @{$sourceslists},
|
|
|
|
|
{
|
|
|
|
|
type => $type,
|
|
|
|
|
fname => undef,
|
|
|
|
|
content => $content,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
push @{$sourceslists},
|
|
|
|
|
{
|
|
|
|
|
type => $type,
|
|
|
|
|
fname => undef,
|
|
|
|
|
content => $content,
|
|
|
|
|
};
|
|
|
|
|
} else {
|
|
|
|
|
my @components = ();
|
|
|
|
|
foreach my $comp (@{ $options->{components} }) {
|
|
|
|
@ -5087,22 +5119,24 @@ sub main() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
my $compstr = join " ", @components;
|
|
|
|
|
# if the currently selected apt keyrings do not contain the
|
|
|
|
|
# necessary key material for the chosen suite, then attempt adding
|
|
|
|
|
# a signed-by option
|
|
|
|
|
# From the suite name we can maybe infer which key we need. If we
|
|
|
|
|
# can infer this information, then we need to check whether the
|
|
|
|
|
# currently running apt actually trusts this key or not. If it
|
|
|
|
|
# doesn't, then we need to add a signed-by line to the sources.list
|
|
|
|
|
# entry.
|
|
|
|
|
my $signedby = '';
|
|
|
|
|
my %suite_by_vendor = get_suite_by_vendor();
|
|
|
|
|
{
|
|
|
|
|
my $gpgproc = sub {
|
|
|
|
|
my $keyring
|
|
|
|
|
= get_keyring_by_suite($options->{suite}, \%suite_by_vendor);
|
|
|
|
|
if (!defined $keyring) {
|
|
|
|
|
last;
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# we can only check if we need the signed-by entry if we u
|
|
|
|
|
# automatically chosen keyring exists
|
|
|
|
|
if (!defined $keyring || !-e $keyring) {
|
|
|
|
|
last;
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# we can only check key material if gpg is installed
|
|
|
|
@ -5130,9 +5164,9 @@ sub main() {
|
|
|
|
|
close $fh;
|
|
|
|
|
}
|
|
|
|
|
if ($? != 0 || !defined $ret || defined $message) {
|
|
|
|
|
info "gpg --version failed: cannot determine the right"
|
|
|
|
|
. " signed-by value";
|
|
|
|
|
last;
|
|
|
|
|
warning
|
|
|
|
|
"gpg --version failed: cannot infer signed-by value";
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
# initialize gpg trustdb with empty one
|
|
|
|
|
{
|
|
|
|
@ -5141,7 +5175,7 @@ sub main() {
|
|
|
|
|
}
|
|
|
|
|
if (!-d $options->{apttrustedparts}) {
|
|
|
|
|
warning "$options->{apttrustedparts} doesn't exist";
|
|
|
|
|
last;
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
# find all the fingerprints of the keys apt currently
|
|
|
|
|
# knows about
|
|
|
|
@ -5163,12 +5197,15 @@ sub main() {
|
|
|
|
|
}
|
|
|
|
|
my @aptfingerprints = ();
|
|
|
|
|
if (scalar @keyrings == 0) {
|
|
|
|
|
$signedby = " [signed-by=\"$keyring\"]";
|
|
|
|
|
last;
|
|
|
|
|
return " [signed-by=\"$keyring\"]";
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
open(my $fh, '-|', @gpgcmd, '--with-colons', '--show-keys',
|
|
|
|
|
@keyrings) // error "failed to fork(): $!";
|
|
|
|
|
info "finding correct signed-by value...";
|
|
|
|
|
my $progress = 0.0;
|
|
|
|
|
print_progress($progress);
|
|
|
|
|
for (my $i = 0 ; $i < scalar @keyrings ; $i++) {
|
|
|
|
|
my $k = $keyrings[$i];
|
|
|
|
|
open(my $fh, '-|', @gpgcmd, '--with-colons',
|
|
|
|
|
'--show-keys', $k) // error "failed to fork(): $!";
|
|
|
|
|
while (my $line = <$fh>) {
|
|
|
|
|
if ($line !~ /^fpr:::::::::([^:]+):/) {
|
|
|
|
|
next;
|
|
|
|
@ -5176,13 +5213,14 @@ sub main() {
|
|
|
|
|
push @aptfingerprints, $1;
|
|
|
|
|
}
|
|
|
|
|
close $fh;
|
|
|
|
|
if ($? != 0) {
|
|
|
|
|
warning("gpg failed to read $k");
|
|
|
|
|
}
|
|
|
|
|
print_progress($i / (scalar @keyrings) * 100.0, undef);
|
|
|
|
|
}
|
|
|
|
|
if ($? != 0) {
|
|
|
|
|
error "gpg failed";
|
|
|
|
|
}
|
|
|
|
|
print_progress("done");
|
|
|
|
|
if (scalar @aptfingerprints == 0) {
|
|
|
|
|
$signedby = " [signed-by=\"$keyring\"]";
|
|
|
|
|
last;
|
|
|
|
|
return " [signed-by=\"$keyring\"]";
|
|
|
|
|
}
|
|
|
|
|
# check if all fingerprints from the keyring that we guessed
|
|
|
|
|
# are known by apt and only add signed-by option if that's not
|
|
|
|
@ -5198,15 +5236,20 @@ sub main() {
|
|
|
|
|
# if this fingerprint is not known by apt, then we need
|
|
|
|
|
#to add the signed-by option
|
|
|
|
|
if (none { $_ eq $1 } @aptfingerprints) {
|
|
|
|
|
$signedby = " [signed-by=\"$keyring\"]";
|
|
|
|
|
last;
|
|
|
|
|
return " [signed-by=\"$keyring\"]";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
close $fh;
|
|
|
|
|
if ($? != 0) {
|
|
|
|
|
warning "gpg failed -- cannot infer signed-by value";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ($? != 0) {
|
|
|
|
|
error "gpg failed";
|
|
|
|
|
}
|
|
|
|
|
return '';
|
|
|
|
|
};
|
|
|
|
|
if (any { $_ eq 'check/signed-by' } @{ $options->{skip} }) {
|
|
|
|
|
info "skipping check/signed-by as requested";
|
|
|
|
|
} else {
|
|
|
|
|
$signedby = $gpgproc->();
|
|
|
|
|
}
|
|
|
|
|
if (scalar @ARGV > 0) {
|
|
|
|
|
for my $arg (@ARGV) {
|
|
|
|
@ -5217,26 +5260,32 @@ sub main() {
|
|
|
|
|
## no critic (InputOutput::ProhibitExplicitStdin)
|
|
|
|
|
<STDIN>;
|
|
|
|
|
};
|
|
|
|
|
my $type = guess_sources_format($content);
|
|
|
|
|
if (!defined $type
|
|
|
|
|
|| ($type ne 'deb822' and $type ne 'one-line')) {
|
|
|
|
|
error "cannot determine sources.list format";
|
|
|
|
|
}
|
|
|
|
|
# if last entry is of same type and without filename,
|
|
|
|
|
# then append
|
|
|
|
|
if ( scalar @{$sourceslists} > 0
|
|
|
|
|
&& $sourceslists->[-1]{type} eq $type
|
|
|
|
|
&& !defined $sourceslists->[-1]{fname}) {
|
|
|
|
|
$sourceslists->[-1]{content}
|
|
|
|
|
.= ($type eq 'one-line' ? "\n" : "\n\n")
|
|
|
|
|
. $content;
|
|
|
|
|
if ($content eq "") {
|
|
|
|
|
warning
|
|
|
|
|
"sources.list from standard input is empty";
|
|
|
|
|
} else {
|
|
|
|
|
push @{$sourceslists},
|
|
|
|
|
{
|
|
|
|
|
type => $type,
|
|
|
|
|
fname => undef,
|
|
|
|
|
content => $content,
|
|
|
|
|
};
|
|
|
|
|
my $type = guess_sources_format($content);
|
|
|
|
|
if (!defined $type
|
|
|
|
|
|| ($type ne 'deb822' and $type ne 'one-line'))
|
|
|
|
|
{
|
|
|
|
|
error "cannot determine sources.list format";
|
|
|
|
|
}
|
|
|
|
|
# if last entry is of same type and without filename,
|
|
|
|
|
# then append
|
|
|
|
|
if ( scalar @{$sourceslists} > 0
|
|
|
|
|
&& $sourceslists->[-1]{type} eq $type
|
|
|
|
|
&& !defined $sourceslists->[-1]{fname}) {
|
|
|
|
|
$sourceslists->[-1]{content}
|
|
|
|
|
.= ($type eq 'one-line' ? "\n" : "\n\n")
|
|
|
|
|
. $content;
|
|
|
|
|
} else {
|
|
|
|
|
push @{$sourceslists},
|
|
|
|
|
{
|
|
|
|
|
type => $type,
|
|
|
|
|
fname => undef,
|
|
|
|
|
content => $content,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} elsif ($arg =~ /^deb(-src)? /) {
|
|
|
|
|
my $content = "$arg\n";
|
|
|
|
@ -5281,24 +5330,31 @@ sub main() {
|
|
|
|
|
$content .= $line;
|
|
|
|
|
}
|
|
|
|
|
close $fh;
|
|
|
|
|
my $type = undef;
|
|
|
|
|
if ($arg =~ /\.list$/) {
|
|
|
|
|
$type = 'one-line';
|
|
|
|
|
} elsif ($arg =~ /\.sources$/) {
|
|
|
|
|
$type = 'deb822';
|
|
|
|
|
if ($content eq "") {
|
|
|
|
|
warning "$arg is empty";
|
|
|
|
|
} else {
|
|
|
|
|
$type = guess_sources_format($content);
|
|
|
|
|
}
|
|
|
|
|
if (!defined $type
|
|
|
|
|
|| ($type ne 'deb822' and $type ne 'one-line')) {
|
|
|
|
|
error "cannot determine sources.list format";
|
|
|
|
|
my $type = undef;
|
|
|
|
|
if ($arg =~ /\.list$/) {
|
|
|
|
|
$type = 'one-line';
|
|
|
|
|
} elsif ($arg =~ /\.sources$/) {
|
|
|
|
|
$type = 'deb822';
|
|
|
|
|
} else {
|
|
|
|
|
$type = guess_sources_format($content);
|
|
|
|
|
}
|
|
|
|
|
if (!defined $type
|
|
|
|
|
|| ($type ne 'deb822' and $type ne 'one-line'))
|
|
|
|
|
{
|
|
|
|
|
error "cannot determine sources.list format";
|
|
|
|
|
}
|
|
|
|
|
push @{$sourceslists},
|
|
|
|
|
{
|
|
|
|
|
type => $type,
|
|
|
|
|
fname => basename($arg),
|
|
|
|
|
content => $content,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
push @{$sourceslists},
|
|
|
|
|
{
|
|
|
|
|
type => $type,
|
|
|
|
|
fname => basename($arg),
|
|
|
|
|
content => $content,
|
|
|
|
|
};
|
|
|
|
|
} elsif ($arg eq '') {
|
|
|
|
|
# empty
|
|
|
|
|
} else {
|
|
|
|
|
error "invalid mirror: $arg";
|
|
|
|
|
}
|
|
|
|
@ -5317,7 +5373,7 @@ sub main() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (scalar @{$sourceslists} == 0) {
|
|
|
|
|
error "empty apt sources.list";
|
|
|
|
|
warning "empty apt sources.list";
|
|
|
|
|
}
|
|
|
|
|
debug("sources list entries:");
|
|
|
|
|
for my $list (@{$sourceslists}) {
|
|
|
|
@ -6186,7 +6242,12 @@ I<TARGET> is C<-> or if no I<TARGET> was specified.
|
|
|
|
|
=head1 OPTIONS
|
|
|
|
|
|
|
|
|
|
Options are case insensitive. Short options may be bundled. Long options
|
|
|
|
|
require a double dash and may be abbreviated to uniqueness.
|
|
|
|
|
require a double dash and may be abbreviated to uniqueness. Options can be
|
|
|
|
|
placed anywhere on the command line, even before or mixed with the I<SUITE>,
|
|
|
|
|
I<TARGET>, and I<MIRROR> arguments. A double dash C<--> can be used to stop
|
|
|
|
|
interpreting command line arguments as options to allow I<SUITE>, I<TARGET> and
|
|
|
|
|
I<MIRROR> arguments that start with a single or double dash. Option order only
|
|
|
|
|
matters for options that can be passed multiple times as documented below.
|
|
|
|
|
|
|
|
|
|
=over 8
|
|
|
|
|
|
|
|
|
@ -6907,6 +6968,8 @@ Upon startup, several checks are carried out, like:
|
|
|
|
|
|
|
|
|
|
=item * whether the output directory is empty. This check can be disabled using B<--skip=check/empty>
|
|
|
|
|
|
|
|
|
|
=item * whether adding a C<signed-by> to C<apt/sources.list> is necessary. This requires gpg and can be disabled using B<--skip=check/signed-by>
|
|
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
|
|
=item B<setup>
|
|
|
|
@ -6946,7 +7009,10 @@ variant uses the fact that libapt treats the C<apt> packages as implicitly
|
|
|
|
|
essential to download only all C<Essential:yes> packages plus apt using
|
|
|
|
|
C<apt-get dist-upgrade>. In the remaining variants, all Packages files
|
|
|
|
|
downloaded by the B<update> step are inspected to find the C<Essential:yes>
|
|
|
|
|
package set as well as all packages of the required priority.
|
|
|
|
|
package set as well as all packages of the required priority. If I<SUITE> is a
|
|
|
|
|
non-empty string, then only packages from the archive with suite or codename
|
|
|
|
|
matching I<SUITE> will be considered for selection of C<Essential:yes>
|
|
|
|
|
packages.
|
|
|
|
|
|
|
|
|
|
=item B<mount>
|
|
|
|
|
|
|
|
|
|