From 76eef346e3c51c41ae10fe71a517166700225871 Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Sat, 16 Jul 2016 11:43:57 +0000 Subject: [PATCH 1/1] create-package-feed.pl: Split script into functions --- utils/create-package-feed.pl | 247 ++++++++++++++++++----------------- 1 file changed, 129 insertions(+), 118 deletions(-) diff --git a/utils/create-package-feed.pl b/utils/create-package-feed.pl index aff89ed3..0a3a9bb1 100644 --- a/utils/create-package-feed.pl +++ b/utils/create-package-feed.pl @@ -6,138 +6,149 @@ use Digest::SHA; 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 = shift(@ARGV) - or die "Local package directory not specified (first argument)\n"; -my $save_rss_file = shift(@ARGV) - or die "RSS output file path not specified (second argument)\n"; my $base_dlurl = 'https://www.privoxy.org/sf-download-mirror/'; 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_sha256; -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-256 hash - my $filedata; - open($filedata, "<", $target) - or die "Can't open '$target' to generate checksum $!"; - my $sha256 = Digest::SHA->new("SHA-256"); - $sha256->addfile($filedata); - close($filedata); - $target_sha256 = $sha256->hexdigest; - - # URI and Time - $target_uri = $fi1 . '/' . $fi2 . '/' . $fi3; - my $escaped_target_uri = $target_uri; - $escaped_target_uri =~ s@ @%20@g; - $target_time = (stat $target)[9]; - - # RSS line - $target_line = - '<![CDATA[' . $target_uri . ']]>'; - $target_line .= - ''; - $target_line .= - '' - . $base_dlurl - . $escaped_target_uri - . '' - . $base_dlurl - . $escaped_target_uri - . ''; - $target_line .= ''; - ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = - gmtime($target_time); - $target_line .= sprintf("%s, %s %s %d %.2d:%.2d:%.2d GMT", - $days[$wday], $mday, $months[$mon], ($year + 1900), - $hour, $min, $sec); - $target_line .= ''; - $target_line .= "\n"; - - # 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 +sub generate_rss_item($$$$) { + my ($target, $target_uri, $target_time, $target_sha256) = @_; + + my $rss_item; + my $escaped_target_uri = $target_uri; + $escaped_target_uri =~ s@ @%20@g; + + # RSS line + $rss_item = + '<![CDATA[' . $target_uri . ']]>'; + $rss_item .= + ''; + $rss_item .= + '' + . $base_dlurl + . $escaped_target_uri + . '' + . $base_dlurl + . $escaped_target_uri + . ''; + $rss_item .= ''; + my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = + gmtime($target_time); + $rss_item .= sprintf("%s, %s %s %d %.2d:%.2d:%.2d GMT", + $days[$wday], $mday, $months[$mon], ($year + 1900), + $hour, $min, $sec); + $rss_item .= ''; + $rss_item .= "\n"; + + return $rss_item; +} + +sub get_sha256_sum($) { + my $file = shift; + + open(my $fd, "<", $file) + or die "Can't open '$file' to generate checksum $!"; + my $sha256 = Digest::SHA->new("SHA-256"); + $sha256->addfile($fd); + close($fd); + + return $sha256->hexdigest; +} + +sub get_released_files($) { + my $scan_dir = shift; + + my @Array = (); + my $i = 0; + my $target; + my $target_sha256; + my $target_uri; + my $target_time; + my $target_line; + + 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 + $target_sha256 = get_sha256_sum($target); + + $target_uri = $fi1 . '/' . $fi2 . '/' . $fi3; + $target_time = (stat $target)[9]; + + $target_line = generate_rss_item($target, $target_uri, $target_time, $target_sha256); + + $Array[$i] = ([$target_time, $target_line]); + $i++; + die "maxlimit $maxlimit reached!" unless ($i < $maxlimit); + } + closedir($D3); + } + closedir($D2); } - closedir($D2); + closedir($D1); + return sort { @$a[0] <=> @$b[0] } @Array; } -closedir($D1); -# Result = Full XML Codes -my $result = - ' +sub generate_feed($) { + my $scan_dir = shift; + + # Result = Full XML Codes + my $result = ' Privoxy Releases https://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 .= ''; -$result .= "\n"; - -# Sort Array -my @resArray = sort { @$a[0] <=> @$b[0] } @Array; -$i--; -while ($max_advertised_files-- > 0 && $i >= 0) { - $result .= $resArray[$i][1]; - $i--; -} -$result .= ' + my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(); + $result .= + "$days[$wday], $mday $months[$mon] " + . ($year + 1900) + . " $hour:$min:$sec GMT"; + $result .= ''; + $result .= "\n"; + + my @resArray = get_released_files($scan_dir); + my $i = @resArray - 1; + 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); + return $result; +} + +sub main() { + my $scan_dir = shift(@ARGV) + or die "Local package directory not specified (first argument)\n"; + my $save_rss_file = shift(@ARGV) + or die "RSS output file path not specified (second argument)\n"; + + my $result = generate_feed($scan_dir); + + open(my $XMLF, ">", $save_rss_file) or die "Failed to write XML file"; + print $XMLF $result; + close($XMLF); +} + +main(); -- 2.39.2