source: subversion/applications/rendering/tilesAtHome/tahconfig.pm @ 6008

Last change on this file since 6008 was 6005, checked in by deelkar, 13 years ago

improve checks

File size: 10.7 KB
Line 
1use strict; 
2
3#--------------------------------------------------------------------------
4# Reads a tiles@home config file, returns a hash array
5#--------------------------------------------------------------------------
6sub ReadConfig
7{
8    my %Config;
9    while (my $Filename = shift())
10    {
11
12        open(my $fp,"<$Filename") || die("Can't open \"$Filename\" ($!)\n");
13        while(my $Line = <$fp>)
14        {
15            $Line =~ s/#.*$//; # Comments
16            $Line =~ s/\s*$//; # Trailing whitespace
17
18            if($Line =~ m{
19                        ^
20                        \s*
21                        ([A-Za-z0-9._-]+) # Keyword: just one single word no spaces
22                        \s*            # Optional whitespace
23                        =              # Equals
24                        \s*            # Optional whitespace
25                        (.*)           # Value
26                        }x)
27            {
28# Store config options in a hash array
29                $Config{$1} = $2;
30                print "Found $1 ($2)\n" if(0); # debug option
31            }
32        }
33        close $fp;
34    }
35    ApplyConfigLogic(\%Config);
36
37    return %Config;
38}
39
40#--------------------------------------------------------------------------
41# Any application-specific knowledge regarding config file options
42# e.g. correct common errors in config files, or enforce naming conventions
43#--------------------------------------------------------------------------
44sub ApplyConfigLogic
45{
46    my $Config = shift();
47
48    $Config->{"OsmUsername"} =~ s/@/%40/;  # Encode the @-symbol in OSM passwords
49    if (!defined($Config->{"Layers"}))
50    {
51        $Config->{"Layers"} = "default";
52    }
53
54    # check layer configuration and if not present, use sensible defaults
55    foreach my $layer(split(/,/, $Config->{"Layers"}))
56    {
57        $Config->{"Layer.$layer.MaxZoom"} = 17 unless defined($Config->{"Layer.$layer.MaxZoom"});
58
59        for(my $zoom=12; $zoom<=$Config->{"Layer.$layer.MaxZoom"}; $zoom++)
60        {
61            if (!defined($Config->{"Layer.$layer.Rules.$zoom"}))
62            {
63                if ($layer eq "default")
64                {
65                    $Config->{"Layer.$layer.Rules.$zoom"} = "osm-map-features-z$zoom.xml";
66                }
67            }
68        }
69
70        if (!defined($Config->{"Layer.$layer.Prefix"}))
71        {
72            if($layer eq "default")
73            {
74                $Config->{"Layer.$layer.Prefix"} = "tile";
75            }
76        }
77
78        if (!defined($Config->{"Layer.$layer.Preprocessor"}))
79        {
80            if($layer eq "default")
81            {
82                $Config->{"Layer.$layer.Preprocessor"} = "frollo";
83            }
84        }
85
86        if (!defined($Config->{"Layer.$layer.Transparent"}))
87        {
88            $Config->{"Layer.$layer.Transparent"} = 0;
89        }
90
91        if (!defined($Config->{"Layer.$layer.RenderFullTileset"}))
92        {
93            $Config->{"Layer.$layer.RenderFullTileset"} = 0;
94        }
95    }
96
97    ## switch on verbose mode if Debug is set
98    if ($Config->{"Debug"})
99    {
100        $Config->{"Verbose"} = 1;
101    }
102
103    ## check for Pngcrush config option and set to default if not found
104    $Config->{"Pngcrush"} = "pngcrush" unless defined($Config->{"Pngcrush"});
105
106    ## do the same for Zip
107    $Config->{"Zip"} = "zip" unless defined($Config->{"Zip"});
108    $Config->{"7zipWin"} = 0 unless defined($Config->{"7zipWin"});
109
110    if (($Config->{"WorkingDirectory"} !~ /\/$/) and ("MSWin32" ne $^O))
111    {
112        $Config->{"WorkingDirectory"} = $Config->{"WorkingDirectory"} . "/";
113    }
114    elsif (($Config->{"WorkingDirectory"} !~ /\\$/) and ("MSWin32" eq $^O))
115    {
116        $Config->{"WorkingDirectory"} = $Config->{"WorkingDirectory"} . "\\";
117    }
118   
119    ## Set defaults for Batik options
120    $Config->{"Batik"} = "0" unless defined($Config->{"Batik"});
121    $Config->{"BatikJVMSize"} = "1300M" unless defined($Config->{"BatikJVMSize"});
122    $Config->{"BatikPath"} = "batik-rasterizer.jar" unless defined($Config->{"BatikPath"});
123   
124    ## Set defaults for Xmlstarlet options:
125    $Config->{"XmlStarletMaxDepth"} = 20000 unless defined($Config->{"XmlStarletMaxDepth"});
126
127    ## Set default download timeout to 30 minutes
128    $Config->{"DownloadTimeout"} = "1800" unless defined($Config->{"DownloadTimeout"});
129
130    $Config->{"UploadToDirectory"} = 0 unless (defined($Config->{"UploadTargetDirectory"}) and (-d $Config->{"UploadTargetDirectory"}));
131}
132
133#--------------------------------------------------------------------------
134# Checks a tiles@home configuration
135#--------------------------------------------------------------------------
136sub CheckConfig
137{
138    my $Config = shift();
139    my %EnvironmentInfo;
140
141    printf "- Using working directory %s\n", $Config->{"WorkingDirectory"};
142
143    if ($Config->{Batik})
144    {
145        print "- Using Batik";
146        if ($Config->{Batik} == 1)
147        {
148            print " in jar mode";
149        }
150        if ($Config->{Batik} == 2)
151        {
152            print " in wrapper mode";
153        }
154        print "\n";
155    }
156    else
157    {
158        # Inkscape version
159        my $InkscapeV = `\"$Config->{Inkscape}\" --version`;
160        $EnvironmentInfo{Inkscape}=$InkscapeV;
161
162        if($InkscapeV !~ /Inkscape (\d+)\.(\d+\.?\d*)/)
163        {
164            die("Can't find inkscape (using \"$Config->{Inkscape}\")\n");
165        }
166   
167        if($2 < 42.0){
168            die("This version of inkscape ($1.$2) is known not to work with tiles\@home\n");
169        }
170        if($2 < 45.1){
171            print "* Please upgrade to inkscape 0.45.1 due to security problems with your inkscape version:\n"
172        }
173        print "- Inkscape version $1.$2\n";
174    }
175    # XmlStarlet version
176    my $XmlV = `\"$Config->{XmlStarlet}\" --version`;
177    $EnvironmentInfo{Xml}=$XmlV;
178
179    if($XmlV !~ /(\d+\.\d+\.\d+)/){
180        die("Can't find xmlstarlet (using \"$Config->{XmlStarlet}\")\n");
181    }
182    print "- xmlstarlet version $1\n";
183
184    # Zip version
185    my $ZipV = `\"$Config->{Zip}\" -v`;
186    $EnvironmentInfo{Zip}=$ZipV;
187
188    if ($ZipV eq "") 
189    {
190        die("Can't find zip (using \"$Config->{Zip}\")\n");
191    }
192    print "- zip is present\n";
193
194    # PNGCrush version
195    my $PngcrushV = `\"$Config->{Pngcrush}\" -version`;
196    $EnvironmentInfo{Pngcrush}=$PngcrushV;
197
198    if ($PngcrushV !~ /[Pp]ngcrush\s+(\d+\.\d+\.?\d*)/) 
199    {
200        # die here if pngcrush shall be mandatory
201        print "Can't find pngcrush (using \"$Config->{Pngcrush}\")\n";
202    }
203    print "- pngcrush version $1\n";
204
205    if ($Config->{"LocalSlippymap"})
206    {
207        print "- Writing LOCAL slippy map directory hierarchy, no uploading\n";
208    }
209    else
210    {
211        # Upload URL, username
212        printf "- Uploading with username \"$Config->{UploadUsername}\"\n", ;
213        if($Config->{"UploadPassword"} =~ /\W/){
214            die("Check your upload password\n");
215        }
216
217        if ($Config->{"UploadURL2"})
218        {
219            if(($Config->{"UploadURL"} ne $Config->{"UploadURL2"}) and ($Config->{"UploadURL"}))
220            {
221                print "! Please use only UploadURL in the config, this is the default setting";
222            }
223        }
224
225        if( ($Config->{"UploadChunkSize"}*1024*1024) > ($Config->{"ZipHardLimit"}*1000*1000)){
226            die("! Upload chunks may be too large for server\n");
227        }
228
229        if($Config->{"UploadChunkSize"} < 0.2){
230            $Config->{"UploadChunkSize"} = 2;
231            print "! Using default upload chunk size of 2.0 MB\n";
232        }
233
234        # $Config->{"UploadURL2"};
235
236        if($Config->{"DeleteZipFilesAfterUpload"}){
237            print "- Deleting ZIP files after upload\n";
238        }
239    }
240
241    if ($Config->{"UploadToDirectory"})
242    {
243        if (! $Config->{"UseHostnameInZipname"}) 
244        {
245            print " * UseHostnameInZipname should be set when using UploadToDirectory\n";
246        }
247    }
248
249    if($Config->{"RequestUrl"}){
250        print "- Using $Config->{RequestUrl} for Requests\n";
251    }
252
253    # OSM username
254    if (defined($Config->{"OsmUsername"}))
255    {
256        print "- Using OSM username \"$Config->{OsmUsername}\"\n";
257        print "You have set your OSM username in tilesAtHome.conf or authentication.conf. This is no longer necessary, because from the 0.4 API on the API allows map requests without login. It is recommended you remove the option \"OsmUsername\" from the config files\n";
258    }
259    #if($Config->{OsmUsername} !~ /%40/){
260    #    die("OsmUsername should be an email address, with the \@ replaced by %40\n");
261    #}
262
263    if (defined($Config->{"OsmPassword"}))
264    {
265        print "You have set your OSM password in tilesAtHome.conf or authentication.conf. It is recommended you remove the option \"OsmPassword\" from the config files\n";
266
267    }
268
269    # Misc stuff
270    foreach(qw(N S E W)){
271        if($Config->{"Border$_"} > 0.5){
272            printf "Border$_ looks abnormally large\n";
273        }
274    }
275
276    if (defined($Config->{"RenderFullTileset"}))
277    {
278        die "You have the RenderFullTileset option mentioned in one of your config files. This option is no longer supported and has been replaced by a layer-specific option of the same name set in layers.conf. Please remove RenderFullTileset to avoid confusion - ";
279    }
280
281    ## not used any longer, superseded by per-layer value
282    #if($Config->{"MaxZoom"} < 12 || $Config->{"MaxZoom"} > 20){
283    #    print "Check MaxZoom\n";
284    #}
285
286    # layers
287    foreach my $layer(split(/,/, $Config->{"Layers"}))
288    {
289        print "- Configured Layer: $layer\n";
290
291        if ($Config->{"Layer.$layer.MaxZoom"} < 12 || $Config->{"Layer.$layer.MaxZoom"} > 20) 
292        {
293            print "Check Layer.$layer.MaxZoom\n";
294        }
295
296        for(my $zoom=12; $zoom<=$Config->{"Layer.$layer.MaxZoom"}; $zoom++)
297        {
298            if (!defined($Config->{"Layer.$layer.Rules.$zoom"}))
299            {
300                die "config option Layer.$layer.Rules.$zoom is not set";
301            }
302            if (!-f $Config->{"Layer.$layer.Rules.$zoom"})
303            {
304                die "rules file ".$Config->{"Layer.$layer.Rules.$zoom"}.
305                    " referenced by config option Layer.$layer.Rules.$zoom ".
306                    "is not present";
307            }
308        }
309
310        if (!defined($Config->{"Layer.$layer.Prefix"}))
311        {
312            die "config option Layer.$layer.Prefix is not set";
313        }
314
315        # any combination of comma-separated preprocessor names is allowed
316        die "config option Layer.$layer.Preprocessor has invalid value" 
317            if (grep { $_ !~ /frollo|maplint|close-areas|mercator|attribution/} split(/,/, $Config->{"Layer.$layer.Preprocessor"}));
318
319        foreach my $reqfile(split(/,/, $Config->{"Layer.$layer.RequiredFiles"}))
320        {
321            die "file $reqfile required for layer $layer as per config option ".
322                "Layer.$layer.RequiredFiles not found" unless (-f $reqfile);
323        }
324
325    }
326
327    return %EnvironmentInfo;
328
329}
330
3311;
Note: See TracBrowser for help on using the repository browser.