X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=utils%2Fcreate-package-feed.pl;h=68781adbf450d49fbf12e3b3b790c662ebb5afc3;hp=1db8d64b5bbfbbaf3dad62a3cfe70c7c44d97867;hb=c5b8825873c2e08323d2521afab84a959bfa7248;hpb=602fb5343ffef4dd27f0e2c8e856b961ce822250 diff --git a/utils/create-package-feed.pl b/utils/create-package-feed.pl old mode 100644 new mode 100755 index 1db8d64b..68781adb --- a/utils/create-package-feed.pl +++ b/utils/create-package-feed.pl @@ -1,80 +1,180 @@ #!/usr/local/bin/perl -#< LICENSE: WTFPL > + +############################################################################ +# create-package-feed.pl +# +# Generates an RSS feed for the released files. +# +# Usage: +# create-package-feed.pl "path/to/release/files" "path/to/rss/outputfile" +# +# Copyright (c) 2016 "Unknown", Fabian Keil +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +############################################################################ + 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=10; -#< 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 (D1,$scan_dir) or die "Can't open 1st directory! /"; -MOUT: while (my $fi1=readdir(D1)){ -next if ($fi1 =~ m/^\./); - -opendir (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 (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; -unless (open $filedata,$target){next;} -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='<![CDATA['.$target_uri.']]>'; -$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++; -if ($i>=$maxlimit){last MOUT;} +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); + +my $base_dlurl = 'https://www.privoxy.org/sf-download-mirror/'; +my $max_advertised_files = 100; + +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_uri = $fi1 . '/' . $fi2 . '/' . $fi3; + $target_time = (stat $target)[9]; + + $Array[$i] = ([$target_time, $target, $target_uri]); + + $i++; + } + closedir($D3); + } + closedir($D2); + } + closedir($D1); + + return sort { @$a[0] <=> @$b[0] } @Array; } -closedir D3; -## end listing /OS/Version/FILE +sub generate_feed($) { + my $scan_dir = shift; + + # Result = Full XML Codes + my $result = ' + + + Privoxy Releases + https://www.privoxy.org/announce.txt + + '; + 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) { + my $target_time = $resArray[$i][0]; + my $target = $resArray[$i][1]; + my $target_uri = $resArray[$i][2]; + + my $target_sha256 = get_sha256_sum($target); + + my $rss_item = generate_rss_item($target, $target_uri, $target_time, $target_sha256); + + $result .= $rss_item; + $i--; + } + $result .= ' + '; + + return $result; } -closedir D2; +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); } -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($i>=0){$result.=$resArray[$i][1];$i--;} -$result.=''; -# Save it. -open(XMLF,"> $save_rss_file") or die "Failed to write XML file"; -print XMLF $result; -close(XMLF); + +main();