You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
3.7 KiB
152 lines
3.7 KiB
#!/usr/bin/perl |
|
## |
|
## mirror-summary -- Create A Mirror Summary List |
|
## Copyright (c) 1998-2001 Ralf S. Engelschall <rse@engelschall.com> |
|
## |
|
## Usage: mirror-summary |
|
## |
|
|
|
## |
|
## parse command line request |
|
## |
|
|
|
%R = {}; |
|
foreach $arg (@ARGV) { |
|
if ($arg =~ m|^(\S+)=(.+)$|) { |
|
$R->{$1} = $2; |
|
} |
|
} |
|
|
|
## |
|
## read mirror package configuration |
|
## |
|
|
|
# read all package config files |
|
@F = glob($R->{'pkgdir'}."/*"); |
|
$config = ''; |
|
foreach $f (sort(@F)) { |
|
open(FP, "<$f") || die; |
|
$config .= $_ while (<FP>); |
|
close(FP); |
|
} |
|
$config .= "\n\n"; |
|
$config =~ s|^#.+?||mg; |
|
|
|
# convert package config into internal structure |
|
$P = {}; |
|
$config =~ s|package=(\S+).*?\n(.+?\n)\n|&do_package($1, $2), ''|sge; |
|
sub do_package { |
|
my ($name, $config) = @_; |
|
$P->{$name} = {}; |
|
$config =~ s|^\s*([a-zA-Z0-9_-]+)([+=].*?)$|$P->{$name}->{$1} = $2, ''|mge; |
|
} |
|
|
|
# expand the key+value notation |
|
foreach $e (keys(%{$P->{'defaults'}})) { |
|
$P->{'defaults'}->{$e} =~ s|^=||; |
|
} |
|
foreach $p (keys(%{$P})) { |
|
next if ($p eq 'defaults'); |
|
foreach $e (keys(%{$P->{$p}})) { |
|
($op, $val) = ($P->{$p}->{$e} =~ m|^([+=])(.*)$|); |
|
if ($op eq '+') { |
|
$P->{$p}->{$e} = $P->{'defaults'}->{$e}.$val; |
|
} |
|
else { |
|
$P->{$p}->{$e} = $val; |
|
} |
|
} |
|
} |
|
|
|
## |
|
## generate summary |
|
## |
|
|
|
# place a string into a specific number of columns |
|
sub cutfill { |
|
my ($str, $col) = @_; |
|
if (length($str) > $col) { |
|
$str = substr($str, 0, $col-1)."+"; |
|
} |
|
elsif (length($str) < $col) { |
|
$str = substr($str." "."."x$col, 0, $col); |
|
} |
|
return $str; |
|
} |
|
|
|
if ($R->{'excerpt'} ne '') { |
|
%O = (); |
|
foreach $p (sort(keys(%{$P}))) { |
|
next if ($p eq 'defaults'); |
|
next if ($P->{$p}->{'skip'} eq 'yes'); |
|
$what = $P->{$p}->{'comment'}; |
|
if ($what =~ s|\s*\[\*\]||) { |
|
$from = "ftp://".$P->{$p}->{'site'}.$P->{$p}->{'remote_dir'}; |
|
$to = $P->{$p}->{'local_dir'}; |
|
$to =~ s|^$R->{'rootdir'}||; |
|
$O{$to} = sprintf("%-30s %-35s\n", &cutfill($to, 30), $what); |
|
} |
|
} |
|
$T = ''; |
|
foreach $o (sort(keys(%O))) { |
|
$T .= $O{$o}; |
|
} |
|
|
|
($user, $group, $files, $begin, $prefix, $end) = split(':', $R->{'excerpt'}); |
|
if ($files =~ m|.+\+.+|) { |
|
@F = split(/\+/, $files); |
|
} |
|
else { |
|
@F = ($files); |
|
} |
|
$T =~ s|^|$prefix|mg; |
|
foreach $file (@F) { |
|
open(FP, "<$file"); |
|
$text = ''; |
|
$text .= $_ while (<FP>); |
|
close(FP); |
|
$text =~ s|(.*$begin.*?\n).*\n(.*?$end.*)|$1$T$2|s; |
|
open(FP, ">$file.new"); |
|
print FP $text; |
|
close(FP); |
|
system("cp $file.new $file && rm -f $file.new"); |
|
system("chown $user:$group $file"); |
|
} |
|
} |
|
|
|
if ($R->{'full'} ne '') { |
|
%O = (); |
|
foreach $p (sort(keys(%{$P}))) { |
|
next if ($p eq 'defaults'); |
|
next if ($P->{$p}->{'skip'} eq 'yes'); |
|
$what = $P->{$p}->{'comment'}; |
|
$what =~ s|\s*\[\*\]||; |
|
$from = "ftp://".$P->{$p}->{'site'}.$P->{$p}->{'remote_dir'}."/"; |
|
$from =~ s|/+$|/|; |
|
$to = $P->{$p}->{'local_dir'}."/"; |
|
$to =~ s|^$R->{'rootdir'}|$R->{'rooturl'}|; |
|
$to =~ s|/+$|/|; |
|
$O{$what} = "$what\n"; |
|
$O{$what} .= " Origin: $from\n"; |
|
$O{$what} .= " Mirror: $to\n"; |
|
$O{$what} .= "\n"; |
|
} |
|
$T = "\n"; |
|
foreach $o (sort(keys(%O))) { |
|
$T .= $O{$o}; |
|
} |
|
|
|
($user, $group, $file, $begin, $prefix, $end) = split(':', $R->{'full'}); |
|
$T =~ s|^|$prefix|mg; |
|
open(FP, "<$file"); |
|
$text = ''; |
|
$text .= $_ while (<FP>); |
|
close(FP); |
|
$text =~ s|(.*$begin.*?\n).*\n(.*?$end.*)|$1$T$2|s; |
|
open(FP, ">$file.new"); |
|
print FP $text; |
|
close(FP); |
|
system("cp $file.new $file && rm -f $file.new"); |
|
system("chown $user:$group $file"); |
|
} |
|
|
|
|