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

Revision 2610, 7.5 KB checked in by frederik, 7 years ago (diff)

Added a new configuration option called LocalSlippymap?. If set to 1,
files will be created in a tree structure (WorkingDir?/layerPrefix/zoomLevel/x/y.png)
directly suitable for using in an "likeGoogle" layer with OpenLayers?. Uploads
are disabled in that mode, as is retrieving requests from the queue.

Line 
1use strict; 
2
3#--------------------------------------------------------------------------
4# Reads a tiles@home config file, returns a hash array
5#--------------------------------------------------------------------------
6sub ReadConfig{
7    my %Config;
8    while (my $Filename = shift()){
9
10        open(my $fp,"<$Filename") || die("Can't open \"$Filename\" ($!)\n");
11        while(my $Line = <$fp>){
12            $Line =~ s/#.*$//; # Comments
13                $Line =~ s/\s*$//; # Trailing whitespace
14
15                if($Line =~ m{
16                        ^
17                        \s*
18                        ([A-Za-z0-9._-]+) # Keyword: just one single word no spaces
19                        \s*            # Optional whitespace
20                        =              # Equals
21                        \s*            # Optional whitespace
22                        (.*)           # Value
23                        }x){
24
25# Store config options in a hash array
26                    $Config{$1} = $2;
27                    print "Found $1 ($2)\n" if(0); # debug option
28                }
29        }
30        close $fp;
31
32    }
33    ApplyConfigLogic(\%Config);
34
35    return %Config;
36}
37
38#--------------------------------------------------------------------------
39# Any application-specific knowledge regarding config file options
40# e.g. correct common errors in config files, or enforce naming conventions
41#--------------------------------------------------------------------------
42sub ApplyConfigLogic{
43    my $Config = shift();
44
45    $Config->{OsmUsername} =~ s/@/%40/;  # Encode the @-symbol in OSM passwords
46    if (!defined($Config->{"Layers"}))
47    {
48        $Config->{"Layers"} = "default";
49    }
50
51    # check layer configuration and if not present, use sensible defaults
52    foreach my $layer(split(/,/, $Config->{"Layers"}))
53    {
54        $Config->{"Layer.$layer.MaxZoom"} = 17 unless defined($Config->{"Layer.$layer.MaxZoom"});
55
56        for(my $zoom=12; $zoom<=$Config->{"Layer.$layer.MaxZoom"}; $zoom++)
57        {
58            if (!defined($Config->{"Layer.$layer.Rules.$zoom"}))
59            {
60                if ($layer eq "default")
61                {
62                    $Config->{"Layer.$layer.Rules.$zoom"} = "osm-map-features-z$zoom.xml";
63                }
64            }
65        }
66
67        if (!defined($Config->{"Layer.$layer.Prefix"}))
68        {
69            if($layer eq "default")
70            {
71                $Config->{"Layer.$layer.Prefix"} = "tile";
72            }
73        }
74
75        if (!defined($Config->{"Layer.$layer.Preprocessor"}))
76        {
77            if($layer eq "default")
78            {
79                $Config->{"Layer.$layer.Preprocessor"} = "frollo";
80            }
81        }
82    }
83}
84
85#--------------------------------------------------------------------------
86# Checks a tiles@home configuration
87#--------------------------------------------------------------------------
88sub CheckConfig{
89    my %Config = @_;
90    my %EnvironmentInfo;
91
92    printf "- Using working directory %s\n", $Config{"WorkingDirectory"};
93
94    # Inkscape version
95    my $InkscapeV = `$Config{Inkscape} --version`;
96    $EnvironmentInfo{Inkscape}=$InkscapeV;
97
98    if($InkscapeV !~ /Inkscape (\d+)\.(\d+\.?\d*)/)
99    {
100        die("Can't find inkscape (using \"$Config{Inkscape}\")\n");
101    }
102
103    if($2 < 42.0){
104        die("This version of inkscape ($1) is known not to work with tiles\@home\n");
105    }
106    if($2 < 45.1){
107        print "* Please upgrade to inkscape 0.45.1 due to security problems with your inkscape version:\n"
108    }
109    print "- Inkscape version $1.$2\n";
110
111    # XmlStarlet version
112    my $XmlV = `$Config{XmlStarlet} --version`;
113    $EnvironmentInfo{Xml}=$XmlV;
114
115    if($XmlV !~ /(\d+\.\d+\.\d+)/){
116        die("Can't find xmlstarlet (using \"$Config{XmlStarlet}\")\n");
117    }
118    print "- xmlstarlet version $1\n";
119
120    # Zip version
121    $Config{Zip} = "zip" unless defined($Config{Zip});
122    my $ZipV = `$Config{Zip} -v`;
123    $EnvironmentInfo{Zip}=$ZipV;
124
125    if ($ZipV eq "") 
126    {
127        die("Can't find zip (using \"$Config{Zip}\")\n");
128    }
129    print "- zip is present\n";
130
131    # PNGCrush version
132    $Config{Pngcrush} = "pngcrush" unless defined($Config{Pngcrush});
133    my $PngcrushV = `$Config{Pngcrush} -version`;
134    $EnvironmentInfo{Pngcrush}=$PngcrushV;
135
136    if ($PngcrushV !~ /[Pp]ngcrush\s+(\d+\.\d+\.?\d*)/) 
137    {
138        # die here if pngcrush shall be mandatory
139        print "Can't find pngcrush (using \"$Config{Pngcrush}\")\n";
140    }
141    print "- pngcrush version $1\n";
142
143    if ($Config{"LocalSlippymap"})
144    {
145        print "- Writing LOCAL slippy map directory hierarchy, no uploading\n";
146    }
147    else
148    {
149        # Upload URL, username
150        printf "- Uploading with username \"$Config{UploadUsername}\"\n", ;
151        if($Config{"UploadPassword"} =~ /\W/){
152            die("Check your upload password\n");
153        }
154
155        if($Config{"UploadURL"} ne $Config{"UploadURL2"})
156        {
157            printf "! Please set UploadURL to %s, this will become the default ".
158                "UploadURL soon\n", $Config{"UploadURL2"};
159        } 
160        if($Config{"UploadChunkSize"} > 2){
161            print "! Upload chunks may be too large for server\n";
162        }
163
164        if($Config{"UploadChunkSize"} < 0.1){
165            $Config{"UploadChunkSize"} = 1;
166            print "! Using default upload chunk size of 1.0 MB\n";
167        }
168
169        # $Config{"UploadURL2"};
170
171        if($Config{"DeleteZipFilesAfterUpload"}){
172            print "- Deleting ZIP files after upload\n";
173        }
174    }
175
176    if($Config{"RequestUrl"}){
177        print "- Using $Config{RequestUrl} for Requests\n";
178    }
179
180    # OSM username
181    if($Config{OsmUsername} !~ /%40/){
182        die("OsmUsername should be an email address, with the \@ replaced by %40\n");
183    }
184    print "- Using OSM username \"$Config{OsmUsername}\"\n";
185
186    # $Config{"OsmPassword"};
187
188    # Misc stuff
189    foreach(qw(N S E W)){
190        if($Config{"Border$_"} > 0.2){
191            printf "Border$_ looks abnormally large\n";
192        }
193    }
194
195    # not used any longer, superseded by per-layer value
196    if($Config{"MaxZoom"} < 12 || $Config{"MaxZoom"} > 20){
197        print "Check MaxZoom\n";
198    }
199
200    # layers
201    foreach my $layer(split(/,/, $Config{"Layers"}))
202    {
203        print "- Configured Layer: $layer\n";
204
205        if ($Config{"Layer.$layer.MaxZoom"} < 12 || $Config{"Layer.$layer.MaxZoom"} > 20) 
206        {
207            print "Check Layer.$layer.MaxZoom\n";
208        }
209
210        for(my $zoom=12; $zoom<=$Config{"Layer.$layer.MaxZoom"}; $zoom++)
211        {
212            if (!defined($Config{"Layer.$layer.Rules.$zoom"}))
213            {
214                die "config option Layer.$layer.Rules.$zoom is not set";
215            }
216            if (!-f $Config{"Layer.$layer.Rules.$zoom"})
217            {
218                die "rules file ".$Config{"Layer.$layer.Rules.$zoom"}.
219                    " referenced by config option Layer.$layer.Rules.$zoom ".
220                    "is not present";
221            }
222        }
223
224        if (!defined($Config{"Layer.$layer.Prefix"}))
225        {
226            die "config option Layer.$layer.Prefix is not set";
227        }
228
229        # any combination of comma-separated preprocessor names is allowed
230        die "config option Layer.$layer.Preprocessor has invalid value" 
231            if (grep { $_ !~ /frollo|maplint|close-areas/} split(/,/, $Config{"Layer.$layer.Preprocessor"}));
232
233        foreach my $reqfile(split(/,/, $Config{"Layer.$layer.RequiredFiles"}))
234        {
235            die "file $reqfile required for layer $layer as per config option ".
236                "Layer.$layer.RequiredFiles not found" unless (-f $reqfile);
237        }
238
239    }
240
241    return %EnvironmentInfo;
242
243}
244
2451;
Note: See TracBrowser for help on using the repository browser.