summaryrefslogtreecommitdiffstats
path: root/urpmi.addmedia
blob: b1bc5f5c70e1d3c05c120f639cbcc415663eed99 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/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) || unlink("$f.gz") 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("gzip -f $DIR/hdlist.* 2>/dev/null"); # gzip
	system("gzip -dc $DIR/hdlist.* | gendepslist -h $DEPSLIST -");
	system("autoirpm.update");
    } else {
	unlink $DEPSLIST, "$DEPSLIST.html";
    }
    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 <name> <url>
where <url> is one of
	file://<path>
	ftp://<login>:<user>@<host>/<path> with <relative path of hdlist>
	ftp://<host>/<path> with <relative path of hdlist>
	http://<host>/<path> with <relative path of hdlist>
        removable_<device>_<number>://<path>
";
    $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  <relative path of hdlist> 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";
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";
!-e "$HDLIST.gz" || unlink "$HDLIST.gz" or die "can't remove $HDLIST.gz";

my $mask = umask 077;
open LIST, ">$RPMLIST" or die "can't output $RPMLIST";
umask $mask;

if (my ($prefix, $dir) = $url =~ m,^(removable_.*?|file):/(.*),) {
    my $hdlist = '';
    my $flush = sub {};
    if (-e (my $f = "$dir/Mandrake/base/hdlist")) {
	system("gzip -f $f > $HDLIST.gz");
    } else {
	$flush = sub { system("rpm2header $hdlist | gzip >> $HDLIST.gz") if $hdlist };
    }
    print "scanning $dir...";
    open F, "find $dir -follow -name '*.rpm'|";
    foreach (<F>) {
	chomp;
	if (length "$hdlist $_" > 1500) {
	    &$flush();
	    $hdlist = '';
	}
	$hdlist .= " $_";
	print LIST "$prefix:/$_\n";
    }
    $hdlist or die "no rpms found in $dir";
    &$flush();
    close F or die "searching for rpms failed";
    print "\n";
} else {
    system("wget -O $HDLIST $url/$ftp_hdlist");
    $? == 0 or die "wget of $url/$ftp_hdlist failed (maybe wget is missing?)";
    open F, "hdlist2files $HDLIST|";
    foreach (<F>) {
	chomp;
	print LIST "$url/$_\n";
    }
    close F or die "hdlist2files failed";
}
close LIST;

system("urpmi.update") unless $noupdate;
exit 0;