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

Diff of /trunk/Meteor/Config.pm

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

revision 23 by andrew.betts, Sun May 20 14:03:10 2007 UTC revision 62 by andrew.betts, Thu Nov 27 00:33:21 2008 UTC
# Line 42  package Meteor::Config; Line 42  package Meteor::Config;
42          use strict;          use strict;
43                    
44          our @DEFAULTS=(          our @DEFAULTS=(
45    'Template for each line in channelinfo.  Placeholders are name, lastMsgID, subscriberCount, messageCount.  Channel info is included in output when client does not give a message start index in its request (indicating it is the client\'s first request for that channel)',
46            ChannelInfoTemplate             => '<script>ch("~name~", ~lastMsgID~);</script>\r\n',
47    
48  'Configuration file location on disk (if any)',  'Configuration file location on disk (if any)',
49          ConfigFileLocation              => '/etc/meteord.conf',          ConfigFileLocation              => '/etc/meteord.conf',
50    
# Line 58  package Meteor::Config; Line 61  package Meteor::Config;
61          Debug                                   => 0,          Debug                                   => 0,
62                    
63  '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',
64          DirectoryIndex  => 'index.html',          DirectoryIndex                  => 'index.html',
65    
66  'Header to be served with static documents. ~server~ and ~status~ will be replaced by the appropriate values',  'Footer template',
67          DocumentHeaderTemplate                  => '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',          FooterTemplate                  => '</body></html>',
68    
69  '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)',  'Header template, ~server~, ~servertime~ and ~status~ will be replaced by the appropriate values.',
70          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',          HeaderTemplate                  => 'HTTP/1.1 ~status~\r\n\r\n~channelinfo~\r\n',
71    
72  'Print out this help message',  'Print out this help message',
73          Help                                    => '',          Help                                    => '',
74    
75    'Format to use for timestamps in debug output: unix or human',
76            LogTimeFormat                   => 'human',
77    
78  'Maximum age of a message in seconds',  'Maximum age of a message in seconds',
79          MaxMessageAge                   => 7200,          MaxMessageAge                   => 7200,
80    
81  'Maximum number of messages to send to a subscriber before forcing their connection to close. Use 0 to disable',  'Whether to close subscriber connections once at least one message has been sent, and there are no further messages pending.  1 to enable, 0 to disable.  Irrelevant unless Persist is set to 1.',
82          MaxMessages                             => 0,          CloseOnEvent                    => 0,
83    
84  'Maximum number of stored messages per channel',  'Maximum number of stored messages per channel',
85          MaxMessagesPerChannel   => 250,          MaxMessagesPerChannel   => 250,
# Line 84  package Meteor::Config; Line 90  package Meteor::Config;
90  'Message template, ~text~, ~id~, ~channel~ and ~timestamp~ will be replaced by the appropriate values',  'Message template, ~text~, ~id~, ~channel~ and ~timestamp~ will be replaced by the appropriate values',
91          MessageTemplate                 => '<script>p(~id~,"~channel~","~text~");</script>\r\n',          MessageTemplate                 => '<script>p(~id~,"~channel~","~text~");</script>\r\n',
92    
93  '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.',  '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.',
94          PingInterval                    => 5,          PingInterval                    => 5,
95    
96  'Message to be sent to all persistent and identified subscriber connections (see above) every PingInterval seconds',  'Persistence of a connection.',
97            Persist                                 => 0,
98    
99    'Message to be sent to all persistent subscriber connections (see above) every PingInterval seconds',
100          PingMessage                             => '<script>p(-1,"");</script>\r\n',          PingMessage                             => '<script>p(-1,"");</script>\r\n',
101    
102  'IP address for subscriber server (leave empty for all local addresses)',  'IP address for subscriber server (leave empty for all local addresses)',
# Line 97  package Meteor::Config; Line 106  package Meteor::Config;
106          SubscriberPort                  => 4670,          SubscriberPort                  => 4670,
107    
108  'Subscriber Shutdown message, sent when the subscriber server shuts down (leave empty for no message)',  'Subscriber Shutdown message, sent when the subscriber server shuts down (leave empty for no message)',
109          SubscriberShutdownMsg           => '<script>eof();</script>\r\n',          SubscriberShutdownMsg   => '<script>eof();</script>\r\n',
110    
111  '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.',  '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.',
112          SubscriberDocumentRoot  => '/usr/local/meteor/public_html',          SubscriberDocumentRoot  => '/usr/local/meteor/public_html',
113    
114  '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.',  '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.',
115          SubscriberDynamicPageAddress    => '/push',          SubscriberDynamicPageAddress    => '/push',
116    
117  'The syslog facility to use',  'The syslog facility to use',
118          SyslogFacility                  => 'daemon',          SyslogFacility                  => 'daemon',
119            
120    'IP address for udp server (leave empty for all local addresses)',
121            UDPIP                                   => '',
122            
123    'Port number for udp connections, set to 0 to disable',
124            UDPPort                                 => 0,
125    
126          );          );
127                    
128          our %ConfigFileData=();          our %ConfigFileData=();
129          our %CommandLine=();          our %CommandLine=();
130          our %Defaults=();          our %Defaults=();
131          our %ExtraKeys=();          our %Modes=();
132                    
133          for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)          for(my $i=0;$i<scalar(@DEFAULTS);$i+=3)
134          {          {
# Line 129  sub updateConfig { Line 145  sub updateConfig {
145                    
146          my $debug=$class->valueForKey('Debug');          my $debug=$class->valueForKey('Debug');
147                    
148          print STDERR '-'x79 ."\nParamters:\nSource \tName and Value\n".'-'x79 ."\n" if($debug);          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);
149                    
150          my @keys=();          my @keys=();
151                    
# Line 138  sub updateConfig { Line 154  sub updateConfig {
154                  next if($DEFAULTS[$i+1] eq 'Help');                  next if($DEFAULTS[$i+1] eq 'Help');
155                  push(@keys,$DEFAULTS[$i+1]);                  push(@keys,$DEFAULTS[$i+1]);
156          }          }
         push(@keys,keys %ExtraKeys);  
