#!/usr/local/bin/perl
#< LICENSE: WTFPL >
use warnings;
use strict;
use Digest::SHA1;
my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my @days = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
#< Config START >
my $scan_dir = '/xxxxxxxxxxxxxxxxxxxxxx/sf-download/';
my $base_dlurl = 'https://www.privoxy.org/sf-download-mirror/';
my $save_rss_file ='/xxxxxxxxxxxxxxxxxxxxxx/release.xml'; # e.g., release.rss
my $maxlimit = 1000;
my $max_advertised_files = 100;
#< Config END >
my @Array = ();
my $i = 0;
my $sec;
my $min;
my $hour;
my $mday;
my $mon;
my $year;
my $wday;
my $yday;
my $isdst;
my $target;
my $target_sha1;
my $target_uri;
my $target_time;
my $target_line;
#
# 1st & 2nd directory should NOT contain ANY 'FILES'. (expecting only 'Directory')
#
opendir(my $D1, $scan_dir) or die "Can't open 1st directory! /";
while (my $fi1 = readdir($D1)) {
next if ($fi1 =~ m/^\./);
next if ($fi1 eq 'OldFiles' or $fi1 eq 'pkgsrc');
opendir(my $D2, $scan_dir . $fi1 . '/')
or die "Can't open 2nd directory! /$fi1";
while (my $fi2 = readdir($D2)) {
next if ($fi2 =~ m/^\./);
## start listing /OS/Version/FILE
opendir(my $D3, $scan_dir . $fi1 . '/' . $fi2 . '/')
or die "Can't open 3rd directory! /$fi1/$fi2";
while (my $fi3 = readdir($D3)) {
next if ($fi3 =~ m/^\./);
$target = $scan_dir . $fi1 . '/' . $fi2 . '/' . $fi3;
next if (!-e $target); # skip if file is not exist
# Get SHA-1 hash
my $filedata;
open($filedata, "<", $target)
or die "Can't open '$target' to generate checksum $!";
my $sha1 = Digest::SHA1->new;
$sha1->addfile($filedata);
close($filedata);
$target_sha1 = $sha1->hexdigest;
# URI and Time
$target_uri = $fi1 . '/' . $fi2 . '/' . $fi3;
$target_time = (stat $target)[9];
# RSS line
$target_line =
'';
$target_line .=
'';
$target_line .=
''
. $base_dlurl
. $target_uri
. ''
. $base_dlurl
. $target_uri
. '';
$target_line .= '';
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
gmtime($target_time);
$target_line .=
"$days[$wday], $mday $months[$mon] "
. ($year + 1900)
. " $hour:$min:$sec GMT";
$target_line .= '';
# Add it to Array
$Array[$i] = ([$target_time, $target_line]);
$i++;
die "maxlimit $maxlimit reached!" unless ($i < $maxlimit);
}
closedir($D3);
## end listing /OS/Version/FILE
}
closedir($D2);
}
closedir($D1);
# Result = Full XML Codes
my $result =
'Privoxy Releaseshttps://www.privoxy.org/announce.txt';
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime();
$result .=
"$days[$wday], $mday $months[$mon] "
. ($year + 1900)
. " $hour:$min:$sec GMT";
$result .= '';
# Sort Array
my @resArray = sort { @$a[0] <=> @$b[0] } @Array;
$i--;
while ($max_advertised_files-- > 0 && $i >= 0) {
$result .= $resArray[$i][1];
$i--;
}
$result .= '';
# Save it.
open(my $XMLF, ">", $save_rss_file) or die "Failed to write XML file";
print $XMLF $result;
close($XMLF);