#!/usr/bin/perl # # $Id$ # use strict; use LWP::Simple; use Getopt::Long; use lib qw(/usr/lib/libDrakX); use interactive; my $in='interactive'->vnew(); # Global var my %list_source; # list of mirror my %param; # user param (ver, arch) my $softver="0.3"; my %globinfo; # global info from server my %user; # user choice sub help() { print "Urpmi config $softver (GPL): Olivier Thauvin options (*= can be set in /etc/urpmi/mirror.config): -h|--help Give this message -t|--test Only show what it do * -v|--verbose Make it verbose * -u|--url url Url to use to retrieve list * |--mdkver ver force mdk version to ver * |--arch arch force architecture to arch "; } sub info() { print "you\'re using url: $param{'url'} Mandrake version: $param{'mdkver'} Arch: $param{'arch'} "; } sub get_current_ver() { open (VER,"/etc/mandrake-release") or die 'Can\'t open mandrake-release'; @_=split(" ",); if ( $_[4] =~ /\(Cooker\)/ ) { $param{'mdkver'}='cooker';} else { $param{'mdkver'}=$_[3];}; $param{'arch'}=$_[6]; close(VER); print "Mandrake version is $param{'mdkver'}\n" if ($param{'verbose'}); } sub parse_config() { if (open(CONF, "/etc/urpmi/mirror.config")) { while (my $line = ) { chomp($line); # no newline $line =~ s/#.*//; # no comments $line =~ s/^\s+//; # no leading white $line =~ s/\s+$//; # no trailing white next unless length($line); # anything left? my ($option, $value) = split(/\s*=\s*/, $line, 2); $param{$option}=$value; } close(CONF); } else { warn "Can't open configuration file: $!, skipping.\n"; } } sub parse_url () { my $list=get($param{'url'}) or die 'Can\'t read mirror list'; print "Getting from $param{'url'}\n" if ($param{'verbose'}); foreach my $line (split(/^/,$list)) { $line =~ s/#.*//; # no comments $line =~ s/^\s+//; # no leading white $line =~ s/\s+$//; # no trailing white next unless length($line); # anything left? my ($name,$mdkver,$arch,$location,$url)=split(':',$line,5); if ( ! $name ) { $globinfo{$arch}{$location}=$url; } else { my $mach=$url; $mach =~ s/^.*:\/\///; $mach =~ s/\/.*$//; if ((($mdkver eq $param{'mdkver'}) or ($mdkver eq '*')) and (($arch eq $param{'arch'}) or ($arch eq '*') or ($arch eq 'noarch'))) {$list_source{$name}{$mach}{'url'}=$url; $list_source{$name}{$mach}{'location'} = $location;} } } } sub choose_mirror($) { my ($name)=@_; my %list; my $def; foreach my $key (sort keys %{$list_source{$name}}) { $list{"(". $list_source{$name}{$key}{'location'}.") ".$key}=$key; $def="(". $list_source{$name}{$key}{'location'}.") ".$key if ($user{$name} eq $key); } print $def."\n"; my $choice=$in->ask_from_list(_("%s","Mirror List"),_("Choose a mirror for $name\n".$globinfo{'source'}{$name}),[keys %list],$def); if ( $list{$choice} ) { $user{$name}=$list{$choice};} else {delete $user{$name};} } sub install_source() { #my (%list)=@_; foreach my $key (keys %user) { print "/usr/sbin/urpmi.addmedia $key $list_source{$key}{$user{$key}}{'url'}\n" if ($param{'verbose'} or $param{'test'}); system("/usr/sbin/urpmi.addmedia $key $list_source{$key}{$user{$key}}{'url'}") if (! $param{'test'} ); } } # Begin main get_current_ver; parse_config; GetOptions ( "h|help" => \$param{'help'}, "mdkver=s" => \$param{'mdkver'}, "arch=s" => \$param{'arch'}, "u|url=s" => \$param{'url'}, "t|test" => \$param{'test'}, "v|verbose" => \$param{'verbose'}, ); if ($param{'help'}) { help; exit; } info() if ($param{'verbose'}); parse_url; my $action=1; while ($action) { my %laction; foreach my $key (keys %list_source) { $laction{$key . " (".$user{$key}.")"}=$key; } $action=$in->ask_from_list(_("%s","Source list"),_("Select a source to configure"),[sort keys %laction]); print $laction{$action}."\n"; choose_mirror($laction{$action}) if ($list_source{$laction{$action}}); } install_source() if ($in->ask_okcancel(_("%s", "OK to setup ?"), _("Are you sure you setup urpmi for use: ".join(',',keys %user))));