157                    
158          foreach my $key (@keys)          foreach my $mode ('',keys %Modes)
159          {                        {
160                  if(exists($CommandLine{$key}))                  print STDERR ($mode) ? "\r\n$mode:\r\n" : "\r\nDefaults:\r\n" if($debug);
161                  {                  foreach my $baseKey (@keys)
                         print STDERR "CmdLine" if($debug);  
                         $::CONF{$key}=$CommandLine{$key};  
                 }  
                 elsif(exists($ConfigFileData{$key}))  
                 {  
                         print STDERR "CnfFile" if($debug);  
                         $::CONF{$key}=$ConfigFileData{$key};  
                 }  
                 elsif(exists($Defaults{$key}))  
162                  {                  {
163                          print STDERR "Default" if($debug);                          my $foundValue=0;
164                          $::CONF{$key}=$Defaults{$key};                          my $key=$baseKey.$mode;
165                  }                          
166                                            if(exists($CommandLine{$key}))
                 print STDERR "\t$key\t$::CONF{$key}\n" if($debug);  
                   
                 # Take care of escapes  
                 $::CONF{$key}=~s/\\(.)/  
                         if($1 eq 'r')  
                         {  
                                 "\r";  
                         }  
                         elsif($1 eq 'n')  
                         {  
                                 "\n";  
                         }  
                         elsif($1 eq 's')  
167                          {                          {
168                                  ' ';                                  print STDERR "CmdLine" if($debug);
169                                    $::CONF{$key}=$CommandLine{$key};
170                                    $foundValue=1;
171                          }                          }
172                          elsif($1 eq 't')                          elsif(exists($ConfigFileData{$key}))
173                          {                          {
174                                  "\t";                                  print STDERR "CnfFile" if($debug);
175                                    $::CONF{$key}=$ConfigFileData{$key};
176                                    $foundValue=1;
177                          }                          }
178                          else                          elsif(exists($Defaults{$key}))
179                          {                          {
180                                  $1;                                  print STDERR "Default" if($debug);
181                                    $::CONF{$key}=$Defaults{$key};
182                                    $foundValue=1;
183                          }                          }
184                  /gex;                          
185                            next unless($foundValue);
186                            
187                            print STDERR "\t$baseKey\t$::CONF{$key}\n" if($debug);
188                            
189                            # Take care of escapes
190                            $::CONF{$key}=~s/\\(.)/
191                                    if($1 eq 'r') {
192                                            "\r";
193                                    } elsif($1 eq 'n') {
194                                            "\n";
195                                    } elsif($1 eq 's') {
196                                            ' ';
197                                    } elsif($1 eq 't') {
198                                            "\t";
199                                    } elsif($1 eq '0') {
200                                            "\0";
201                                    } else {
202                                            $1;
203                                    }
204                            /gex;
205                    }
206          }          }
           
