#!/usr/bin/perl # # $Id$ # use lib qw(/usr/lib/libDrakX); use standalone; # Should be set first use strict; use LWP::Simple; # to retrieve url use Getopt::Long; # get command line arg # interactive: use interactive; my $in='interactive'->vnew('su','default'); use urpm; # i18n use Locale::gettext; Locale::gettext::textdomain("urpmi.setup"); # Global var my %list_source; # list of mirror my %param; # user param (ver, arch) my $softver="0.3.9b"; my %globinfo; # global info from server sub help() { return _("Urpmi config %s (GPL): Olivier Thauvin ",$softver) . _("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() { return _("you\'re using url: %s ", $param{'url'}) . _("Mandrake version: %s ", $param{'mdkver'}). _("Arch: %s ", $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); } sub config() { $in->ask_from_list(_("#"),_("#"),[keys %param]); } 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.\n"); } } sub parse_url () { my $list; if (! ($list=get($param{'url'}))) { $in->ask_warn(_("error"), _("Can\'t read mirror list from:\n %s",$param{'url'})); return 1; } 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,$user)=@_; my %list; my $def; my $choice; 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 eq $key); } if (scalar keys %list ==1) { ($choice)=keys %list if ($in->ask_yesorno(_("Source for %s", $name), _("Only one mirror is availlable for %s:\n%s.\nDo you want to use it ?",$name,join('',keys %list)))); return $choice; } else { return $list{$in->ask_from_list(_("Mirror List"),_("Choose a mirror for %s:\n%s",$name,$globinfo{'source'}{$name}),[keys %list],$def)}; } } sub add_source() { return if (parse_url()); my %user; my $source=1; while ($source) { my %lsource; foreach my $key (keys %list_source) { $lsource{$key . " (".$user{$key}.")"}=$key; } $source=$lsource{$in->ask_from_list(_("Source list"),_("Select a source to add in your urpmi base"),[sort keys %lsource])}; $user{$source}=choose_mirror($source,$user{$source}) if ($list_source{$source}); print STDERR $user{$source}. "_" .$source."\n"; delete $user{$source} if (! $user{$source} ); } if (scalar %user and $in->ask_yesorno(_("OK to setup ?"), _("Are you sure you setup urpmi for use %s",join(',',keys %user)))) { foreach my $key (keys %user) { system("/usr/sbin/urpmi.addmedia $key $list_source{$key}{$user{$key}}{'url'}") if (! $param{'test'} ); } } } sub remove_source() { my $urpm = new urpm; my $media=1; while ($media) { $urpm->configure(nocheck_access => 1 ); my @medias; foreach (@{$urpm->{media}}) { push @medias, $_->{name};} $media=$in->ask_from_list(_("Installed sources"),_("Choose a source to remove"),[@medias]); if ($media and $in->ask_yesorno(_("Removing source ?"), _("Are you sure you want to remove %s ?",$media))) { $urpm->select_media(($media)); $urpm->remove_selected_media; $urpm->update_media(noclean => 0); } } } sub menu() { my %menu=( _("Command line help") => "help", _("System information") => "info", #_("Configuration") => "config", _("Remove Source") => "remove", _("Add urpmi sources") => "add" ); return $menu{$in->ask_from_list(_("urpmi setup"),_("What do you want to do ?"),[keys %menu])}; } if ($param{'help'}) { print help; exit; } # 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'}, ); while ($_=menu()) { $in->ask_warn(_("Info"),info()) if /info/; $in->ask_warn(_("Help"),help()) if /help/; add_source() if /add/; remove_source() if /remove/; config() if /config/; }