/[meteor]/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 /trunk/Meteor/Config.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations)
Mon Nov 20 17:59:30 2006 UTC (12 years, 9 months ago) by andrew.betts
Original Path: googlecode.com/svn/trunk/Meteor/Config.pm
File size: 10488 byte(s)
Initial import
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 to be served with static documents. ~server~ and ~status~ will be replaced by the appropriate values',
64 DocumentHeaderTemplate => 'HTTP/1.1 ~status~\r\nServer: ~server~\r\nContent-Type: text/html; charset=utf-8\r\n\r\n',
65
66 '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)',
67 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\nparent.Meteor.setServerTime(~servertime~);\r\n</script>\r\n</head>\r\n<body onload="r()">\r\n',
68
69 'Print out this help message',
70 Help => '',
71
72 'Maximum age of a message in seconds',
73 MaxMessageAge => 7200,
74
75 'Maximum number of messages to send to a subscriber before forcing their connection to close. Use 0 to disable',
76 MaxMessages => 0,
77
78 'Maximum number of stored messages per channel',
79 MaxMessagesPerChannel => 250,
80
81 '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',
82 MaxTime => 0,
83
84 'Message template, ~text~, ~id~ and ~timestamp~ will be replaced by the appropriate values',
85 MessageTemplate => '<script>p(~id~,"~text~");</script>\r\n',
86
87 '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.',
88 PingInterval => 5,
89
90 'Message to be sent to all persistent and identified subscriber connections (see above) every PingInterval seconds',
91 PingMessage => '<script>p(-1,"");</script>\r\n',
92
93 'IP address for subscriber server (leave empty for all local addresses)',
94 SubscriberIP => '',
95
96 'Port number for subscriber connections',
97 SubscriberPort => 4670,
98
99 'Subscriber Shutdown message, sent when the subscriber server shuts down (leave empty for no message)',
100 SubscriberShutdownMsg => '<script>eof();</script>\r\n',
101
102 '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.',
103 SubscriberDocumentRoot => '/usr/local/meteor/public_html',
104
105 '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.',
106 SubscriberDynamicPageAddress => '/push',
107
108 'The syslog facility to use',
109 SyslogFacility => 'daemon',
110 );
111
112 our %ConfigFileData=();
113 our %CommandLine=();
114 our %Defaults=();
115 our %ExtraKeys=();
116
117 for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
118 {
119 $Defaults{$DEFAULTS[$i+1]}=$DEFAULTS[$i+2];
120 }
121
122 ###############################################################################
123 # Class methods
124 ###############################################################################
125 sub updateConfig {
126 my $class=shift;
127
128 %::CONF=();
129
130 my $debug=$class->valueForKey('Debug');
131
132 print STDERR '-'x79 ."\nParamters:\nSource \tName and Value\n".'-'x79 ."\n" if($debug);
133
134 my @keys=();
135
136 for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
137 {
138 next if($DEFAULTS[$i+1] eq 'Help');
139 push(@keys,$DEFAULTS[$i+1]);
140 }
141 push(@keys,keys %ExtraKeys);
142
143 foreach my $key (@keys)
144 {
145 if(exists($CommandLine{$key}))
146 {
147 print STDERR "CmdLine" if($debug);
148 $::CONF{$key}=$CommandLine{$key};
149 }
150 elsif(exists($ConfigFileData{$key}))
151 {
152 print STDERR "CnfFile" if($debug);
153 $::CONF{$key}=$ConfigFileData{$key};
154 }
155 elsif(exists($Defaults{$key}))
156 {
157 print STDERR "Default" if($debug);
158 $::CONF{$key}=$Defaults{$key};
159 }
160
161 print STDERR "\t$key\t$::CONF{$key}\n" if($debug);
162
163 # Take care of escapes
164 $::CONF{$key}=~s/\\(.)/
165 if($1 eq 'r')
166 {
167 "\r";
168 }
169 elsif($1 eq 'n')
170 {
171 "\n";
172 }
173 elsif($1 eq 's')
174 {
175 ' ';
176 }
177 elsif($1 eq 't')
178 {
179 "\t";
180 }
181 else
182 {
183 $1;
184 }
185 /gex;
186 }
187
188 print STDERR '-'x79 ."\n" if($debug);
189 }
190
191 sub valueForKey {
192 my $class=shift;
193 my $key=shift;
194
195 return $CommandLine{$key} if(exists($CommandLine{$key}));
196 return $ConfigFileData{$key} if(exists($ConfigFileData{$key}));
197
198 $Defaults{$key};
199 }
200
201 sub setCommandLineParameters {
202 my $class=shift;
203
204 while(my $cnt=scalar(@_))
205 {
206 my $k=shift(@_);
207 &usage("'$k' invalid") unless($k=~s/^\-(?=.+)//);
208
209 $k='Debug' if($k eq 'd');
210
211 my $key=undef;
212 my $kl=length($k);
213 my $kOrig=$k;
214 $k=lc($k);
215
216 for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
217 {
218 my $p=$DEFAULTS[$i+1];
219 my $pl=length($p);
220
221 next if($kl>$pl);
222
223 #print "$kl $pl $k $p\n";
224
225 if($kl==$pl && $k eq lc($p))
226 {
227 $key=$p;
228 last;
229 }
230
231 my $ps=lc(substr($p,0,$kl));
232
233 if($k eq $ps)
234 {
235 if(defined($key))
236 {
237 &usage("Ambigous parameter name '$kOrig'");
238 }
239 $key=$p;
240 }
241 }
242
243 if($k=~/^HeaderTemplate(\d+)$/i)
244 {
245 $key="HeaderTemplate$1";
246 $ExtraKeys{$key}=1;
247 }
248
249 &usage("Unknown parameter name '$kOrig'") unless(defined($key));
250
251 &usage() if($key eq 'Help');
252
253 #print "$kOrig: $key\n";
254
255 $CommandLine{$key}=1;
256
257 if($cnt>1 && $_[0]!~/^\-(?!\-)/)
258 {
259 my $param=shift;
260 $param=~s/^\-\-/\-/;
261 $CommandLine{$key}=$param;
262 }
263 }
264
265 $class->readConfig();
266
267 $class->updateConfig();
268 }
269
270 sub readConfig {
271 my $class=shift;
272
273 %ConfigFileData=();
274
275 my $path=$class->valueForKey('ConfigFileLocation');
276 return unless(defined($path) && -f $path);
277
278 open(CONFIG,"$path") or &usage("Config file '$path' for read: $!\n");
279 while(<CONFIG>)
280 {
281 next if(/^\s*#/);
282 next if(/^\s*$/);
283
284 s/[\r\n]*$//;
285
286 unless(/^(\S+)\s*(.*)/)
287 {
288 &usage("Invalid configuration file parameter line '$_'");
289 }
290
291 my $key=$1;
292 my $val=$2;
293 $val='' unless(defined($val));
294
295 if($key=~/^HeaderTemplate\d+$/)
296 {
297 $ExtraKeys{$key}=1;
298 }
299 else
300 {
301 unless(exists($Defaults{$key}))
302 {
303 &usage("Unknown configuration file parameter name '$key'");
304 }
305 if($key eq 'ConfigFileLocation')
306 {
307 &usage("'ConfigFileLocation' parameter not allowed in configuration file!");
308 }
309 }
310
311 $val=~s/^--/-/;
312
313 $ConfigFileData{$key}=$val;
314 }
315 close(CONFIG);
316 }
317
318 sub usage {
319 my $msg=shift || '';
320
321 if($msg) {
322 print STDERR <<"EOT";
323 $msg;
324 For further help type $::PGM -help
325 or consult docs at http://www.meteorserver.org/
326 EOT
327
328 } else {
329
330
331 print STDERR <<"EOT";
332
333 Meteor server v1.0 (release date: 1 Dec 2006)
334 Licensed under the terms of the GNU General Public Licence (2.0)
335
336 Usage:
337
338 $::PGM [-parameter [value] [-parameter [value]...]]
339
340 Accepted command-line parameters:
341
342 EOT
343
344 for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
345 {
346 print STDERR "-$DEFAULTS[$i+1]\n$DEFAULTS[$i].\n\n";
347 }
348
349 print STDERR <<"EOT";
350
351 Any of the parameters listed above can also be configured in the
352 configuration file. The default location for this file is:
353
354 $Defaults{'ConfigFileLocation'}
355
356 For more information and complete documentation, see the Meteor
357 website at http://www.meteorserver.org/
358 EOT
359
360 }
361 exit(1);
362 }
363
364 1;
365 ############################################################################EOF

  ViewVC Help
Powered by ViewVC 1.1.26