1*b1cdbd2cSJim Jagielski#!/usr/bin/perl -w
2*b1cdbd2cSJim Jagielski
3*b1cdbd2cSJim Jagielski#**************************************************************
4*b1cdbd2cSJim Jagielski#
5*b1cdbd2cSJim Jagielski#  Licensed to the Apache Software Foundation (ASF) under one
6*b1cdbd2cSJim Jagielski#  or more contributor license agreements.  See the NOTICE file
7*b1cdbd2cSJim Jagielski#  distributed with this work for additional information
8*b1cdbd2cSJim Jagielski#  regarding copyright ownership.  The ASF licenses this file
9*b1cdbd2cSJim Jagielski#  to you under the Apache License, Version 2.0 (the
10*b1cdbd2cSJim Jagielski#  "License"); you may not use this file except in compliance
11*b1cdbd2cSJim Jagielski#  with the License.  You may obtain a copy of the License at
12*b1cdbd2cSJim Jagielski#
13*b1cdbd2cSJim Jagielski#    http://www.apache.org/licenses/LICENSE-2.0
14*b1cdbd2cSJim Jagielski#
15*b1cdbd2cSJim Jagielski#  Unless required by applicable law or agreed to in writing,
16*b1cdbd2cSJim Jagielski#  software distributed under the License is distributed on an
17*b1cdbd2cSJim Jagielski#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18*b1cdbd2cSJim Jagielski#  KIND, either express or implied.  See the License for the
19*b1cdbd2cSJim Jagielski#  specific language governing permissions and limitations
20*b1cdbd2cSJim Jagielski#  under the License.
21*b1cdbd2cSJim Jagielski#
22*b1cdbd2cSJim Jagielski#**************************************************************
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielskiuse LWP::UserAgent;
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielskiuse strict;
27*b1cdbd2cSJim Jagielski
28*b1cdbd2cSJim Jagielski=head1 NAME
29*b1cdbd2cSJim Jagielski
30*b1cdbd2cSJim Jagielski    patch_make_releases_xml.pl - Create a section for the instsetoo_native/data/releases.xml file.
31*b1cdbd2cSJim Jagielski
32*b1cdbd2cSJim Jagielski=head1 SYNOPSIS
33*b1cdbd2cSJim Jagielski
34*b1cdbd2cSJim Jagielski    patch_make_releases_xml.pl <version-number>
35*b1cdbd2cSJim Jagielski
36*b1cdbd2cSJim Jagielski        version-number is the version number (eg 4.0.1) for which to create the releases.xml file.
37*b1cdbd2cSJim Jagielski
38*b1cdbd2cSJim Jagielski=head1 DESCRIPTION
39*b1cdbd2cSJim Jagielski
40*b1cdbd2cSJim Jagielski    Will contact http://archive.apache.org/dist/openoffice/<version-number>/binaries/ and
41*b1cdbd2cSJim Jagielski    a) determine the set of languages
42*b1cdbd2cSJim Jagielski    b) collect sizes and sha256 check sums for all Windows installation sets.
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielski    The result is printed to the console.  It has to be added manually to releases.xml.
45*b1cdbd2cSJim Jagielski
46*b1cdbd2cSJim Jagielski=cut
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski
49*b1cdbd2cSJim Jagielskiif (scalar @ARGV != 1)
50*b1cdbd2cSJim Jagielski{
51*b1cdbd2cSJim Jagielski    print STDERR "usage: $0 <version-number>\n";
52*b1cdbd2cSJim Jagielski    die;
53*b1cdbd2cSJim Jagielski}
54*b1cdbd2cSJim Jagielski
55*b1cdbd2cSJim Jagielskimy $version = $ARGV[0];
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielskiprint <<EOT;
58*b1cdbd2cSJim Jagielski<?xml version='1.0' encoding='UTF-8'?>
59*b1cdbd2cSJim Jagielski<!--***********************************************************
60*b1cdbd2cSJim Jagielski *
61*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
62*b1cdbd2cSJim Jagielski * or more contributor license agreements.  See the NOTICE file
63*b1cdbd2cSJim Jagielski * distributed with this work for additional information
64*b1cdbd2cSJim Jagielski * regarding copyright ownership.  The ASF licenses this file
65*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
66*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
67*b1cdbd2cSJim Jagielski * with the License.  You may obtain a copy of the License at
68*b1cdbd2cSJim Jagielski *
69*b1cdbd2cSJim Jagielski *   http://www.apache.org/licenses/LICENSE-2.0
70*b1cdbd2cSJim Jagielski *
71*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
72*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
73*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
74*b1cdbd2cSJim Jagielski * KIND, either express or implied.  See the License for the
75*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
76*b1cdbd2cSJim Jagielski * under the License.
77*b1cdbd2cSJim Jagielski *
78*b1cdbd2cSJim Jagielski ***********************************************************-->
79*b1cdbd2cSJim JagielskiEOT
80*b1cdbd2cSJim Jagielski
81*b1cdbd2cSJim Jagielskisub DownloadFile ($)
82*b1cdbd2cSJim Jagielski{
83*b1cdbd2cSJim Jagielski    my $url = shift;
84*b1cdbd2cSJim Jagielski
85*b1cdbd2cSJim Jagielski    my $agent = LWP::UserAgent->new();
86*b1cdbd2cSJim Jagielski    $agent->timeout(120);
87*b1cdbd2cSJim Jagielski    $agent->show_progress(0);
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski    my $file_content = "";
90*b1cdbd2cSJim Jagielski    my $last_was_redirect = 0;
91*b1cdbd2cSJim Jagielski    my $bytes_read = 0;
92*b1cdbd2cSJim Jagielski    $agent->add_handler('response_redirect'
93*b1cdbd2cSJim Jagielski        => sub{
94*b1cdbd2cSJim Jagielski            $last_was_redirect = 1;
95*b1cdbd2cSJim Jagielski            return;
96*b1cdbd2cSJim Jagielski        });
97*b1cdbd2cSJim Jagielski    $agent->add_handler('response_data'
98*b1cdbd2cSJim Jagielski        => sub{
99*b1cdbd2cSJim Jagielski            if ($last_was_redirect)
100*b1cdbd2cSJim Jagielski            {
101*b1cdbd2cSJim Jagielski                $last_was_redirect = 0;
102*b1cdbd2cSJim Jagielski                # Throw away the data we got so far.
103*b1cdbd2cSJim Jagielski		$file_content = "";
104*b1cdbd2cSJim Jagielski            }
105*b1cdbd2cSJim Jagielski            my($response,$agent,$h,$data)=@_;
106*b1cdbd2cSJim Jagielski	    $file_content .= $data;
107*b1cdbd2cSJim Jagielski        });
108*b1cdbd2cSJim Jagielski    $agent->get($url);
109*b1cdbd2cSJim Jagielski
110*b1cdbd2cSJim Jagielski    return $file_content;
111*b1cdbd2cSJim Jagielski}
112*b1cdbd2cSJim Jagielski
113*b1cdbd2cSJim Jagielski
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski
116*b1cdbd2cSJim Jagielskisub GetResponse ($)
117*b1cdbd2cSJim Jagielski{
118*b1cdbd2cSJim Jagielski    my $url = shift;
119*b1cdbd2cSJim Jagielski
120*b1cdbd2cSJim Jagielski    my $agent = LWP::UserAgent->new();
121*b1cdbd2cSJim Jagielski    $agent->timeout(120);
122*b1cdbd2cSJim Jagielski    $agent->show_progress(0);
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielski    my $file_content = "";
125*b1cdbd2cSJim Jagielski    my $last_was_redirect = 0;
126*b1cdbd2cSJim Jagielski    my $bytes_read = 0;
127*b1cdbd2cSJim Jagielski    $agent->add_handler('response_redirect'
128*b1cdbd2cSJim Jagielski        => sub{
129*b1cdbd2cSJim Jagielski            $last_was_redirect = 1;
130*b1cdbd2cSJim Jagielski            return;
131*b1cdbd2cSJim Jagielski        });
132*b1cdbd2cSJim Jagielski    $agent->add_handler('response_data'
133*b1cdbd2cSJim Jagielski        => sub{
134*b1cdbd2cSJim Jagielski            if ($last_was_redirect)
135*b1cdbd2cSJim Jagielski            {
136*b1cdbd2cSJim Jagielski                $last_was_redirect = 0;
137*b1cdbd2cSJim Jagielski                # Throw away the data we got so far.
138*b1cdbd2cSJim Jagielski		$file_content = "";
139*b1cdbd2cSJim Jagielski            }
140*b1cdbd2cSJim Jagielski            my($response,$agent,$h,$data)=@_;
141*b1cdbd2cSJim Jagielski	    $file_content .= $data;
142*b1cdbd2cSJim Jagielski        });
143*b1cdbd2cSJim Jagielski    return $agent->get($url, 'Range' => "bytes=0-0");
144*b1cdbd2cSJim Jagielski}
145*b1cdbd2cSJim Jagielski
146*b1cdbd2cSJim Jagielskimy @languages = ();
147*b1cdbd2cSJim Jagielskimy @lines = split(/\n/, DownloadFile("http://archive.apache.org/dist/openoffice/".$version."/binaries/"));
148*b1cdbd2cSJim Jagielskiforeach my $line (@lines)
149*b1cdbd2cSJim Jagielski{
150*b1cdbd2cSJim Jagielski    next unless $line =~ /folder.gif/;
151*b1cdbd2cSJim Jagielski    if ($line =~ /a href=\"([^\"\/]+)\/\"/)
152*b1cdbd2cSJim Jagielski    {
153*b1cdbd2cSJim Jagielski	my $language = $1;
154*b1cdbd2cSJim Jagielski	next if $language eq "SDK";
155*b1cdbd2cSJim Jagielski	next if $language =~ /^[A-Z]/;
156*b1cdbd2cSJim Jagielski	push @languages, $language;
157*b1cdbd2cSJim Jagielski    }
158*b1cdbd2cSJim Jagielski}
159*b1cdbd2cSJim Jagielski
160*b1cdbd2cSJim Jagielskiprint "<releases>\n";
161*b1cdbd2cSJim Jagielskiprint "  <release>\n";
162*b1cdbd2cSJim Jagielskiprintf "    <version>%s</version>\n", $version;
163*b1cdbd2cSJim Jagielskiprint "    <download>\n";
164*b1cdbd2cSJim Jagielskiprint "      <package-format>msi</package-format>\n";
165*b1cdbd2cSJim Jagielskiprint "      <url-template>\n";
166*b1cdbd2cSJim Jagielskiprintf "        http://archive.apache.org/dist/openoffice/%s/binaries/%%L/Apache_OpenOffice_%s_Win_x86_install_%%L.exe\n",$version, $version;
167*b1cdbd2cSJim Jagielskiprint "      </url-template>\n";
168*b1cdbd2cSJim Jagielskiforeach my $language (sort @languages)
169*b1cdbd2cSJim Jagielski{
170*b1cdbd2cSJim Jagielski    print "      <item>\n";
171*b1cdbd2cSJim Jagielski    printf "        <language>%s</language>\n", $language;
172*b1cdbd2cSJim Jagielski    my $name = sprintf(
173*b1cdbd2cSJim Jagielski	"Apache_OpenOffice_%s_Win_x86_install_%s.exe",
174*b1cdbd2cSJim Jagielski	$version,
175*b1cdbd2cSJim Jagielski	$language,
176*b1cdbd2cSJim Jagielski	$version,
177*b1cdbd2cSJim Jagielski	$language);
178*b1cdbd2cSJim Jagielski
179*b1cdbd2cSJim Jagielski    my $content = DownloadFile(
180*b1cdbd2cSJim Jagielski	sprintf("http://archive.apache.org/dist/openoffice/%s/binaries/%s/%s.sha256", $version, $language, $name));
181*b1cdbd2cSJim Jagielski    if ($content =~ /^([a-f0-9]+)/)
182*b1cdbd2cSJim Jagielski    {
183*b1cdbd2cSJim Jagielski	printf("        <checksum type=\"sha256\">%s</checksum>\n", $1);
184*b1cdbd2cSJim Jagielski    }
185*b1cdbd2cSJim Jagielski    my $response = GetResponse(
186*b1cdbd2cSJim Jagielski	sprintf("http://archive.apache.org/dist/openoffice/%s/binaries/%s/%s", $version, $language, $name));
187*b1cdbd2cSJim Jagielski    my $content_range = $response->{'_headers'}->{'content-range'};
188*b1cdbd2cSJim Jagielski    if ($content_range =~ /bytes 0-0\/(\d+)/)
189*b1cdbd2cSJim Jagielski    {
190*b1cdbd2cSJim Jagielski	printf("        <size>%s</size>\n", $1);
191*b1cdbd2cSJim Jagielski    }
192*b1cdbd2cSJim Jagielski    print "      </item>\n";
193*b1cdbd2cSJim Jagielski}
194*b1cdbd2cSJim Jagielski
195*b1cdbd2cSJim Jagielskiprint "    </download>\n";
196*b1cdbd2cSJim Jagielskiprint "  </release>\n";
197*b1cdbd2cSJim Jagielskiprint "</releases>\n";
198