create-package-feed.pl: Add some new lines in output file
[privoxy.git] / utils / create-package-feed.pl
1 #!/usr/local/bin/perl
2 #< LICENSE: WTFPL >
3 use warnings;
4 use strict;
5 use Digest::SHA;
6 my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
7 my @days   = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
8
9 #< Config START >
10 my $scan_dir = shift(@ARGV)
11     or die "Local package directory not specified (first argument)\n";
12 my $save_rss_file = shift(@ARGV)
13     or die "RSS output file path not specified (second argument)\n";
14 my $base_dlurl = 'https://www.privoxy.org/sf-download-mirror/';
15 my $maxlimit = 1000;
16 my $max_advertised_files = 100;
17
18 #< Config END >
19
20 my @Array = ();
21 my $i     = 0;
22 my $sec;
23 my $min;
24 my $hour;
25 my $mday;
26 my $mon;
27 my $year;
28 my $wday;
29 my $yday;
30 my $isdst;
31 my $target;
32 my $target_sha256;
33 my $target_uri;
34 my $target_time;
35 my $target_line;
36
37 #
38 # 1st & 2nd directory should NOT contain ANY 'FILES'. (expecting only 'Directory')
39 #
40 opendir(my $D1, $scan_dir) or die "Can't open 1st directory! /";
41 while (my $fi1 = readdir($D1)) {
42     next if ($fi1 =~ m/^\./);
43
44     next if ($fi1 eq 'OldFiles' or $fi1 eq 'pkgsrc');
45     opendir(my $D2, $scan_dir . $fi1 . '/')
46         or die "Can't open 2nd directory! /$fi1";
47     while (my $fi2 = readdir($D2)) {
48         next if ($fi2 =~ m/^\./);
49
50 ## start listing /OS/Version/FILE
51         opendir(my $D3, $scan_dir . $fi1 . '/' . $fi2 . '/')
52             or die "Can't open 3rd directory! /$fi1/$fi2";
53         while (my $fi3 = readdir($D3)) {
54             next if ($fi3 =~ m/^\./);
55             $target = $scan_dir . $fi1 . '/' . $fi2 . '/' . $fi3;
56             next if (!-e $target);    # skip if file is not exist
57
58             # Get SHA-256 hash
59             my $filedata;
60             open($filedata, "<", $target)
61                 or die "Can't open '$target' to generate checksum $!";
62             my $sha256 = Digest::SHA->new("SHA-256");
63             $sha256->addfile($filedata);
64             close($filedata);
65             $target_sha256 = $sha256->hexdigest;
66
67             # URI and Time
68             $target_uri  = $fi1 . '/' . $fi2 . '/' . $fi3;
69             my $escaped_target_uri = $target_uri;
70             $escaped_target_uri =~ s@ @%20@g;
71             $target_time = (stat $target)[9];
72
73             # RSS line
74             $target_line =
75                 '<item><title><![CDATA[' . $target_uri . ']]></title>';
76             $target_line .=
77                   '<description><![CDATA['
78                 . $target_uri
79                 . ' (SHA-256: '
80                 . $target_sha256
81                 . ')]]></description>';
82             $target_line .=
83                   '<link>'
84                 . $base_dlurl
85                 . $escaped_target_uri
86                 . '</link><guid>'
87                 . $base_dlurl
88                 . $escaped_target_uri
89                 . '</guid>';
90             $target_line .= '<pubDate>';
91             ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
92                 gmtime($target_time);
93             $target_line .= sprintf("%s, %s %s %d %.2d:%.2d:%.2d GMT",
94                 $days[$wday], $mday, $months[$mon], ($year + 1900),
95                 $hour, $min, $sec);
96             $target_line .= '</pubDate></item>';
97             $target_line .= "\n";
98
99             # Add it to Array
100             $Array[$i] = ([$target_time, $target_line]);
101             $i++;
102             die "maxlimit $maxlimit reached!" unless ($i < $maxlimit);
103         }
104         closedir($D3);
105 ## end listing /OS/Version/FILE
106
107     }
108     closedir($D2);
109
110 }
111 closedir($D1);
112
113 # Result = Full XML Codes
114 my $result =
115     '<?xml version="1.0" encoding="utf-8"?>
116  <rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
117   <channel>
118    <title>Privoxy Releases</title>
119    <link>https://www.privoxy.org/announce.txt</link>
120    <description><![CDATA[Privoxy Releases RSS feed]]></description>
121    <pubDate>';
122 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime();
123 $result .=
124       "$days[$wday], $mday $months[$mon] "
125     . ($year + 1900)
126     . " $hour:$min:$sec GMT";
127 $result .= '</pubDate>';
128 $result .= "\n";
129
130 # Sort Array
131 my @resArray = sort { @$a[0] <=> @$b[0] } @Array;
132 $i--;
133 while ($max_advertised_files-- > 0 && $i >= 0) {
134     $result .= $resArray[$i][1];
135     $i--;
136 }
137 $result .= '  </channel>
138    </rss>';
139
140 # Save it.
141 open(my $XMLF, ">", $save_rss_file) or die "Failed to write XML file";
142 print $XMLF $result;
143 close($XMLF);