1 |
#!/usr/bin/perl -w |
#!/usr/bin/perl -w |
2 |
############################################################################### |
############################################################################### |
3 |
# Meteor |
# Meteor |
4 |
# An HTTP server for the 2.0 web |
# An HTTP server for the 2.0 web |
5 |
# Copyright (c) 2006 contributing authors |
# Copyright (c) 2006 contributing authors |
6 |
# |
# |
7 |
# Subscriber.pm |
# Subscriber.pm |
8 |
# |
# |
9 |
# Description: |
# Description: |
10 |
# Meteor Configuration handling. |
# Meteor Configuration handling. |
11 |
# |
# |
12 |
# Main program should call Meteor::Config::setCommandLineParameters(@ARGV),. |
# Main program should call Meteor::Config::setCommandLineParameters(@ARGV),. |
13 |
# Afterwards anybody can access $::CONF{<parameterName>}, where |
# Afterwards anybody can access $::CONF{<parameterName>}, where |
14 |
# <parameterName> is any valid parameter (except 'Help') listed in the |
# <parameterName> is any valid parameter (except 'Help') listed in the |
15 |
# @DEFAULTS array below. |
# @DEFAULTS array below. |
16 |
# |
# |
17 |
############################################################################### |
############################################################################### |
18 |
# |
# |
19 |
# This program is free software; you can redistribute it and/or modify it |
# 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 |
# 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) |
# Software Foundation; either version 2 of the License, or (at your option) |
22 |
# any later version. |
# any later version. |
23 |
# |
# |
24 |
# This program is distributed in the hope that it will be useful, but WITHOUT |
# 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 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
26 |
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
27 |
# more details. |
# more details. |
28 |
# |
# |
29 |
# You should have received a copy of the GNU General Public License along |
# 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., |
# with this program; if not, write to the Free Software Foundation, Inc., |
31 |
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
32 |
# |
# |
33 |
# For more information visit www.meteorserver.org |
# For more information visit www.meteorserver.org |
34 |
# |
# |
35 |
############################################################################### |
############################################################################### |
36 |
|
|
37 |
package Meteor::Config; |
package Meteor::Config; |
38 |
############################################################################### |
############################################################################### |
39 |
# Configuration |
# Configuration |
40 |
############################################################################### |
############################################################################### |
41 |
|
|
42 |
use strict; |
use strict; |
43 |
|
|
44 |
our @DEFAULTS=( |
our @DEFAULTS=( |
45 |
'Configuration file location on disk (if any)', |
'Configuration file location on disk (if any)', |
46 |
ConfigFileLocation => '/etc/meteord.conf', |
ConfigFileLocation => '/etc/meteord.conf', |
47 |
|
|
48 |
'IP address for controller server (leave empty for all local addresses)', |
'IP address for controller server (leave empty for all local addresses)', |
49 |
ControllerIP => '', |
ControllerIP => '', |
50 |
|
|
51 |
'Port number for controller connections', |
'Port number for controller connections', |
52 |
ControllerPort => 4671, |
ControllerPort => 4671, |
53 |
|
|
54 |
'Controller Shutdown message, sent when the controller server shuts down (leave empty for no message)', |
'Controller Shutdown message, sent when the controller server shuts down (leave empty for no message)', |
55 |
ControllerShutdownMsg => '', |
ControllerShutdownMsg => '', |
56 |
|
|
57 |
'Debug Flag, when set daemon will run in foreground and emit debug messages', |
'Debug Flag, when set daemon will run in foreground and emit debug messages', |
58 |
Debug => 0, |
Debug => 0, |
59 |
|
|
60 |
'Name of index file to serve when a directory is requested from the static file web server', |
'Name of index file to serve when a directory is requested from the static file web server', |
61 |
DirectoryIndex => 'index.html', |
DirectoryIndex => 'index.html', |
62 |
|
|
63 |
'Header to be served with static documents. ~server~ and ~status~ will be replaced by the appropriate values', |
'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 |
DocumentHeaderTemplate => 'HTTP/1.1 ~status~\r\nServer: ~server~\r\nContent-Type: text/html; charset=utf-8\r\n\r\n', |
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 |
|
|
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)', |
'Template for each line in channelinfo', |
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 |
|
ChannelInfoTemplate => '~name~ ~messageCount~\r\n', |
69 |
'Print out this help message', |
|
70 |
Help => '', |
'Print out this help message', |
71 |
|
Help => '', |
72 |
'Maximum age of a message in seconds', |
|
73 |
MaxMessageAge => 7200, |
'Maximum age of a message in seconds', |
74 |
|
MaxMessageAge => 7200, |
75 |
'Maximum number of messages to send to a subscriber before forcing their connection to close. Use 0 to disable', |
|
76 |
MaxMessages => 0, |
'Maximum number of messages to send to a subscriber before forcing their connection to close. Use 0 to disable', |
77 |
|
MaxMessages => 0, |
78 |
'Maximum number of stored messages per channel', |
|
79 |
MaxMessagesPerChannel => 250, |
'Maximum number of stored messages per channel', |
80 |
|
MaxMessagesPerChannel => 250, |
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, |
'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 |
'Message template, ~text~, ~id~ and ~timestamp~ will be replaced by the appropriate values', |
|
85 |
MessageTemplate => '<script>p(~id~,"~text~");</script>\r\n', |
'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 |
'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, |
'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 |
'Message to be sent to all persistent and identified subscriber connections (see above) every PingInterval seconds', |
|
91 |
PingMessage => '<script>p(-1,"");</script>\r\n', |
'Persistence of a connection. Note: some modes have this hardcoded!', |
92 |
|
|
93 |
'IP address for subscriber server (leave empty for all local addresses)', |
Persist => 0, |
94 |
SubscriberIP => '', |
|
95 |
|
'Message to be sent to all persistent and identified subscriber connections (see above) every PingInterval seconds', |
96 |
'Port number for subscriber connections', |
PingMessage => '<script>p(-1,"");</script>\r\n', |
97 |
SubscriberPort => 4670, |
|
98 |
|
'IP address for subscriber server (leave empty for all local addresses)', |
99 |
'Subscriber Shutdown message, sent when the subscriber server shuts down (leave empty for no message)', |
SubscriberIP => '', |
100 |
SubscriberShutdownMsg => '<script>eof();</script>\r\n', |
|
101 |
|
'Port number for subscriber connections', |
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.', |
SubscriberPort => 4670, |
103 |
SubscriberDocumentRoot => '/usr/local/meteor/public_html', |
|
104 |
|
'Subscriber Shutdown message, sent when the subscriber server shuts down (leave empty for no message)', |
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.', |
SubscriberShutdownMsg => '<script>eof();</script>\r\n', |
106 |
SubscriberDynamicPageAddress => '/push', |
|
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 |
'The syslog facility to use', |
SubscriberDocumentRoot => '/usr/local/meteor/public_html', |
109 |
SyslogFacility => 'daemon', |
|
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 |
our %ConfigFileData=(); |
|
113 |
our %CommandLine=(); |
'The syslog facility to use', |
114 |
our %Defaults=(); |
SyslogFacility => 'daemon', |
115 |
our %ExtraKeys=(); |
); |
116 |
|
|
117 |
for(my $i=0;$i<scalar(@DEFAULTS);$i+=3) |
our %ConfigFileData=(); |
118 |
{ |
our %CommandLine=(); |
119 |
$Defaults{$DEFAULTS[$i+1]}=$DEFAULTS[$i+2]; |
our %Defaults=(); |
120 |
} |
our %ExtraKeys=(); |
121 |
|
our %Modes=(); |
122 |
############################################################################### |
|
123 |
# Class methods |
for(my $i=0;$i<scalar(@DEFAULTS);$i+=3) |
124 |
############################################################################### |
{ |
125 |
sub updateConfig { |
$Defaults{$DEFAULTS[$i+1]}=$DEFAULTS[$i+2]; |
126 |
my $class=shift; |
} |
127 |
|
|
128 |
%::CONF=(); |
############################################################################### |
129 |
|
# Class methods |
130 |
my $debug=$class->valueForKey('Debug'); |
############################################################################### |
131 |
|
sub updateConfig { |
132 |
print STDERR '-'x79 ."\nParamters:\nSource \tName and Value\n".'-'x79 ."\n" if($debug); |
my $class=shift; |
133 |
|
|
134 |
my @keys=(); |
%::CONF=(); |
135 |
|
|
136 |
for(my $i=0;$i<scalar(@DEFAULTS);$i+=3) |
my $debug=$class->valueForKey('Debug'); |
137 |
{ |
|
138 |
next if($DEFAULTS[$i+1] eq 'Help'); |
print STDERR '-'x79 ."\nParamters:\nSource \tName and Value\n".'-'x79 ."\n" if($debug); |
139 |
push(@keys,$DEFAULTS[$i+1]); |
|
140 |
} |
my @keys=(); |
141 |
push(@keys,keys %ExtraKeys); |
|
142 |
|
for(my $i=0;$i<scalar(@DEFAULTS);$i+=3) |
143 |
foreach my $key (@keys) |
{ |
144 |
{ |
next if($DEFAULTS[$i+1] eq 'Help'); |
145 |
if(exists($CommandLine{$key})) |
push(@keys,$DEFAULTS[$i+1]); |
146 |
{ |
} |
147 |
print STDERR "CmdLine" if($debug); |
push(@keys,keys %ExtraKeys); |
148 |
$::CONF{$key}=$CommandLine{$key}; |
|
149 |
} |
|
150 |
elsif(exists($ConfigFileData{$key})) |
foreach my $mode ('',keys %Modes) |
151 |
{ |
{ |
152 |
print STDERR "CnfFile" if($debug); |
foreach my $baseKey (@keys) |
153 |
$::CONF{$key}=$ConfigFileData{$key}; |
{ |
154 |
} |
my $foundValue=0; |
155 |
elsif(exists($Defaults{$key})) |
my $key=$baseKey.$mode; |
156 |
{ |
|
157 |
print STDERR "Default" if($debug); |
if(exists($CommandLine{$key})) |
158 |
$::CONF{$key}=$Defaults{$key}; |
{ |
159 |
} |
print STDERR "CmdLine" if($debug); |
160 |
|
$::CONF{$key}=$CommandLine{$key}; |
161 |
print STDERR "\t$key\t$::CONF{$key}\n" if($debug); |
$foundValue=1; |
162 |
|
} |
163 |
# Take care of escapes |
elsif(exists($ConfigFileData{$key})) |
164 |
$::CONF{$key}=~s/\\(.)/ |
{ |
165 |
if($1 eq 'r') |
print STDERR "CnfFile" if($debug); |
166 |
{ |
$::CONF{$key}=$ConfigFileData{$key}; |
167 |
"\r"; |
$foundValue=1; |
168 |
} |
} |
169 |
elsif($1 eq 'n') |
elsif(exists($Defaults{$key})) |
170 |
{ |
{ |
171 |
"\n"; |
print STDERR "Default" if($debug); |
172 |
} |
$::CONF{$key}=$Defaults{$key}; |
173 |
elsif($1 eq 's') |
$foundValue=1; |
174 |
{ |
} |
175 |
' '; |
|
176 |
} |
next unless($foundValue); |
177 |
elsif($1 eq 't') |
|
178 |
{ |
print STDERR "\t$key\t$::CONF{$key}\n" if($debug); |
179 |
"\t"; |
|
180 |
} |
# Take care of escapes |
181 |
else |
$::CONF{$key}=~s/\\(.)/ |
182 |
{ |
if($1 eq 'r') |
183 |
$1; |
{ |
184 |
} |
"\r"; |
185 |
/gex; |
} |
186 |
} |
elsif($1 eq 'n') |
187 |
|
{ |
188 |
print STDERR '-'x79 ."\n" if($debug); |
"\n"; |
189 |
} |
} |
190 |
|
elsif($1 eq 's') |
191 |
sub valueForKey { |
{ |
192 |
my $class=shift; |
' '; |
193 |
my $key=shift; |
} |
194 |
|
elsif($1 eq 't') |
195 |
return $CommandLine{$key} if(exists($CommandLine{$key})); |
{ |
196 |
return $ConfigFileData{$key} if(exists($ConfigFileData{$key})); |
"\t"; |
197 |
|
} |
198 |
$Defaults{$key}; |
else |
199 |
} |
{ |
200 |
|
$1; |
201 |
sub setCommandLineParameters { |
} |
202 |
my $class=shift; |
/gex; |
203 |
|
} |
204 |
while(my $cnt=scalar(@_)) |
} |
205 |
{ |
print STDERR '-'x79 ."\n" if($debug); |
206 |
my $k=shift(@_); |
} |
207 |
&usage("'$k' invalid") unless($k=~s/^\-(?=.+)//); |
|
208 |
|
sub valueForKey { |
209 |
$k='Debug' if($k eq 'd'); |
my $class=shift; |
210 |
|
my $key=shift; |
211 |
my $key=undef; |
|
212 |
my $kl=length($k); |
return $CommandLine{$key} if(exists($CommandLine{$key})); |
213 |
my $kOrig=$k; |
return $ConfigFileData{$key} if(exists($ConfigFileData{$key})); |
214 |
$k=lc($k); |
|
215 |
|
$Defaults{$key}; |
216 |
for(my $i=0;$i<scalar(@DEFAULTS);$i+=3) |
} |
217 |
{ |
|
218 |
my $p=$DEFAULTS[$i+1]; |
sub setCommandLineParameters { |
219 |
my $pl=length($p); |
my $class=shift; |
220 |
|
|
221 |
next if($kl>$pl); |
# |
222 |
|
# Quick check if we should show the version, if so ignore everything else |
223 |
#print "$kl $pl $k $p\n"; |
# Accept -v, -version, and everything in between |
224 |
|
# |
225 |
if($kl==$pl && $k eq lc($p)) |
foreach my $p (@_) |
226 |
{ |
{ |
227 |
$key=$p; |
if(index($p,'-v')==0 && index('-version',$p)==0) |
228 |
last; |
{ |
229 |
} |
print "$::PGM $::VERSION\n"; |
230 |
|
exit(0); |
231 |
my $ps=lc(substr($p,0,$kl)); |
} |
232 |
|
} |
233 |
if($k eq $ps) |
|
234 |
{ |
while(my $cnt=scalar(@_)) |
235 |
if(defined($key)) |
{ |
236 |
{ |
my $k=shift(@_); |
237 |
&usage("Ambigous parameter name '$kOrig'"); |
&usage("'$k' invalid") unless($k=~s/^\-(?=.+)//); |
238 |
} |
|
239 |
$key=$p; |
$k='Debug' if($k eq 'd'); |
240 |
} |
|
241 |
} |
my $mode=''; |
242 |
|
|
243 |
if($k=~/^HeaderTemplate(\d+)$/i) |
if($k=~s/(\..+)$//) |
244 |
{ |
{ |
245 |
$key="HeaderTemplate$1"; |
$mode=$1; |
246 |
$ExtraKeys{$key}=1; |
$Modes{$mode}=1; |
247 |
} |
} |
248 |
|
|
249 |
&usage("Unknown parameter name '$kOrig'") unless(defined($key)); |
my $key=undef; |
250 |
|
my $kl=length($k); |
251 |
&usage() if($key eq 'Help'); |
my $kOrig=$k; |
252 |
|
$k=lc($k); |
253 |
#print "$kOrig: $key\n"; |
|
254 |
|
for(my $i=0;$i<scalar(@DEFAULTS);$i+=3) |
255 |
$CommandLine{$key}=1; |
{ |
256 |
|
my $p=$DEFAULTS[$i+1]; |
257 |
if($cnt>1 && $_[0]!~/^\-(?!\-)/) |
my $pl=length($p); |
258 |
{ |
|
259 |
my $param=shift; |
next if($kl>$pl); |
260 |
$param=~s/^\-\-/\-/; |
|
261 |
$CommandLine{$key}=$param; |
#print "$kl $pl $k $p\n"; |
262 |
} |
|
263 |
} |
if($kl==$pl && $k eq lc($p)) |
264 |
|
{ |
265 |
$class->readConfig(); |
$key=$p; |
266 |
|
last; |
267 |
$class->updateConfig(); |
} |
268 |
} |
|
269 |
|
my $ps=lc(substr($p,0,$kl)); |
270 |
sub readConfig { |
|
271 |
my $class=shift; |
if($k eq $ps) |
272 |
|
{ |
273 |
%ConfigFileData=(); |
if(defined($key)) |
274 |
|
{ |
275 |
my $path=$class->valueForKey('ConfigFileLocation'); |
&usage("Ambigous parameter name '$kOrig'"); |
276 |
return unless(defined($path) && -f $path); |
} |
277 |
|
$key=$p; |
278 |
open(CONFIG,"$path") or &usage("Config file '$path' for read: $!\n"); |
} |
279 |
while(<CONFIG>) |
} |
280 |
{ |
|
281 |
next if(/^\s*#/); |
if($k=~/^HeaderTemplate(\d+)$/i) |
282 |
next if(/^\s*$/); |
{ |
283 |
|
$key="HeaderTemplate$1"; |
284 |
s/[\r\n]*$//; |
$ExtraKeys{$key}=1; |
285 |
|
} |
286 |
unless(/^(\S+)\s*(.*)/) |
|
287 |
{ |
&usage("Unknown parameter name '$kOrig'") unless(defined($key)); |
288 |
&usage("Invalid configuration file parameter line '$_'"); |
|
289 |
} |
&usage() if($key eq 'Help'); |
290 |
|
|
291 |
my $key=$1; |
#print "$kOrig: $key\n"; |
292 |
my $val=$2; |
|
293 |
$val='' unless(defined($val)); |
$CommandLine{"$key$mode"}=1; |
294 |
|
|
295 |
if($key=~/^HeaderTemplate\d+$/) |
if($cnt>1 && $_[0]!~/^\-(?!\-)/) |
296 |
{ |
{ |
297 |
$ExtraKeys{$key}=1; |
my $param=shift; |
298 |
} |
$param=~s/^\-\-/\-/; |
299 |
else |
$CommandLine{"$key$mode"}=$param; |
300 |
{ |
} |
301 |
unless(exists($Defaults{$key})) |
} |
302 |
{ |
|
303 |
&usage("Unknown configuration file parameter name '$key'"); |
$class->readConfig(); |
304 |
} |
|
305 |
if($key eq 'ConfigFileLocation') |
$class->updateConfig(); |
306 |
{ |
} |
307 |
&usage("'ConfigFileLocation' parameter not allowed in configuration file!"); |
|
308 |
} |
sub readConfig { |
309 |
} |
my $class=shift; |
310 |
|
|
311 |
$val=~s/^--/-/; |
%ConfigFileData=(); |
312 |
|
|
313 |
$ConfigFileData{$key}=$val; |
my $path=$class->valueForKey('ConfigFileLocation'); |
314 |
} |
return unless(defined($path) && -f $path); |
315 |
close(CONFIG); |
|
316 |
} |
my $mode=''; |
317 |
|
|
318 |
sub usage { |
open(CONFIG,"$path") or &usage("Config file '$path' for read: $!\n"); |
319 |
my $msg=shift || ''; |
while(<CONFIG>) |
320 |
|
{ |
321 |
if($msg) { |
next if(/^\s*#/); |
322 |
print STDERR <<"EOT"; |
next if(/^\s*$/); |
323 |
$msg; |
|
324 |
For further help type $::PGM -help |
s/[\r\n]*$//; |
325 |
or consult docs at http://www.meteorserver.org/ |
|
326 |
EOT |
if(/^\s*\[\s*([^\]\s]+)\s*\]\s*$/) |
327 |
|
{ |
328 |
} else { |
$Modes{".$1"}=1; |
329 |
|
next; |
330 |
|
} |
331 |
print STDERR <<"EOT"; |
|
332 |
|
unless(/^(\S+)\s*(.*)/) |
333 |
Meteor server v1.0 (release date: 1 Dec 2006) |
{ |
334 |
Licensed under the terms of the GNU General Public Licence (2.0) |
&usage("Invalid configuration file parameter line '$_'"); |
335 |
|
} |
336 |
Usage: |
|
337 |
|
my $key=$1; |
338 |
$::PGM [-parameter [value] [-parameter [value]...]] |
my $val=$2; |
339 |
|
$val='' unless(defined($val)); |
340 |
Accepted command-line parameters: |
|
341 |
|
if($key=~/^HeaderTemplate\d+$/) |
342 |
EOT |
{ |
343 |
|
$ExtraKeys{$key}=1; |
344 |
for(my $i=0;$i<scalar(@DEFAULTS);$i+=3) |
} |
345 |
{ |
else |
346 |
print STDERR "-$DEFAULTS[$i+1]\n$DEFAULTS[$i].\n\n"; |
{ |
347 |
} |
unless(exists($Defaults{$key})) |
348 |
|
{ |
349 |
print STDERR <<"EOT"; |
&usage("Unknown configuration file parameter name '$key$mode'"); |
350 |
|
} |
351 |
Any of the parameters listed above can also be configured in the |
if($key eq 'ConfigFileLocation') |
352 |
configuration file. The default location for this file is: |
{ |
353 |
|
&usage("'ConfigFileLocation' parameter not allowed in configuration file!"); |
354 |
$Defaults{'ConfigFileLocation'} |
} |
355 |
|
} |
356 |
For more information and complete documentation, see the Meteor |
|
357 |
website at http://www.meteorserver.org/ |
$val=~s/^--/-/; |
358 |
EOT |
|
359 |
|
$ConfigFileData{"$key$mode"}=$val; |
360 |
} |
} |
361 |
exit(1); |
close(CONFIG); |
362 |
} |
} |
363 |
|
|
364 |
1; |
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 |
|
Meteor server v$::VERSION (release date: $::RELEASE_DATE) |
380 |
|
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 |
############################################################################EOF |
############################################################################EOF |