--- googlecode.com/svn/trunk/meteord 2006/11/20 18:05:33 5 +++ googlecode.com/svn/trunk/meteord 2008/02/28 00:21:39 55 @@ -6,6 +6,11 @@ # # The Meteor daemon # +# Main program should call Meteor::Config::setCommandLineParameters(@ARGV),. +# Afterwards anybody can access $::CONF{}, where +# is any valid parameter (except 'Help') listed in the +# @DEFAULTS array below. +# ############################################################################### # # This program is free software; you can redistribute it and/or modify it @@ -26,6 +31,12 @@ # ############################################################################### +############################################################################### +# meterod version +################################################################################ + + $::VERSION='1.05.11'; + $::RELEASE_DATE='not yet released'; ############################################################################### # Configuration @@ -33,6 +44,8 @@ use strict; + use Socket; + use Meteor::Syslog; use Meteor::Socket; @@ -52,12 +65,20 @@ our $AGE_CHECK_INTERVALL=60; our $MAX_EXIT_DELAY=120; + + our $UDP_MAX_MESSAGE_SIZE=8192; ############################################################################### # Main ############################################################################### # + # Record startup time + # + $::STARTUP_TIME=time; + $::STARTUP_TIME+=0; # avoid warning + + # # Program name # $::PGM=$0; @@ -85,7 +106,9 @@ { $0="$::PGM daemon"; - unless($::CONF{'Debug'}) + my $facility=$::CONF{'SyslogFacility'} || $Meteor::Syslog::DEFAULT_FACILITY; + + unless($::CONF{'Debug'} || $facility eq 'none') { # close standard file descriptors close(STDIN); @@ -108,7 +131,7 @@ } else { - print "$::PGM PID: $$\n"; + &::syslog('info',"PID\t%s",$$); } } @@ -141,9 +164,22 @@ ); my $subscriberServerFN=$subscriberServer->fileno(); + my $udpServer=undef; + my $udpPort=$::CONF{'UDPPort'}; + my $udpServerFN=undef; + if($udpPort && $udpPort>0) + { + $udpServer=Meteor::Socket->newUDPServer( + $udpPort, + $::CONF{'UDPIP'} + ); + $udpServerFN=$udpServer->fileno(); + } + my $serverVector=''; vec($serverVector,$controlServerFN,1)=1; vec($serverVector,$subscriberServerFN,1)=1; + vec($serverVector,$udpServerFN,1)=1 if(defined($udpServerFN)); my $lastAgeCheck=time; @@ -162,11 +198,11 @@ my $rVec=$serverVector; my $wVec=''; my $eVec=''; - + my $rout; my $wout; my $eout; - + Meteor::Connection->addAllHandleBits(\$rVec,\$wVec,\$eVec); my $timeout=$MAIN_LOOP_TIMEOUT; @@ -191,6 +227,10 @@ { Meteor::Subscriber->newFromServer($subscriberServer); } + if(defined($udpServerFN) && vec($rout,$udpServerFN,1)) + { + &handleUPD($udpServer); + } Meteor::Connection->checkAllHandleBits($rout,$wout,$eout); } @@ -311,5 +351,32 @@ &::syslog('emerg',"$::PGM loop exited"); +############################################################################### +# Subroutines +############################################################################### +sub handleUPD { + $udpServer=shift; + + my $line; + my $hispaddr=recv($udpServer->{'handle'},$line,$::UDP_MAX_MESSAGE_SIZE,0); + + &::syslog('debug',"udp message received: %s",$line); + + return unless($line=~s/^(\S+)\s//); + + my $cmd=$1; + + if($cmd eq 'ADDMESSAGE') + { + return unless($line=~s/^(\S+)\s//); + + my $channelName=$1; + my $channel=Meteor::Channel->channelWithName($channelName); + my $msg=$channel->addMessage($line); + my $msgID=$msg->id(); + &::syslog('debug',"udp: new message added, ID %s",$msgID); + } +} + 1; ############################################################################EOF \ No newline at end of file