1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 | #!/usr/bin/perl
# ------------------------------------------------------------------------------------
# Program for downloading XPlanet cloud images from a random mirror
#
# Copyright (c) 2003, cueSim Ltd. http://www.cueSim.com, Bedford, UK
#
# ------------------------------------------------------------------------------------
#
# Redistribution and use, with or without modification, are permitted provided
# that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Neither the cueSim name nor the names of its contributors may
# be used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
# SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# download table updated 17 JANUARY 2009
use LWP::Simple;
# Set options:
# - where to save the downloaded file (default is current directory)
my $Filename = "clouds.jpg";
# - how often the image is updated on the server
my $MaxDownloadFrequencyHours = 2;
# - how many times to retry, if the server doesn't respond
my $MaxRetries = 3;
## Note: excessive requests to a single image server is discouraged.
## This script limits max retries, does not download more frequently
## than every two hours (the file is generated every 3 hours). and
## picks a random mirror location for every download.
##
## Change these settings at the risk of being blacklisted from the
## image servers.
# Get file details
if(-f $Filename)
{
my @Stats = stat($Filename);
my $FileAge = (time() - $Stats[9]);
my $FileSize = $Stats[7];
# Check if file is already up to date
if($FileAge < 60 * 60 * $MaxDownloadFrequencyHours && $FileSize > 200000)
{
print "File is already up to date\n";
exit(1);
}
}
# Try several times to download the file if necessary
for(1..$MaxRetries)
{
# Get a random website to hit for the file
my $MirrorURL = GetRandomMirror("mirrors.txt");
# Download the file
print "Using $MirrorURL\nDownloading...\n";
my $Response = getstore($MirrorURL, $Filename);
# If successfully downloaded, that's it, nothing more to do
if( IndicatesSuccess($Response))
{
print "Finished: file successfully downloaded to $Filename\n";
exit(0);
}
# Warning that we're retrying another random server
print "Download not available, trying another website\n\n";
}
# Warning that no servers could be contacted
print "ERROR: Tried to download the file $MaxRetries times, but no servers could provide the file\n";
exit(2);
# Return codes of 200 to 299 are "success" in HTTP-speak
sub IndicatesSuccess()
{
my $Response = shift();
if($Response =~ /2\d\d/)
{
return(1);
}
else
{
return(0);
}
}
# Returns the name of an internet resource which can provide the clouds image
sub GetRandomMirror()
{
# Populate a list of mirrors
my @Mirrors = (
"http://xplanet-sydney.inside.net/clouds_2048.jpg",
"http://xplanet-lasvegas.inside.net/clouds_2048.jpg",
"http://home.megapass.co.kr/~gitto88/cloud_data/clouds_2048.jpg",
"http://home.megapass.co.kr/~holywatr/cloud_data/clouds_2048.jpg",
"http://www.wizabit.eclipse.co.uk/xplanet/files/mirror/clouds_2048.jpg",
"ftp://ftp.iastate.edu/pub/xplanet/clouds_2048.jpg",
"http://xplanet.explore-the-world.net/clouds_2048.jpg");
# Return one at random
return $Mirrors[rand scalar(@Mirrors)];
}
|