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

Annotation of /trunk/Meteor/Config.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 21 - (hide annotations)
Mon May 14 13:42:45 2007 UTC (12 years, 4 months ago) by andrew.betts
Original Path: googlecode.com/svn/trunk/Meteor/Config.pm
File size: 10508 byte(s)


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 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 andrew.betts 21 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',
68 knops.gerd 11
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 andrew.betts 20 'Message template, ~text~, ~id~, ~channel~ and ~timestamp~ will be replaced by the appropriate values',
85     MessageTemplate => '<script>p(~id~,"~channel~","~text~");</script>\r\n',
86 knops.gerd 11
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 andrew.betts 3 ############################################################################EOF

  ViewVC Help
Powered by ViewVC 1.1.26