#!/usr/bin/perl # # $Id$ # use strict; use LWP::Simple; use Getopt::Long; # Global var my %list_source; my %param; my $softver="0.0.1"; 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,$mirror,$url)=info_mirror($line); $list_source{$name}{$mirror}=$url if($name); } } sub info_mirror() { my $mach; my ($mirror)=@_; my ($name,$version,$arch,$loc,$url)= split(':',$mirror,5); if ((($version eq $param{'mdkver'}) or ($version eq '*')) and (($arch eq $param{'arch'}) or ($arch eq '*') or ($arch eq 'noarch'))) { $mach=$url; $mach =~ s/^.*:\/\///; $mach =~ s/\/.*$//; $mach .= " (".$loc.")" if ($loc); #print $mach."\n"; return ($name,$mach,$url); } return(0,0,0); } sub choose_source() { my %list; my @s; foreach my $key (keys %list_source) { my $n=1; foreach my $m (keys %{$list_source{$key}}) { @s[$n]=$m; printf("%2s %s\n",$n,$m); $n++; } print "Choose mirror for $key (leave empty to skip):"; my $ch=; print $list_source{$key}{@s[$ch]}."\n" if ($param{'verbose'}); if ($list_source{$key}{@s[$ch]}) { $list{$key}=$list_source{$key}{@s[$ch]}; } } return %list; } sub install_source(%) { my (%list)=@_; foreach my $key (keys %list) { print "/usr/sbin/urpmi.addmedia $key $list{$key}\n" if ($param{'verbose'} or $param{'test'}); system("/usr/sbin/urpmi.addmedia $key $list{$key}") 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; install_source(choose_source());