diff options
Diffstat (limited to 'urpm')
-rw-r--r-- | urpm/cfg.pm | 63 | ||||
-rw-r--r-- | urpm/media.pm | 40 |
2 files changed, 99 insertions, 4 deletions
diff --git a/urpm/cfg.pm b/urpm/cfg.pm index a1c24d3f..634a188d 100644 --- a/urpm/cfg.pm +++ b/urpm/cfg.pm @@ -252,6 +252,69 @@ sub dump_config_raw { 1; } +sub load_ini_config_file_raw { + my ($file, $b_norewrite) = @_; + + require Config::IniFiles; + my $cfg = Config::IniFiles->new('-file' => $file); + [ map { + my $section = $_; + my %h = map { + my $v = $cfg->val($section, $_); + $v = expand_line($v) if !$b_norewrite; + $_ => $v; + } $cfg->Parameters($section); + { conf_file__rel_media => $section, %h }; + } $cfg->Sections ]; +} + +sub write_ini_config { + my ($file, $blocks) = @_; + + if (@$blocks == 0) { + unlink $file; + return; + } + my $modified; + + require Config::IniFiles; + my $cfg = Config::IniFiles->new('-file' => $file); + if ($cfg) { + # remove dropped blocks + foreach (difference2([ $cfg->Sections ], [ map { $_->{name} } @$blocks ])) { + $cfg->DeleteSection($_); + $modified = 1; + } + } else { + $cfg = Config::IniFiles->new; + } + + my %uniq; + + foreach (@$blocks) { + my %h = %$_; + my $section = delete $h{conf_file__rel_media} || '_'; + $uniq{$section}++ or die "conflicting conf_file__rel_media value\n"; + + foreach (difference2([ $cfg->Parameters($section) ], [ keys %h ])) { + # remove those options which are no more wanted + $cfg->delval($section, $_); + $modified = 1; + } + foreach (keys %h) { + my $old_v = $cfg->getval($section, $_); + my $v = substitute_back($h{$_}, $old_v); + if ($old_v ne $v) { + $cfg->setval($section, $_, $v); + $modified = 1; + } + } + } + if ($modified) { + $cfg->RewriteConfig; + } +} + #- routines to handle mirror list location #- Default mirror list diff --git a/urpm/media.pm b/urpm/media.pm index ac66c3b2..0e056c63 100644 --- a/urpm/media.pm +++ b/urpm/media.pm @@ -11,6 +11,7 @@ use MDV::Distribconf; our @PER_MEDIA_OPT = qw( + conf_file__rel_media downloader ignore key-ids @@ -144,6 +145,7 @@ sub read_config { #- per-media options read_config_add_passwords($urpm, $config); + my @media; foreach my $m (@{$config->{media}}) { my $medium = _only_media_opts_read($m); @@ -154,9 +156,22 @@ sub read_config { $medium->{url} or $urpm->{error}("unable to find url in list file $medium->{name}, medium ignored"); } - add_existing_medium($urpm, $medium); + push @media, $medium; } + require File::Glob; + # we can't use perl's glob() because we allow spaces in filename + foreach my $conf_file (File::Glob::bsd_glob("$urpm->{configs_dir}/*.cfg")) { + $urpm->{debug} and $urpm->{debug}("parsing: $conf_file"); + my $conf = urpm::cfg::load_ini_config_file_raw($conf_file); + foreach my $medium (map { _only_media_opts_read($_) } @$conf) { + $medium->{conf_file} = $conf_file; + push @media, $medium; + } + } + + add_existing_medium($urpm, $_) foreach @media; + eval { require urpm::ldap; urpm::ldap::load_ldap_media($urpm) }; } @@ -172,7 +187,12 @@ sub check_existing_medium { N("unable to access list file of \"%s\", medium ignored", $medium->{name}); } elsif (!$medium->{ignore} && !-r any_synthesis($urpm, $medium)) { - $err = N("unable to access synthesis file of \"%s\", medium ignored", $medium->{name}); + if ($medium->{conf_file} && $< == 0) { + # no pb, we create on the fly + $medium->{force_auto_update} = 1; + } else { + $err = N("unable to access synthesis file of \"%s\", medium ignored", $medium->{name}); + } } if ($err) { $medium->{ignore} = 1; @@ -406,11 +426,16 @@ sub write_urpmi_cfg { #- avoid trashing exiting configuration if it wasn't loaded $urpm->{media} or return; + my %media_per_cfg; + foreach (grep { !$_->{external} } @{$urpm->{media}}) { + push @{$media_per_cfg{$_->{conf_file} || ''}}, _only_media_opts_write($_); + } + my $config = { #- global config options found in the config file, without the ones #- set from the command-line global => $urpm->{global_config}, - media => [ map { _only_media_opts_write($_) } grep { !$_->{external} } @{$urpm->{media}} ], + media => delete $media_per_cfg{''}, }; remove_passwords_and_write_private_netrc($urpm, $config); @@ -419,6 +444,13 @@ sub write_urpmi_cfg { $urpm->{log}(N("wrote config file [%s]", $urpm->{config})); + foreach my $conf_file (sort keys %media_per_cfg) { + urpm::cfg::write_ini_config($conf_file, $media_per_cfg{$conf_file}) + or $urpm->{fatal}(6, N("unable to write config file [%s]", $conf_file)); + + $urpm->{log}(N("wrote config file [%s]", $conf_file)); + } + #- everything should be synced now. delete $urpm->{modified}; } @@ -552,7 +584,7 @@ sub _auto_update_media { my $errors; foreach (grep { !$_->{ignore} && (!$options{update} || $_->{update}) && - _is_remote_virtual($_) } @{$urpm->{media} || []}) { + ($_->{force_auto_update} || _is_remote_virtual($_)) } @{$urpm->{media} || []}) { _update_medium($urpm, $_, %options) or $errors++; } !$errors; |