/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 45 - (hide annotations)
Mon Feb 4 19:02:49 2008 UTC (16 years, 1 month ago) by knops.gerd
File size: 11187 byte(s)
• Mode-specific configurations
• New ~channelinfo~ header keyword
• New ChannelInfoTemplate parameter

1 knops.gerd 11 #!/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 andrew.betts 26 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 knops.gerd 11
66 knops.gerd 45 'Template for each line in channelinfo',
67    
68     ChannelInfoTemplate => '~name~ ~messageCount~\r\n',
69    
70 knops.gerd 11 '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 andrew.betts 20 '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 knops.gerd 11
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 knops.gerd 45 'Persistence of a connection. Note: some modes have this hardcoded!',
92    
93     Persist => 0,
94    
95 knops.gerd 11 '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 knops.gerd 45 our %Modes=();
122 knops.gerd 11
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 knops.gerd 45
150     foreach my $mode ('',keys %Modes)
151     {
152     foreach my $baseKey (@keys)
153 knops.gerd 11 {
154 knops.gerd 45 my $foundValue=0;
155     my $key=$baseKey.$mode;
156    
157     if(exists($CommandLine{$key}))
158 knops.gerd 11 {
159 knops.gerd 45 print STDERR "CmdLine" if($debug);
160     $::CONF{$key}=$CommandLine{$key};
161     $foundValue=1;
162 knops.gerd 11 }
163 knops.gerd 45 elsif(exists($ConfigFileData{$key}))
164 knops.gerd 11 {
165 knops.gerd 45 print STDERR "CnfFile" if($debug);
166     $::CONF{$key}=$ConfigFileData{$key};
167     $foundValue=1;
168 knops.gerd 11 }
169 knops.gerd 45 elsif(exists($Defaults{$key}))
170 knops.gerd 11 {
171 knops.gerd 45 print STDERR "Default" if($debug);
172     $::CONF{$key}=$Defaults{$key};
173     $foundValue=1;
174 knops.gerd 11 }
175 knops.gerd 45
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 knops.gerd 11 }
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 knops.gerd 42 #
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 knops.gerd 11 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 knops.gerd 45 my $mode='';
242    
243     if($k=~s/(\..+)$//)
244     {
245     $mode=$1;
246     $Modes{$mode}=1;
247     }
248    
249 knops.gerd 11 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 knops.gerd 45 $CommandLine{"$key$mode"}=1;
294 knops.gerd 11
295     if($cnt>1 && $_[0]!~/^\-(?!\-)/)
296     {
297     my $param=shift;
298     $param=~s/^\-\-/\-/;
299 knops.gerd 45 $CommandLine{"$key$mode"}=$param;
300 knops.gerd 11 }
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 knops.gerd 45 my $mode='';
317    
318 knops.gerd 11 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 knops.gerd 45 if(/^\s*\[\s*([^\]\s]+)\s*\]\s*$/)
327     {
328     $Modes{".$1"}=1;
329     next;
330     }
331    
332 knops.gerd 11 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 knops.gerd 45 &usage("Unknown configuration file parameter name '$key$mode'");
350 knops.gerd 11 }
351     if($key eq 'ConfigFileLocation')
352     {
353     &usage("'ConfigFileLocation' parameter not allowed in configuration file!");
354     }
355     }
356    
357     $val=~s/^--/-/;
358    
359 knops.gerd 45 $ConfigFileData{"$key$mode"}=$val;
360 knops.gerd 11 }
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 knops.gerd 45 Meteor server v$::VERSION (release date: $::RELEASE_DATE)
380 knops.gerd 11 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 andrew.betts 3 ############################################################################EOF

  ViewVC Help
Powered by ViewVC 1.1.26