#!/usr/bin/perl my $DIR = "/var/lib/urpmi"; my $DIR2 = "/etc/urpmi"; my $DEPSLIST = "$DIR/depslist"; my $CFG = "$DIR2/urpmi.cfg"; $| = 1; sub substInFile(&@) { my $f = shift; local @ARGV = @_ or return; local ($^I, $_) = ''; while (<>) { &$f($_); print } } my @entries = map { /list.(.*)/ } glob("$DIR/list.*"); if ($0 =~ /removemedia/) { local ($_) = @ARGV or @entries ? die "missing the entry to remove\n(one of " . join(", ", @entries) . ")\n" : die "nothing to remove (use urpmi.addmedia to add a media)\n"; foreach $e (/^--?a/ ? @entries : @ARGV) { my $f; $f = "$DIR/hdlist.$e"; unlink("$f.cz2") or warn "failed to remove $f"; $f = "$DIR/list.$e"; unlink($f) or warn "failed to remove $f"; substInFile { s/^/\#/ if /^$e\s/ } $CFG; } system("urpmi.update"); exit 0; } elsif ($0 =~ /update/) { if (local ($_) = @ARGV) { my $regexp = /^--?a/ ? '[^#]\S*' : join('|', @ARGV); system("urpmi.addmedia --noupdate $_") foreach grep { /^$regexp\s/ } `cat $CFG`; } if (glob("$DIR/hdlist.*")) { print "generating dependencies list\n"; system("gendepslist2 $DIR/hdlist.* > $DEPSLIST"); system("autoirpm.update"); } exit 0; } my $noupdate = shift @ARGV if $ARGV[0] eq "--noupdate"; my ($name, $url, $with, $ftp_hdlist) = @ARGV; my $suffix; # basic checking of arguments { my $usage = "usage: urpmi.addmedia where is one of file:// ftp://:@/ with ftp:/// with http:/// with removable__:// "; $name or die $usage; my ($type, $dev, $num) = $url =~ m,^(file|ftp|http|removable_(\w+)_(\d+))://, or die $usage; $name =~ s/\s/_/g; if ($type eq "removable") { $num =~ /^\d+$/ or die "$usage bad number (is `$num')\n"; $dev && -e "/dev/$dev" or die "$usage device `$dev' do not exist\n"; } elsif ($type eq "ftp") { $with eq "with" or die "$usage `with' missing for ftp media\n"; $ftp_hdlist or die "$usage missing\n"; } } -e $CFG or `echo > $CFG`; # create it if not there $? == 0 or die "can't write to config file $CFG"; substInFile { s/^/\#/ if /^$name\s/; $_ .= "$name $url $with $ftp_hdlist\n" if eof; } $CFG; my $HDLIST = "$DIR/hdlist.$name.cz2"; my $RPMLIST = "$DIR/list.$name"; -e $DIR || mkdir $DIR, 0755 or die "can't create $DIR"; !-e $HDLIST || unlink $HDLIST or die "can't remove $HDLIST"; if (my ($prefix, $dir) = $url =~ m,^(removable_.*?|file):/(.*),) { my $f; if ($dir =~ /RPMS(.*)$/) { $f = "$dir/Mandrake/base/hdlist$1.cz2"; $f = "$dir/../base/hdlist$1.cz2" unless -e $f; $f = "$dir/../hdlist$1.cz2" unless -e $f; } if (-e $f) { system("cp -f $f $HDLIST"); } else { system("genhdlist_cz2 -o $HDLIST $dir"); } } else { system("wget -O $HDLIST $url/$ftp_hdlist"); $? == 0 or die "wget of $url/$ftp_hdlist failed (maybe wget is missing?)"; } my $mask = umask 077; open LIST, ">$RPMLIST" or die "can't output $RPMLIST"; umask $mask; open F, "bzip2 -dc $HDLIST 2>/dev/null | hdlist2names - |"; foreach () { chomp; print LIST "$url/$_\n"; } close F or die "hdlist2names failed"; close LIST; system("urpmi.update") unless $noupdate; exit 0;