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

Last change on this file since 6939 was 6730, checked in by deelkar, 12 years ago

Add the capability to auto-kill the inkscape preferences file (configurable) and some minor fixes on lowzoom-composite

File size: 11.1 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 subversion
120    $Config->{"SubversionUpdateCmd"} = "up" unless defined($Config->{"SubversionUpdateCmd"});
121    $Config->{"Subversion"} = "svn" unless defined($Config->{"Subversion"});
122   
123    ## Set defaults for inkscape handling
124    $Config->{"AutoResetInkscapePrefs"} = "0" unless defined($Config->{"AutoResetInkscapePrefs"});
125
126    ## Set defaults for Batik options
127    $Config->{"Batik"} = "0" unless defined($Config->{"Batik"});
128    $Config->{"BatikJVMSize"} = "1300M" unless defined($Config->{"BatikJVMSize"});
129    $Config->{"BatikPath"} = "batik-rasterizer.jar" unless defined($Config->{"BatikPath"});
130   
131    ## Set defaults for Xmlstarlet options:
132    $Config->{"XmlStarletMaxDepth"} = 20000 unless defined($Config->{"XmlStarletMaxDepth"});
133
134    ## Set default download timeout to 30 minutes
135    $Config->{"DownloadTimeout"} = "1800" unless defined($Config->{"DownloadTimeout"});
136
137    $Config->{"UploadToDirectory"} = 0 unless (defined($Config->{"UploadTargetDirectory"}) and (-d $Config->{"UploadTargetDirectory"}));
138}
139
140#--------------------------------------------------------------------------
141# Checks a tiles@home configuration
142#--------------------------------------------------------------------------
143sub CheckConfig
144{
145    my $Config = shift();
146    my %EnvironmentInfo;
147
148    printf "- Using working directory %s\n", $Config->{"WorkingDirectory"};
149
150    if ($Config->{Batik})
151    {
152        print "- Using Batik";
153        if ($Config->{Batik} == 1)
154        {
155            print " in jar mode";
156        }
157        if ($Config->{Batik} == 2)
158        {
159            print " in wrapper mode";
160        }
161        print "\n";
162    }
163    else
164    {
165        # Inkscape version
166        my $InkscapeV = `\"$Config->{Inkscape}\" --version`;
167        $EnvironmentInfo{Inkscape}=$InkscapeV;
168
169        if($InkscapeV !~ /Inkscape (\d+)\.(\d+\.?\d*)/)
170        {
171            die("Can't find inkscape (using \"$Config->{Inkscape}\")\n");
172        }
173   
174        if($2 < 42.0){
175            die("This version of inkscape ($1.$2) is known not to work with tiles\@home\n");
176        }
177        if($2 < 45.1){
178            print "* Please upgrade to inkscape 0.45.1 due to security problems with your inkscape version:\n"
179        }
180        print "- Inkscape version $1.$2\n";
181    }
182    # XmlStarlet version
183    my $XmlV = `\"$Config->{XmlStarlet}\" --version`;
184    $EnvironmentInfo{Xml}=$XmlV;
185
186    if($XmlV !~ /(\d+\.\d+\.\d+)/){
187        die("Can't find xmlstarlet (using \"$Config->{XmlStarlet}\")\n");
188    }
189    print "- xmlstarlet version $1\n";
190
191    # Zip version
192    my $ZipV = `\"$Config->{Zip}\" -v`;
193    $EnvironmentInfo{Zip}=$ZipV;
194
195    if ($ZipV eq "") 
196    {
197        die("Can't find zip (using \"$Config->{Zip}\")\n");
198    }
199    print "- zip is present\n";
200
201    # PNGCrush version
202    my $PngcrushV = `\"$Config->{Pngcrush}\" -version`;
203    $EnvironmentInfo{Pngcrush}=$PngcrushV;
204
205    if ($PngcrushV !~ /[Pp]ngcrush\s+(\d+\.\d+\.?\d*)/) 
206    {
207        # die here if pngcrush shall be mandatory
208        print "Can't find pngcrush (using \"$Config->{Pngcrush}\")\n";
209    }
210    print "- pngcrush version $1\n";
211
212    if ($Config->{"LocalSlippymap"})
213    {
214        print "- Writing LOCAL slippy map directory hierarchy, no uploading\n";
215    }
216    else
217    {
218        # Upload URL, username
219        printf "- Uploading with username \"$Config->{UploadUsername}\"\n", ;
220        if($Config->{"UploadPassword"} =~ /\W/){
221            die("Check your upload password\n");
222        }
223
224        if ($Config->{"UploadURL2"})
225        {
226            if(($Config->{"UploadURL"} ne $Config->{"UploadURL2"}) and ($Config->{"UploadURL"}))
227            {
228                print "! Please use only UploadURL in the config, this is the default setting";
229            }
230        }
231
232        if( ($Config->{"UploadChunkSize"}*1024*1024) > ($Config->{"ZipHardLimit"}*1000*1000)){
233            die("! Upload chunks may be too large for server\n");
234        }
235
236        if($Config->{"UploadChunkSize"} < 0.2){
237            $Config->{"UploadChunkSize"} = 2;
238            print "! Using default upload chunk size of 2.0 MB\n";
239        }
240
241        # $Config->{"UploadURL2"};
242
243        if($Config->{"DeleteZipFilesAfterUpload"}){
244            print "- Deleting ZIP files after upload\n";
245        }
246    }
247
248    if ($Config->{"UploadToDirectory"})
249    {
250        if (! $Config->{"UseHostnameInZipname"}) 
251        {
252            print " * UseHostnameInZipname should be set when using UploadToDirectory\n";
253        }
254    }
255
256    if($Config->{"RequestUrl"}){
257        print "- Using $Config->{RequestUrl} for Requests\n";
258    }
259
260    # OSM username
261    if (defined($Config->{"OsmUsername"}))
262    {
263        print "- Using OSM username \"$Config->{OsmUsername}\"\n";
264        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";
265    }
266    #if($Config->{OsmUsername} !~ /%40/){
267    #    die("OsmUsername should be an email address, with the \@ replaced by %40\n");
268    #}
269
270    if (defined($Config->{"OsmPassword"}))
271    {
272        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";
273
274    }
275
276    # Misc stuff
277    foreach(qw(N S E W)){
278        if($Config->{"Border$_"} > 0.5){
279            printf "Border$_ looks abnormally large\n";
280        }
281    }
282
283    if (defined($Config->{"RenderFullTileset"}))
284    {
285        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 - ";
286    }
287
288    ## not used any longer, superseded by per-layer value
289    #if($Config->{"MaxZoom"} < 12 || $Config->{"MaxZoom"} > 20){
290    #    print "Check MaxZoom\n";
291    #}
292
293    # layers
294    foreach my $layer(split(/,/, $Config->{"Layers"}))
295    {
296        print "- Configured Layer: $layer\n";
297
298        if ($Config->{"Layer.$layer.MaxZoom"} < 12 || $Config->{"Layer.$layer.MaxZoom"} > 20) 
299        {
300            print "Check Layer.$layer.MaxZoom\n";
301        }
302
303        for(my $zoom=12; $zoom<=$Config->{"Layer.$layer.MaxZoom"}; $zoom++)
304        {
305            if (!defined($Config->{"Layer.$layer.Rules.$zoom"}))
306            {
307                die "config option Layer.$layer.Rules.$zoom is not set";
308            }
309            if (!-f $Config->{"Layer.$layer.Rules.$zoom"})
310            {
311                die "rules file ".$Config->{"Layer.$layer.Rules.$zoom"}.
312                    " referenced by config option Layer.$layer.Rules.$zoom ".
313                    "is not present";
314            }
315        }
316
317        if (!defined($Config->{"Layer.$layer.Prefix"}))
318        {
319            die "config option Layer.$layer.Prefix is not set";
320        }
321
322        # any combination of comma-separated preprocessor names is allowed
323        die "config option Layer.$layer.Preprocessor has invalid value" 
324            if (grep { $_ !~ /frollo|maplint|close-areas|mercator|attribution/} split(/,/, $Config->{"Layer.$layer.Preprocessor"}));
325
326        foreach my $reqfile(split(/,/, $Config->{"Layer.$layer.RequiredFiles"}))
327        {
328            die "file $reqfile required for layer $layer as per config option ".
329                "Layer.$layer.RequiredFiles not found" unless (-f $reqfile);
330        }
331
332    }
333
334    return %EnvironmentInfo;
335
336}
337
3381;
Note: See TracBrowser for help on using the repository browser.