/[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 32 - (hide annotations)
Thu Dec 20 21:24:24 2007 UTC (16 years, 3 months ago) by andrew.betts
File size: 10276 byte(s)
Complete rewrite of the JS web client
Opera and Safari compatibility
Saner request format

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

  ViewVC Help
Powered by ViewVC 1.1.26