/[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 50 - (hide annotations)
Wed Feb 27 13:55:35 2008 UTC (16 years, 1 month ago) by andrew.betts
File size: 10628 byte(s)
Added crossdomain.xml for flash clients
Incremented version number
Moved 'new message' debug notice to more useful location
Moved default for ChannelInfoTemplate to correct position alphabetically in code
Set simpler default HeaderTemplate
Added LogTimeFormat
Updated description of PingInterval, Persist
Corrected misspelling of Parameter
Reformatted debug output for config initialisation
Added recognition of null byte in config
Fixed problem with mode recognition
Fixed resuming from given message ID
Fixed sending of message backlog
Fixed Shlemiels
Logged connection duration on leavechannel
Fixed name support in channelinfotemplate
Added logging of reasons for connection closes
Abbreviated log output
Fixed tracking of subscriber IDs
Added logging of user agent
Fixed incorrect key for MessageTemplate in Subscriber.pm
Add some additional code comments
Fixed incorrect closure of new connection if previous connection close was waiting on write buffer

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 andrew.betts 50 'Template for each line in channelinfo',
46     ChannelInfoTemplate => '<script>ch("~name~", ~lastMsgID~);</script>\r\n',
47    
48 knops.gerd 11 'Configuration file location on disk (if any)',
49     ConfigFileLocation => '/etc/meteord.conf',
50    
51     'IP address for controller server (leave empty for all local addresses)',
52     ControllerIP => '',
53    
54     'Port number for controller connections',
55     ControllerPort => 4671,
56    
57     'Controller Shutdown message, sent when the controller server shuts down (leave empty for no message)',
58     ControllerShutdownMsg => '',
59    
60     'Debug Flag, when set daemon will run in foreground and emit debug messages',
61     Debug => 0,
62    
63     'Name of index file to serve when a directory is requested from the static file web server',
64     DirectoryIndex => 'index.html',
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 50 HeaderTemplate => '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',
68 knops.gerd 11
69     'Print out this help message',
70     Help => '',
71    
72 andrew.betts 50 'Format to use for timestamps in syslog: unix or human',
73     LogTimeFormat => 'human',
74    
75 knops.gerd 11 'Maximum age of a message in seconds',
76     MaxMessageAge => 7200,
77    
78     'Maximum number of messages to send to a subscriber before forcing their connection to close. Use 0 to disable',
79     MaxMessages => 0,
80    
81     'Maximum number of stored messages per channel',
82     MaxMessagesPerChannel => 250,
83    
84     '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',
85     MaxTime => 0,
86    
87 andrew.betts 20 'Message template, ~text~, ~id~, ~channel~ and ~timestamp~ will be replaced by the appropriate values',
88     MessageTemplate => '<script>p(~id~,"~channel~","~text~");</script>\r\n',
89 knops.gerd 11
90 andrew.betts 50 'Interval at which PingMessage is sent to all persistent subscriber connections. Must be at least 3 if set higher than zero. Set to zero to disable.',
91 knops.gerd 11 PingInterval => 5,
92    
93 andrew.betts 50 'Persistence of a connection.',
94 knops.gerd 45 Persist => 0,
95    
96 knops.gerd 11 'Message to be sent to all persistent and identified subscriber connections (see above) every PingInterval seconds',
97     PingMessage => '<script>p(-1,"");</script>\r\n',
98    
99     'IP address for subscriber server (leave empty for all local addresses)',
100     SubscriberIP => '',
101    
102     'Port number for subscriber connections',
103     SubscriberPort => 4670,
104    
105     'Subscriber Shutdown message, sent when the subscriber server shuts down (leave empty for no message)',
106     SubscriberShutdownMsg => '<script>eof();</script>\r\n',
107    
108     '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.',
109     SubscriberDocumentRoot => '/usr/local/meteor/public_html',
110    
111 andrew.betts 50 'Since Meteor is capable of serving static pages from a document root as well as streaming events to subscribers, this parameter 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.',
112 knops.gerd 11 SubscriberDynamicPageAddress => '/push',
113    
114     'The syslog facility to use',
115     SyslogFacility => 'daemon',
116 knops.gerd 48
117     'IP address for udp server (leave empty for all local addresses)',
118     UDPIP => '',
119    
120     'Port number for udp connections, set to 0 to disable',
121     UDPPort => 0,
122    
123 knops.gerd 11 );
124    
125     our %ConfigFileData=();
126     our %CommandLine=();
127     our %Defaults=();
128 knops.gerd 45 our %Modes=();
129 knops.gerd 11
130     for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
131     {
132     $Defaults{$DEFAULTS[$i+1]}=$DEFAULTS[$i+2];
133     }
134    
135     ###############################################################################
136     # Class methods
137     ###############################################################################
138     sub updateConfig {
139     my $class=shift;
140    
141     %::CONF=();
142    
143     my $debug=$class->valueForKey('Debug');
144    
145 andrew.betts 50 print STDERR '-'x79 ."\nMeteor server v$::VERSION (release date: $::RELEASE_DATE)\r\nLicensed under the terms of the GNU General Public Licence (2.0)\n".'-'x79 ."\n" if($debug);
146 knops.gerd 11
147     my @keys=();
148    
149     for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
150     {
151     next if($DEFAULTS[$i+1] eq 'Help');
152     push(@keys,$DEFAULTS[$i+1]);
153     }
154    
155 knops.gerd 45 foreach my $mode ('',keys %Modes)
156     {
157 andrew.betts 50 print STDERR ($mode) ? "\r\n$mode:\r\n" : "\r\nDefaults:\r\n" if($debug);
158 knops.gerd 45 foreach my $baseKey (@keys)
159 knops.gerd 11 {
160 knops.gerd 45 my $foundValue=0;
161     my $key=$baseKey.$mode;
162    
163     if(exists($CommandLine{$key}))
164 knops.gerd 11 {
165 knops.gerd 45 print STDERR "CmdLine" if($debug);
166     $::CONF{$key}=$CommandLine{$key};
167     $foundValue=1;
168 knops.gerd 11 }
169 knops.gerd 45 elsif(exists($ConfigFileData{$key}))
170 knops.gerd 11 {
171 knops.gerd 45 print STDERR "CnfFile" if($debug);
172     $::CONF{$key}=$ConfigFileData{$key};
173     $foundValue=1;
174 knops.gerd 11 }
175 knops.gerd 45 elsif(exists($Defaults{$key}))
176 knops.gerd 11 {
177 knops.gerd 45 print STDERR "Default" if($debug);
178     $::CONF{$key}=$Defaults{$key};
179     $foundValue=1;
180 knops.gerd 11 }
181 knops.gerd 45
182     next unless($foundValue);
183    
184 andrew.betts 50 print STDERR "\t$baseKey\t$::CONF{$key}\n" if($debug);
185 knops.gerd 45
186     # Take care of escapes
187     $::CONF{$key}=~s/\\(.)/
188 andrew.betts 50 if($1 eq 'r') {
189 knops.gerd 45 "\r";
190 andrew.betts 50 } elsif($1 eq 'n') {
191 knops.gerd 45 "\n";
192 andrew.betts 50 } elsif($1 eq 's') {
193 knops.gerd 45 ' ';
194 andrew.betts 50 } elsif($1 eq 't') {
195 knops.gerd 45 "\t";
196 andrew.betts 50 } elsif($1 eq '0') {
197     "\0";
198     } else {
199 knops.gerd 45 $1;
200     }
201     /gex;
202     }
203 knops.gerd 11 }
204     print STDERR '-'x79 ."\n" if($debug);
205     }
206    
207     sub valueForKey {
208     my $class=shift;
209     my $key=shift;
210    
211     return $CommandLine{$key} if(exists($CommandLine{$key}));
212     return $ConfigFileData{$key} if(exists($ConfigFileData{$key}));
213    
214     $Defaults{$key};
215     }
216    
217     sub setCommandLineParameters {
218     my $class=shift;
219    
220 knops.gerd 42 #
221     # Quick check if we should show the version, if so ignore everything else
222     # Accept -v, -version, and everything in between
223     #
224     foreach my $p (@_)
225     {
226     if(index($p,'-v')==0 && index('-version',$p)==0)
227     {
228     print "$::PGM $::VERSION\n";
229     exit(0);
230     }
231     }
232    
233 knops.gerd 11 while(my $cnt=scalar(@_))
234     {
235     my $k=shift(@_);
236     &usage("'$k' invalid") unless($k=~s/^\-(?=.+)//);
237    
238     $k='Debug' if($k eq 'd');
239    
240 knops.gerd 45 my $mode='';
241    
242 andrew.betts 50 if($k=~s/(\.(.+))$//)
243 knops.gerd 45 {
244 andrew.betts 50 $mode=$2;
245 knops.gerd 45 $Modes{$mode}=1;
246     }
247    
248 knops.gerd 11 my $key=undef;
249     my $kl=length($k);
250     my $kOrig=$k;
251     $k=lc($k);
252    
253     for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
254     {
255     my $p=$DEFAULTS[$i+1];
256     my $pl=length($p);
257    
258     next if($kl>$pl);
259    
260     #print "$kl $pl $k $p\n";
261    
262     if($kl==$pl && $k eq lc($p))
263     {
264     $key=$p;
265     last;
266     }
267    
268     my $ps=lc(substr($p,0,$kl));
269    
270     if($k eq $ps)
271     {
272     if(defined($key))
273     {
274     &usage("Ambigous parameter name '$kOrig'");
275     }
276     $key=$p;
277     }
278     }
279    
280     &usage("Unknown parameter name '$kOrig'") unless(defined($key));
281    
282     &usage() if($key eq 'Help');
283    
284     #print "$kOrig: $key\n";
285    
286 knops.gerd 45 $CommandLine{"$key$mode"}=1;
287 knops.gerd 11
288     if($cnt>1 && $_[0]!~/^\-(?!\-)/)
289     {
290     my $param=shift;
291     $param=~s/^\-\-/\-/;
292 knops.gerd 45 $CommandLine{"$key$mode"}=$param;
293 knops.gerd 11 }
294     }
295    
296     $class->readConfig();
297    
298     $class->updateConfig();
299     }
300    
301     sub readConfig {
302     my $class=shift;
303    
304     %ConfigFileData=();
305    
306     my $path=$class->valueForKey('ConfigFileLocation');
307     return unless(defined($path) && -f $path);
308    
309 knops.gerd 45 my $mode='';
310    
311 knops.gerd 11 open(CONFIG,"$path") or &usage("Config file '$path' for read: $!\n");
312     while(<CONFIG>)
313     {
314     next if(/^\s*#/);
315     next if(/^\s*$/);
316    
317     s/[\r\n]*$//;
318    
319 knops.gerd 45 if(/^\s*\[\s*([^\]\s]+)\s*\]\s*$/)
320     {
321 andrew.betts 50 $Modes{$1}=1;
322     $mode = $1;
323 knops.gerd 45 next;
324     }
325    
326 knops.gerd 11 unless(/^(\S+)\s*(.*)/)
327     {
328     &usage("Invalid configuration file parameter line '$_'");
329     }
330    
331     my $key=$1;
332     my $val=$2;
333     $val='' unless(defined($val));
334    
335 knops.gerd 49 unless(exists($Defaults{$key}))
336 knops.gerd 11 {
337 knops.gerd 49 &usage("Unknown configuration file parameter name '$key$mode'");
338 knops.gerd 11 }
339 knops.gerd 49 if($key eq 'ConfigFileLocation')
340 knops.gerd 11 {
341 knops.gerd 49 &usage("'ConfigFileLocation' parameter not allowed in configuration file!");
342 knops.gerd 11 }
343    
344     $val=~s/^--/-/;
345    
346 knops.gerd 45 $ConfigFileData{"$key$mode"}=$val;
347 knops.gerd 11 }
348     close(CONFIG);
349     }
350    
351     sub usage {
352     my $msg=shift || '';
353    
354     if($msg) {
355     print STDERR <<"EOT";
356     $msg;
357     For further help type $::PGM -help
358 andrew.betts 50 or consult docs at http://meteorserver.org/
359 knops.gerd 11 EOT
360    
361     } else {
362    
363    
364     print STDERR <<"EOT";
365    
366 knops.gerd 45 Meteor server v$::VERSION (release date: $::RELEASE_DATE)
367 knops.gerd 11 Licensed under the terms of the GNU General Public Licence (2.0)
368    
369     Usage:
370    
371     $::PGM [-parameter [value] [-parameter [value]...]]
372    
373     Accepted command-line parameters:
374    
375     EOT
376    
377     for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
378     {
379     print STDERR "-$DEFAULTS[$i+1]\n$DEFAULTS[$i].\n\n";
380     }
381    
382     print STDERR <<"EOT";
383    
384     Any of the parameters listed above can also be configured in the
385     configuration file. The default location for this file is:
386    
387     $Defaults{'ConfigFileLocation'}
388    
389     For more information and complete documentation, see the Meteor
390 andrew.betts 50 website at http://meteorserver.org/
391 knops.gerd 11 EOT
392    
393     }
394     exit(1);
395     }
396    
397     1;
398 andrew.betts 3 ############################################################################EOF

  ViewVC Help
Powered by ViewVC 1.1.26