summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--urpm.pm211
1 files changed, 71 insertions, 140 deletions
diff --git a/urpm.pm b/urpm.pm
index 935e130f..ff039af0 100644
--- a/urpm.pm
+++ b/urpm.pm
@@ -8,6 +8,7 @@ use urpm::msg;
use urpm::download;
use urpm::util;
use urpm::sys;
+use urpm::cfg;
our $VERSION = '4.5';
our @ISA = qw(URPM);
@@ -96,146 +97,75 @@ sub sync_webfetch {
%files and die N("unable to handle protocol: %s", join ', ', keys %files);
}
-#- read /etc/urpmi/urpmi.cfg as config file, keep compability with older
-#- configuration file by examining if one entry is of the form
-#- <name> <url> {
-#- ...
-#- }
-#- else only this form is used
-#- <name> <url>
-#- <name> <ftp_url> with <relative_path_hdlist>
+#- Loads /etc/urpmi/urpmi.cfg and performs basic checks.
+#- Does not handle old format: <name> <url> [with <path_hdlist>]
+#- options :
+#- - nocheck_access : don't check presence of hdlist and other files
sub read_config {
my ($urpm, %options) = @_;
+ return if $urpm->{media}; #- media already loaded
+ $urpm->{media} = [];
+ my $config = urpm::cfg::load_config($urpm->{config})
+ or $urpm->{fatal}(6, $urpm::cfg::err);
- #- keep in mind if it has been called before.
- $urpm->{media} and return; $urpm->{media} ||= [];
+ #- global options
+ if ($config->{''}) {
+ for my $opt (qw(verify-rpm fuzzy allow-force allow-nodeps pre-clean post-clean excludedocs compress keep auto resume limit-rate excludepath key-_ids split-level split-length priority-upgrade downloader)) {
+ if (defined $config->{''}{$opt} && !exists $urpm->{options}{$opt}) {
+ $urpm->{options}{$opt} = $config->{''}{$opt};
+ }
+ }
+ }
+ #- per-media options
+ for my $m (grep { $_ ne '' } keys %$config) {
+ my $medium = { name => $m, clear_url => $config->{$m}{url} };
+ for my $opt (qw(hdlist list with_hdlist removable md5sum key-ids update ignore synthesis virtual)) {
+ defined $config->{$m}{$opt} and $medium->{$opt} = $config->{$m}{$opt};
+ }
+ $urpm->probe_medium($medium, %options) and push @{$urpm->{media}}, $medium;
+ }
- #- check urpmi.cfg content, if the file is old keep track
- #- of old format used.
- local (*F, $_);
- open F, $urpm->{config}; #- no filename can be allowed on some case
- while (<F>) {
- chomp; s/#.*$//; s/^\s*//; s/\s*$//;
- $_ eq '{' and do { #- urpmi.cfg global options extension
- while (<F>) {
- chomp; s/#.*$//; s/^\s*//; s/\s*$//;
- $_ eq '}' and last;
- #- check for boolean variables first, and after that valued variables.
- my ($no, $k, $v);
- if (($no, $k, $v) = /^(no-)?(verify-rpm|fuzzy|allow-(?:force|nodeps)|(?:pre|post)-clean|excludedocs|compress|keep|auto|resume)(?:\s*:\s*(.*))?$/) {
- unless (exists($urpm->{options}{$k})) {
- $urpm->{options}{$k} = $v eq '' || $v =~ /^(yes|on|1)$/i || 0;
- $no and $urpm->{options}{$k} = ! $urpm->{options}{$k} || 0;
- }
- next;
- } elsif (($k, $v) = /^(limit-rate|excludepath|key[\-_]ids|split-(?:level|length)|priority-upgrade|downloader)\s*:\s*(.*)$/) {
- unless (exists($urpm->{options}{$k})) {
- $v =~ /^'([^']*)'$/ and $v = $1; $v =~ /^"([^"]*)"$/ and $v = $1;
- $urpm->{options}{$k} = $v;
- }
- next;
- }
- $_ and $urpm->{error}(N("syntax error in config file at line %s", $.));
- }
- exists $urpm->{options}{key_ids} && ! exists $urpm->{options}{'key-ids'} and
- $urpm->{options}{'key-ids'} = delete $urpm->{options}{key_ids};
- next };
- /^(.*?[^\\])\s+(?:(.*?[^\\])\s+)?{$/ and do { #- urpmi.cfg format extention
- my $medium = { name => unquotespace($1), clear_url => unquotespace($2) };
- while (<F>) {
- chomp; s/#.*$//; s/^\s*//; s/\s*$//;
- $_ eq '}' and last;
- /^(hdlist|list|with_hdlist|removable|md5sum|key[\-_]ids)\s*:\s*(.*)$/ and $medium->{$1} = $2, next;
- /^(update|ignore|synthesis|virtual)\s*$/ and $medium->{$1} = 1, next;
- /^modified\s*$/ and next;
- $_ and $urpm->{error}(N("syntax error in config file at line %s", $.));
- }
- exists $medium->{key_ids} && ! exists $medium->{'key-ids'} and $medium->{'key-ids'} = delete $medium->{key_ids};
- $urpm->probe_medium($medium, %options) and push @{$urpm->{media}}, $medium;
- next };
- /^(.*?[^\\])\s+(.*?[^\\])\s+with\s+(.*)$/ and do { #- urpmi.cfg old format for ftp
- my $medium = { name => unquotespace($1), clear_url => unquotespace($2), with_hdlist => unquotespace($3) };
- $urpm->probe_medium($medium, %options) and push @{$urpm->{media}}, $medium;
- next };
- /^(.*?[^\\])\s+(?:(.*?[^\\])\s*)?$/ and do { #- urpmi.cfg old format (assume hdlist.<name>.cz2?)
- my $medium = { name => unquotespace($1), clear_url => unquotespace($2) };
- $urpm->probe_medium($medium, %options) and push @{$urpm->{media}}, $medium;
- next };
- $_ and $urpm->{error}(N("syntax error in config file at line %s", $.));
- }
- close F;
-
- #- keep in mind when an hdlist/list file is used, really usefull for
- #- the next probe.
- my (%hdlists, %lists);
+ #- keep in mind when an hdlist/list file is already used
+ my %filelists;
foreach (@{$urpm->{media}}) {
- if ($_->{hdlist}) {
- exists($hdlists{$_->{hdlist}}) and
- $_->{ignore} = 1,
- $urpm->{error}(N("medium \"%s\" trying to use an already used hdlist, medium ignored", $_->{name}));
- $hdlists{$_->{hdlist}} = undef;
- }
- if ($_->{list}) {
- exists($lists{$_->{list}}) and
- $_->{ignore} = 1,
- $urpm->{error}(N("medium \"%s\" trying to use an already used list, medium ignored", $_->{name}));
- $lists{$_->{list}} = undef;
- }
- }
-
- #- urpmi.cfg if old is not enough to known the various media, track
- #- directly into /var/lib/urpmi,
- foreach (glob("$urpm->{statedir}/hdlist.*")) {
- if (m|/hdlist\.((.*)\.cz2?)$|) {
- #- check if it has already been detected above.
- exists($hdlists{"hdlist.$1"}) and next;
-
- #- if not this is a new media to take care if
- #- there is a list file.
- if (-e "$urpm->{statedir}/list.$2") {
- if (exists($lists{"list.$2"})) {
- $urpm->{error}(N("unable to take care of medium \"%s\" as list file is already used by another medium", $2));
- } else {
- my $medium;
- foreach (@{$urpm->{media}}) {
- $_->{name} eq $2 and $medium = $_, last;
- }
- $medium and $urpm->{error}(N("unable to use name \"%s\" for unnamed medium because it is already used",
- $2)), next;
-
- $medium = { name => $2, hdlist => "hdlist.$1", list => "list.$2" };
- $urpm->probe_medium($medium, %options) and push @{$urpm->{media}}, $medium;
- }
- } else {
- $urpm->{error}(N("unable to take medium \"%s\" into account as no list file [%s] exists",
- $2, "$urpm->{statedir}/list.$2"));
+ for my $filetype (qw(hdlist list)) {
+ if ($_->{$filetype}) {
+ exists($filelists{$filetype}{$_->{$filetype}})
+ and $_->{ignore} = 1,
+ $urpm->{error}(
+ N($filetype eq 'hdlist'
+ ? "medium \"%s\" trying to use an already used hdlist, medium ignored"
+ : "medium \"%s\" trying to use an already used list, medium ignored",
+ $_->{name})
+ );
+ $filelists{$filetype}{$_->{$filetype}} = undef;
}
- } else {
- $urpm->{error}(N("unable to determine medium of this hdlist file [%s]", $_));
}
}
- #- check the presence of hdlist file and list file if necessary.
+ #- check the presence of hdlist and list files if necessary.
unless ($options{nocheck_access}) {
foreach (@{$urpm->{media}}) {
$_->{ignore} and next;
- -r "$urpm->{statedir}/$_->{hdlist}" || -r "$urpm->{statedir}/synthesis.$_->{hdlist}" && $_->{synthesis} or
- $_->{ignore} = 1, $urpm->{error}(N("unable to access hdlist file of \"%s\", medium ignored", $_->{name}));
- $_->{list} && -r "$urpm->{statedir}/$_->{list}" || defined $_->{url} or
- $_->{ignore} = 1, $urpm->{error}(N("unable to access list file of \"%s\", medium ignored", $_->{name}));
+ -r "$urpm->{statedir}/$_->{hdlist}" || -r "$urpm->{statedir}/synthesis.$_->{hdlist}" && $_->{synthesis}
+ or $_->{ignore} = 1,
+ $urpm->{error}(N("unable to access hdlist file of \"%s\", medium ignored", $_->{name}));
+ $_->{list} && -r "$urpm->{statedir}/$_->{list}" || defined $_->{url}
+ or $_->{ignore} = 1,
+ $urpm->{error}(N("unable to access list file of \"%s\", medium ignored", $_->{name}));
}
}
- local *MD5SUM;
- open MD5SUM, "$urpm->{statedir}/MD5SUM";
- while (<MD5SUM>) {
+ #- read MD5 sums (usually not in urpmi.cfg but in a separate file)
+ open my $md5sum, "$urpm->{statedir}/MD5SUM";
+ while (<$md5sum>) {
my ($md5sum, $file) = /(\S*)\s+(.*)/;
foreach (@{$urpm->{media}}) {
($_->{synthesis} ? "synthesis." : "").$_->{hdlist} eq $file
and $_->{md5sum} = $md5sum, last;
}
}
- close MD5SUM;
+ close $md5sum;
}
#- probe medium to be used, take old medium into account too.
@@ -358,36 +288,37 @@ sub probe_removable_device {
}
}
-#- write back urpmi.cfg code to allow modification of medium listed.
+#- Writes the urpmi.cfg file.
sub write_config {
my ($urpm) = @_;
- #- avoid trashing exiting configuration in this case.
+ #- avoid trashing exiting configuration if it wasn't loaded
$urpm->{media} or return;
- local (*F, *MD5SUM);
- open F, ">$urpm->{config}" or $urpm->{fatal}(6, N("unable to write config file [%s]", $urpm->{config}));
- open MD5SUM, ">$urpm->{statedir}/MD5SUM";
- if (%{$urpm->{options} || {}}) {
- printf F "{\n";
- while (my ($k, $v) = each %{$urpm->{options}}) {
- printf F " %s: %s\n", $k, $v;
- }
- printf F "}\n\n";
+ my $config = {};
+ #- TODO options set via the command-line shouldn't be taken into account
+ while (my ($k, $v) = each %{$urpm->{options} || {}}) {
+ $config->{''}{$k} = $v;
}
foreach my $medium (@{$urpm->{media}}) {
- printf F "%s %s {\n", quotespace($medium->{name}), quotespace($medium->{clear_url});
- foreach (qw(hdlist with_hdlist list removable key-ids priority-upgrade)) {
- $medium->{$_} and printf F " %s: %s\n", $_, $medium->{$_};
+ my $medium_name = $medium->{name};
+ $config->{$medium_name}{url} = $medium->{clear_url};
+ foreach (qw(hdlist with_hdlist list removable key-ids priority-upgrade update ignore synthesis modified virtual)) {
+ defined $medium->{$_} and $config->{$medium_name}{$_} = $medium->{$_};
}
- $medium->{md5sum} and print MD5SUM "$medium->{md5sum} ".($medium->{synthesis} && "synthesis.").$medium->{hdlist}."\n";
- foreach (qw(update ignore synthesis modified virtual)) {
- $medium->{$_} and printf F " %s\n", $_;
- }
- printf F "}\n\n";
}
- close MD5SUM;
- close F;
+ urpm::cfg::dump_config($urpm->{config}, $config)
+ or $urpm->{fatal}(6, N("unable to write config file [%s]", $urpm->{config}));
+
+ #- write MD5SUM file
+ open my $md5sum, '>', "$urpm->{statedir}/MD5SUM"
+ or $urpm->{error}(N("unable to write file [%s]", "$urpm->{statedir}/MD5SUM")), return 0;
+ foreach my $medium (@{$urpm->{media}}) {
+ $medium->{md5sum}
+ and print $md5sum "$medium->{md5sum} ".($medium->{synthesis} && "synthesis.").$medium->{hdlist}."\n";
+ }
+ close $md5sum;
+
$urpm->{log}(N("write config file [%s]", $urpm->{config}));
#- everything should be synced now.