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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 9 by andrew.betts, Fri Dec 8 16:52:58 2006 UTC revision 46 by knops.gerd, Mon Feb 4 19:24:25 2008 UTC
# Line 1  Line 1 
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~ ~lastMsgID~\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

Legend:
Removed from v.9  
changed lines
  Added in v.46

  ViewVC Help
Powered by ViewVC 1.1.26