/[meteor]/googlecode.com/svn/trunk/Meteor/Config.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /googlecode.com/svn/trunk/Meteor/Config.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 46 - (show annotations)
Mon Feb 4 19:24:25 2008 UTC (11 years, 10 months ago) by knops.gerd
File size: 11199 byte(s)
• The ADDMESSAGE response now follows the `OK` with a tab character and the message ID for the newly added message

1 #!/usr/bin/perl -w
2 ###############################################################################
3 # Meteor
4 # An HTTP server for the 2.0 web
5 # Copyright (c) 2006 contributing authors
6 #
7 # Subscriber.pm
8 #
9 # Description:
10 # Meteor Configuration handling.
11 #
12 # Main program should call Meteor::Config::setCommandLineParameters(@ARGV),.
13 # Afterwards anybody can access $::CONF{<parameterName>}, where
14 # <parameterName> is any valid parameter (except 'Help') listed in the
15 # @DEFAULTS array below.
16 #
17 ###############################################################################
18 #
19 # This program is free software; you can redistribute it and/or modify it
20 # under the terms of the GNU General Public License as published by the Free
21 # Software Foundation; either version 2 of the License, or (at your option)
22 # any later version.
23 #
24 # This program is distributed in the hope that it will be useful, but WITHOUT
25 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
26 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
27 # more details.
28 #
29 # You should have received a copy of the GNU General Public License along
30 # with this program; if not, write to the Free Software Foundation, Inc.,
31 # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 #
33 # For more information visit www.meteorserver.org
34 #
35 ###############################################################################
36
37 package Meteor::Config;
38 ###############################################################################
39 # Configuration
40 ###############################################################################
41
42 use strict;
43
44 our @DEFAULTS=(
45 'Configuration file location on disk (if any)',
46 ConfigFileLocation => '/etc/meteord.conf',
47
48 'IP address for controller server (leave empty for all local addresses)',
49 ControllerIP => '',
50
51 'Port number for controller connections',
52 ControllerPort => 4671,
53
54 'Controller Shutdown message, sent when the controller server shuts down (leave empty for no message)',
55 ControllerShutdownMsg => '',
56
57 'Debug Flag, when set daemon will run in foreground and emit debug messages',
58 Debug => 0,
59
60 'Name of index file to serve when a directory is requested from the static file web server',
61 DirectoryIndex => 'index.html',
62
63 'Header template, ~server~, ~servertime~ and ~status~ will be replaced by the appropriate values. **NOTE**: It is possible to define more than one HeaderTemplate by appending a number at the end, for example *HeaderTemplate42*. Clients can request a specific header to be used by adding the parameter template=<number> to their GET request. If *HeaderTemplate<number>* is not found, the system will use the default HeaderTemplate (no number)',
64 HeaderTemplate => 'HTTP/1.1 ~status~\r\nServer: ~server~\r\nContent-Type: text/html; charset=utf-8\r\nPragma: no-cache\r\nCache-Control: no-cache, no-store, must-revalidate\r\nExpires: Thu, 1 Jan 1970 00:00:00 GMT\r\n\r\n<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r\n<meta http-equiv="Cache-Control" content="no-store">\r\n<meta http-equiv="Cache-Control" content="no-cache">\r\n<meta http-equiv="Pragma" content="no-cache">\r\n<meta http-equiv="Expires" content="Thu, 1 Jan 1970 00:00:00 GMT">\r\n<script type="text/javascript">\r\nwindow.onError = null;\r\nvar domainparts = document.domain.split(".");\r\ndocument.domain = domainparts[domainparts.length-2]+"."+domainparts[domainparts.length-1];\r\nparent.Meteor.register(this);\r\n</script>\r\n</head>\r\n<body onload="try { parent.Meteor.reset(this) } catch (e) {}">\r\n',
65
66 'Template for each line in channelinfo',
67
68 ChannelInfoTemplate => '~name~ ~messageCount~ ~lastMsgID~\r\n',
69
70 'Print out this help message',
71 Help => '',
72
73 'Maximum age of a message in seconds',
74 MaxMessageAge => 7200,
75
76 'Maximum number of messages to send to a subscriber before forcing their connection to close. Use 0 to disable',
77 MaxMessages => 0,
78
79 'Maximum number of stored messages per channel',
80 MaxMessagesPerChannel => 250,
81
82 'Maximum duration in seconds for a subscriber connection to exist before forcing a it to close. Note that the server checks for expired connections in 60 second intervals, so small changes to this value will not have much of an effect. Use 0 to disable',
83 MaxTime => 0,
84
85 'Message template, ~text~, ~id~, ~channel~ and ~timestamp~ will be replaced by the appropriate values',
86 MessageTemplate => '<script>p(~id~,"~channel~","~text~");</script>\r\n',
87
88 'Interval at which PingMessage is sent to all persistent and identified subscriber connections (ie those including id=someuniqueidentifier in their request, and not specifying persist=0). Must be at least 3 if set higher than zero. Set to zero to disable.',
89 PingInterval => 5,
90
91 'Persistence of a connection. Note: some modes have this hardcoded!',
92
93 Persist => 0,
94
95 'Message to be sent to all persistent and identified subscriber connections (see above) every PingInterval seconds',
96 PingMessage => '<script>p(-1,"");</script>\r\n',
97
98 'IP address for subscriber server (leave empty for all local addresses)',
99 SubscriberIP => '',
100
101 'Port number for subscriber connections',
102 SubscriberPort => 4670,
103
104 'Subscriber Shutdown message, sent when the subscriber server shuts down (leave empty for no message)',
105 SubscriberShutdownMsg => '<script>eof();</script>\r\n',
106
107 'An absolute filesystem path, to be used as the document root for Meteor\'s static file web server. If left empty, no documents will be served.',
108 SubscriberDocumentRoot => '/usr/local/meteor/public_html',
109
110 'Since Meteor is capable of serving static pages from a document root as well as streaming events to subscribers, this paramter is used to specify the URI at which the event server can be reached. If set to the root, Meteor will lose the ability to serve static pages.',
111 SubscriberDynamicPageAddress => '/push',
112
113 'The syslog facility to use',
114 SyslogFacility => 'daemon',
115 );
116
117 our %ConfigFileData=();
118 our %CommandLine=();
119 our %Defaults=();
120 our %ExtraKeys=();
121 our %Modes=();
122
123 for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
124 {
125 $Defaults{$DEFAULTS[$i+1]}=$DEFAULTS[$i+2];
126 }
127
128 ###############################################################################
129 # Class methods
130 ###############################################################################
131 sub updateConfig {
132 my $class=shift;
133
134 %::CONF=();
135
136 my $debug=$class->valueForKey('Debug');
137
138 print STDERR '-'x79 ."\nParamters:\nSource \tName and Value\n".'-'x79 ."\n" if($debug);
139
140 my @keys=();
141
142 for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
143 {
144 next if($DEFAULTS[$i+1] eq 'Help');
145 push(@keys,$DEFAULTS[$i+1]);
146 }
147 push(@keys,keys %ExtraKeys);
148
149
150 foreach my $mode ('',keys %Modes)
151 {
152 foreach my $baseKey (@keys)
153 {
154 my $foundValue=0;
155 my $key=$baseKey.$mode;
156
157 if(exists($CommandLine{$key}))
158 {
159 print STDERR "CmdLine" if($debug);
160 $::CONF{$key}=$CommandLine{$key};
161 $foundValue=1;
162 }
163 elsif(exists($ConfigFileData{$key}))
164 {
165 print STDERR "CnfFile" if($debug);
166 $::CONF{$key}=$ConfigFileData{$key};
167 $foundValue=1;
168 }
169 elsif(exists($Defaults{$key}))
170 {
171 print STDERR "Default" if($debug);
172 $::CONF{$key}=$Defaults{$key};
173 $foundValue=1;
174 }
175
176 next unless($foundValue);
177
178 print STDERR "\t$key\t$::CONF{$key}\n" if($debug);
179
180 # Take care of escapes
181 $::CONF{$key}=~s/\\(.)/
182 if($1 eq 'r')
183 {
184 "\r";
185 }
186 elsif($1 eq 'n')
187 {
188 "\n";
189 }
190 elsif($1 eq 's')
191 {
192 ' ';
193 }
194 elsif($1 eq 't')
195 {
196 "\t";
197 }
198 else
199 {
200 $1;
201 }
202 /gex;
203 }
204 }
205 print STDERR '-'x79 ."\n" if($debug);
206 }
207
208 sub valueForKey {
209 my $class=shift;
210 my $key=shift;
211
212 return $CommandLine{$key} if(exists($CommandLine{$key}));
213 return $ConfigFileData{$key} if(exists($ConfigFileData{$key}));
214
215 $Defaults{$key};
216 }
217
218 sub setCommandLineParameters {
219 my $class=shift;
220
221 #
222 # Quick check if we should show the version, if so ignore everything else
223 # Accept -v, -version, and everything in between
224 #
225 foreach my $p (@_)
226 {
227 if(index($p,'-v')==0 && index('-version',$p)==0)
228 {
229 print "$::PGM $::VERSION\n";
230 exit(0);
231 }
232 }
233
234 while(my $cnt=scalar(@_))
235 {
236 my $k=shift(@_);
237 &usage("'$k' invalid") unless($k=~s/^\-(?=.+)//);
238
239 $k='Debug' if($k eq 'd');
240
241 my $mode='';
242
243 if($k=~s/(\..+)$//)
244 {
245 $mode=$1;
246 $Modes{$mode}=1;
247 }
248
249 my $key=undef;
250 my $kl=length($k);
251 my $kOrig=$k;
252 $k=lc($k);
253
254 for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
255 {
256 my $p=$DEFAULTS[$i+1];
257 my $pl=length($p);
258
259 next if($kl>$pl);
260
261 #print "$kl $pl $k $p\n";
262
263 if($kl==$pl && $k eq lc($p))
264 {
265 $key=$p;
266 last;
267 }
268
269 my $ps=lc(substr($p,0,$kl));
270
271 if($k eq $ps)
272 {
273 if(defined($key))
274 {
275 &usage("Ambigous parameter name '$kOrig'");
276 }
277 $key=$p;
278 }
279 }
280
281 if($k=~/^HeaderTemplate(\d+)$/i)
282 {
283 $key="HeaderTemplate$1";
284 $ExtraKeys{$key}=1;
285 }
286
287 &usage("Unknown parameter name '$kOrig'") unless(defined($key));
288
289 &usage() if($key eq 'Help');
290
291 #print "$kOrig: $key\n";
292
293 $CommandLine{"$key$mode"}=1;
294
295 if($cnt>1 && $_[0]!~/^\-(?!\-)/)
296 {
297 my $param=shift;
298 $param=~s/^\-\-/\-/;
299 $CommandLine{"$key$mode"}=$param;
300 }
301 }
302
303 $class->readConfig();
304
305 $class->updateConfig();
306 }
307
308 sub readConfig {
309 my $class=shift;
310
311 %ConfigFileData=();
312
313 my $path=$class->valueForKey('ConfigFileLocation');
314 return unless(defined($path) && -f $path);
315
316 my $mode='';
317
318 open(CONFIG,"$path") or &usage("Config file '$path' for read: $!\n");
319 while(<CONFIG>)
320 {
321 next if(/^\s*#/);
322 next if(/^\s*$/);
323
324 s/[\r\n]*$//;
325
326 if(/^\s*\[\s*([^\]\s]+)\s*\]\s*$/)
327 {
328 $Modes{".$1"}=1;
329 next;
330 }
331
332 unless(/^(\S+)\s*(.*)/)
333 {
334 &usage("Invalid configuration file parameter line '$_'");
335 }
336
337 my $key=$1;
338 my $val=$2;
339 $val='' unless(defined($val));
340
341 if($key=~/^HeaderTemplate\d+$/)
342 {
343 $ExtraKeys{$key}=1;
344 }
345 else
346 {
347 unless(exists($Defaults{$key}))
348 {
349 &usage("Unknown configuration file parameter name '$key$mode'");
350 }
351 if($key eq 'ConfigFileLocation')
352 {
353 &usage("'ConfigFileLocation' parameter not allowed in configuration file!");
354 }
355 }
356
357 $val=~s/^--/-/;
358
359 $ConfigFileData{"$key$mode"}=$val;
360 }
361 close(CONFIG);
362 }
363
364 sub usage {
365 my $msg=shift || '';
366
367 if($msg) {
368 print STDERR <<"EOT";
369 $msg;
370 For further help type $::PGM -help
371 or consult docs at http://www.meteorserver.org/
372 EOT
373
374 } else {
375
376
377 print STDERR <<"EOT";
378
379 Meteor server v$::VERSION (release date: $::RELEASE_DATE)
380 Licensed under the terms of the GNU General Public Licence (2.0)
381
382 Usage:
383
384 $::PGM [-parameter [value] [-parameter [value]...]]
385
386 Accepted command-line parameters:
387
388 EOT
389
390 for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
391 {
392 print STDERR "-$DEFAULTS[$i+1]\n$DEFAULTS[$i].\n\n";
393 }
394
395 print STDERR <<"EOT";
396
397 Any of the parameters listed above can also be configured in the
398 configuration file. The default location for this file is:
399
400 $Defaults{'ConfigFileLocation'}
401
402 For more information and complete documentation, see the Meteor
403 website at http://www.meteorserver.org/
404 EOT
405
406 }
407 exit(1);
408 }
409
410 1;
411 ############################################################################EOF

  ViewVC Help
Powered by ViewVC 1.1.26