207          print STDERR '-'x79 ."\n" if($debug);          print STDERR '-'x79 ."\n" if($debug);
208  }  }
209    
# Line 201  sub valueForKey { Line 220  sub valueForKey {
220  sub setCommandLineParameters {  sub setCommandLineParameters {
221          my $class=shift;          my $class=shift;
222                    
223            #
224            # Quick check if we should show the version, if so ignore everything else
225            # Accept -v, -version, and everything in between
226            #
227            foreach my $p (@_)
228            {
229                    if(index($p,'-v')==0 && index('-version',$p)==0)
230                    {
231                            print "$::PGM $::VERSION\n";
232                            exit(0);
233                    }
234            }
235            
236          while(my $cnt=scalar(@_))          while(my $cnt=scalar(@_))
237          {          {
238                  my $k=shift(@_);                  my $k=shift(@_);
# Line 208  sub setCommandLineParameters { Line 240  sub setCommandLineParameters {
240                                    
241                  $k='Debug' if($k eq 'd');                  $k='Debug' if($k eq 'd');
242                                    
243                    my $mode='';
244                    
245                    if($k=~s/(\.(.+))$//)
246                    {
247                            $mode=$2;
248                            $Modes{$mode}=1;
249                    }
250                    
251                  my $key=undef;                  my $key=undef;
252                  my $kl=length($k);                  my $kl=length($k);
253                  my $kOrig=$k;                  my $kOrig=$k;
# Line 239  sub setCommandLineParameters { Line 279  sub setCommandLineParameters {
279                                  $key=$p;                                  $key=$p;
280                          }                          }
281                  }                  }
                   
                 if($k=~/^HeaderTemplate(\d+)$/i)  
                 {  
                         $key="HeaderTemplate$1";  
                         $ExtraKeys{$key}=1;  
                 }  
282                                                    
283                  &usage("Unknown parameter name '$kOrig'") unless(defined($key));                  &usage("Unknown parameter name '$kOrig'") unless(defined($key));
284                                    
# Line 252  sub setCommandLineParameters { Line 286  sub setCommandLineParameters {
286                                    
287                  #print "$kOrig: $key\n";                  #print "$kOrig: $key\n";
288                                    
289                  $CommandLine{$key}=1;                  $CommandLine{"$key$mode"}=1;
290                                    
291                  if($cnt>1 && $_[0]!~/^\-(?!\-)/)                  if($cnt>1 && $_[0]!~/^\-(?!\-)/)
292                  {                  {
293                          my $param=shift;                          my $param=shift;
294                          $param=~s/^\-\-/\-/;                          $param=~s/^\-\-/\-/;
295                          $CommandLine{$key}=$param;                          $CommandLine{"$key$mode"}=$param;
296                  }                  }
297          }          }
298                    
# Line 275  sub readConfig { Line 309  sub readConfig {
309          my $path=$class->valueForKey('ConfigFileLocation');          my $path=$class->valueForKey('ConfigFileLocation');
310          return unless(defined($path) && -f $path);          return unless(defined($path) && -f $path);
311                    
312            my $mode='';
313            
314          open(CONFIG,"$path") or &usage("Config file '$path' for read: $!\n");          open(CONFIG,"$path") or &usage("Config file '$path' for read: $!\n");
315          while(<CONFIG>)          while(<CONFIG>)
316          {          {
# Line 283  sub readConfig { Line 319  sub readConfig {
319                                    
320                  s/[\r\n]*$//;                  s/[\r\n]*$//;
321                                    
322                    if(/^\s*\[\s*([^\]\s]+)\s*\]\s*$/)
323                    {
324                            $Modes{$1}=1;
325                            $mode = $1;
326                            next;
327                    }
328                    
329                  unless(/^(\S+)\s*(.*)/)                  unless(/^(\S+)\s*(.*)/)
330                  {                  {
331                          &usage("Invalid configuration file parameter line '$_'");                          &usage("Invalid configuration file parameter line '$_'");
# Line 292  sub readConfig { Line 335  sub readConfig {
335                  my $val=$2;                  my $val=$2;
336                  $val='' unless(defined($val));                  $val='' unless(defined($val));
337                                    
338                  if($key=~/^HeaderTemplate\d+$/)                  unless(exists($Defaults{$key}))
339                  {                  {
340                          $ExtraKeys{$key}=1;                          &usage("Unknown configuration file parameter name '$key$mode'");
341                  }                  }
342                  else                  if($key eq 'ConfigFileLocation')
343                  {                  {
344                          unless(exists($Defaults{$key}))                          &usage("'ConfigFileLocation' parameter not allowed in configuration file!");
                         {  
                                 &usage("Unknown configuration file parameter name '$key'");  
                         }  
                         if($key eq 'ConfigFileLocation')  
                         {  
                                 &usage("'ConfigFileLocation' parameter not allowed in configuration file!");  
                         }  
345                  }                  }
346                                    
347                  $val=~s/^--/-/;                  $val=~s/^--/-/;
348                                    
349                  $ConfigFileData{$key}=$val;                  $ConfigFileData{"$key$mode"}=$val;
350          }          }
351          close(CONFIG);          close(CONFIG);
352  }  }
# Line 322  sub usage { Line 358  sub usage {
358                  print STDERR <<"EOT";                  print STDERR <<"EOT";
359  $msg;  $msg;
360  For further help type $::PGM -help  For further help type $::PGM -help
361  or consult docs at http://www.meteorserver.org/  or consult docs at http://meteorserver.org/
362  EOT  EOT
363    
364          } else {          } else {
# Line 330  EOT Line 366  EOT
366                    
367                  print STDERR <<"EOT";                  print STDERR <<"EOT";
368    
369  Meteor server v1.0 (release date: 1 Dec 2006)  Meteor server v$::VERSION (release date: $::RELEASE_DATE)
370  Licensed under the terms of the GNU General Public Licence (2.0)  Licensed under the terms of the GNU General Public Licence (2.0)
371    
372  Usage:  Usage:
# Line 354  configuration file. The default location Line 390  configuration file. The default location
390          $Defaults{'ConfigFileLocation'}          $Defaults{'ConfigFileLocation'}
391    
392  For more information and complete documentation, see the Meteor  For more information and complete documentation, see the Meteor
393  website at http://www.meteorserver.org/  website at http://meteorserver.org/
394  EOT  EOT
395    
396          }          }

Legend:
Removed from v.23  
changed lines
  Added in v.62

  ViewVC Help
Powered by ViewVC 1.1.26