summaryrefslogtreecommitdiffstats
path: root/urpmi.addmedia
blob: ec941731f1532bc6c29901a012fd6e4ffc6e7db2 (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
#!/usr/bin/perl

my $DIR = "/etc/urpmi";
my $DEPSLIST = "$DIR/depslist";
my $CFG = "$DIR/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 die "missing the entry to remove\n(one of " . join(", ", @entries) . ")\n";
    foreach $e (/^--?a/ ? @entries : @ARGV) {
	my $f;
	$f = "$DIR/hdlist.$e"; unlink $f || unlink "$f.gz" or die "failed to remove $f";
	$f = "$DIR/list.$e";   unlink $f or die "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 $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";

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("cp -f $f $HDLIST");
    } else {
	$flush = sub { system("rpm2header $hdlist >> $HDLIST") 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;