/[meteor]/trunk/Meteor/Controller.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

Contents of /trunk/Meteor/Controller.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 67 - (show annotations)
Sat Mar 28 01:42:07 2009 UTC (15 years ago) by dpavlin
File size: 5990 byte(s)
correct trunk
1 #!/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 # A Meteor Controller
11 #
12 ###############################################################################
13 #
14 # This program is free software; you can redistribute it and/or modify it
15 # under the terms of the GNU General Public License as published by the Free
16 # Software Foundation; either version 2 of the License, or (at your option)
17 # any later version.
18 #
19 # This program is distributed in the hope that it will be useful, but WITHOUT
20 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
22 # more details.
23 #
24 # You should have received a copy of the GNU General Public License along
25 # with this program; if not, write to the Free Software Foundation, Inc.,
26 # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #
28 # For more information visit www.meteorserver.org
29 #
30 ###############################################################################
31
32 package Meteor::Controller;
33 ###############################################################################
34 # Configuration
35 ###############################################################################
36
37 use strict;
38
39 use Meteor::Connection;
40 use Meteor::Channel;
41 use Meteor::Subscriber;
42
43 @Meteor::Controller::ISA=qw(Meteor::Connection);
44
45 ###############################################################################
46 # Factory methods
47 ###############################################################################
48 sub newFromServer {
49 my $class=shift;
50
51 my $self=$class->SUPER::newFromServer(shift);
52
53 $::Statistics->{'current_controllers'}++;
54 $::Statistics->{'controller_connections_accepted'}++;
55
56 $self;
57 }
58
59 ###############################################################################
60 # Instance methods
61 ###############################################################################
62 sub processLine {
63 my $self=shift;
64 my $line=shift;
65
66 # ADDMESSAGE channel1 Message text
67 # < OK
68 # ADDMESSAGE
69 # < ERR Invalid command syntax
70 # COUNTSUBSCRIBERS channel1
71 # < OK 344
72
73 unless($line=~s/^(ADDMESSAGE|COUNTSUBSCRIBERS|LISTCHANNELS|LISTSUBSCRIBERS|LISTCONNECTIONS|DESCRIBE|SHOWSTATS|QUIT)//)
74 {
75 $self->write("ERR Invalid command syntax$::CRLF");
76
77 return;
78 }
79
80 my $cmd=$1;
81
82 if($cmd eq 'ADDMESSAGE')
83 {
84 unless($line=~s/^\s+(\S+)\s//)
85 {
86 $self->write("ERR Invalid command syntax$::CRLF");
87
88 return;
89 }
90
91 my $channelName=$1;
92 my $channel=Meteor::Channel->channelWithName($channelName);
93 my $msg=$channel->addMessage($line);
94 my $msgID=$msg->id();
95 $self->write("OK\t$msgID$::CRLF");
96 }
97 elsif($cmd eq 'COUNTSUBSCRIBERS')
98 {
99 unless($line=~s/^\s+(\S+)$//)
100 {
101 $self->write("ERR Invalid command syntax$::CRLF");
102 return;
103 }
104
105 my $channelName=$1;
106 my $numSubscribers=0;
107 my $channel=Meteor::Channel->channelWithName($channelName,1);
108 $numSubscribers=$channel->subscriberCount() if($channel);
109
110 $self->write("OK $numSubscribers$::CRLF");
111 }
112 elsif($cmd eq 'LISTCHANNELS')
113 {
114 unless($line eq '')
115 {
116 $self->write("ERR Invalid command syntax$::CRLF");
117 return;
118 }
119
120 my $txt="OK$::CRLF".Meteor::Channel->listChannels()."--EOT--$::CRLF";
121
122 $self->write($txt);
123 }
124 elsif($cmd eq 'LISTSUBSCRIBERS')
125 {
126 unless($line eq '')
127 {
128 $self->write("ERR Invalid command syntax$::CRLF");
129 return;
130 }
131
132 my $txt="OK$::CRLF".Meteor::Subscriber->listSubscribers()."--EOT--$::CRLF";
133
134 $self->write($txt);
135 }
136 elsif($cmd eq 'LISTCONNECTIONS')
137 {
138 unless($line eq '')
139 {
140 $self->write("ERR Invalid command syntax$::CRLF");
141 return;
142 }
143
144 my $txt="OK$::CRLF".Meteor::Connection->listConnections()."--EOT--$::CRLF";
145
146 $self->write($txt);
147 }
148 elsif($cmd eq 'DESCRIBE')
149 {
150 unless($line=~s/^\s+(\S+)$//)
151 {
152 $self->write("ERR Invalid command syntax$::CRLF");
153 return;
154 }
155
156 my $filenum=$1;
157 my $condesc=Meteor::Connection->describeConnWithFileNum($filenum);
158 if ($condesc != -1) {
159 $self->write("OK$::CRLF");
160 $self->write($condesc);
161 $self->write("--EOT--$::CRLF");
162
163 } else {
164 $self->write("ERR Unknown client$::CRLF");
165 }
166 }
167 elsif($cmd eq 'SHOWSTATS')
168 {
169 # uptime
170 my $uptime=time-$::STARTUP_TIME;
171 my $txt="OK$::CRLF"."uptime: $uptime$::CRLF";
172
173 # channel_count
174 my $numChannels=Meteor::Channel->numChannels();
175 $txt.="channel_count: $numChannels$::CRLF";
176
177 # connection_count
178 my $numConnections=Meteor::Connection->connectionCount();
179 $txt.="connection_count: $numConnections$::CRLF";
180
181 # subscriber count = current_subscribers + number of pollers in last minute
182 my $now = time; my $numpoll = 0;
183 foreach my $key (keys %{$::Pollers}) {
184 if($::Pollers->{$key} < ($now-60) || Meteor::Subscriber->subscriberExists($key)) {
185 delete $::Pollers->{$key};
186 } else {
187 $numpoll++;
188 }
189 }
190 my $numsub = 0;
191 if (exists($::Statistics->{'current_subscribers'})) {
192 $numsub = $::Statistics->{'current_subscribers'};
193 }
194 $txt.="real_subscribers: ".($numpoll+$numsub)."$::CRLF";
195
196 foreach my $key (keys %{$::Statistics})
197 {
198 $txt.=$key.': '.$::Statistics->{$key}.$::CRLF;
199 }
200
201 $txt.="--EOT--$::CRLF";
202
203 $self->write($txt);
204 }
205 elsif($cmd eq 'QUIT')
206 {
207 unless($line eq '')
208 {
209 $self->write("ERR Invalid command syntax$::CRLF");
210
211 return;
212 }
213
214 $self->write("OK$::CRLF");
215 $self->close(1);
216 }
217 else
218 {
219 # Should never get here
220 die("Unknown command '$cmd'");
221 }
222 }
223
224 sub close {
225 my $self=shift;
226 my $noShutdownMsg=shift;
227
228 unless($noShutdownMsg || $self->{'remoteClosed'})
229 {
230 my $msg=$::CONF{'ControllerShutdownMsg'};
231 if(defined($msg) && $msg ne '')
232 {
233 $self->write($msg);
234 }
235 }
236
237 $self->SUPER::close();
238 }
239
240 sub didClose {
241
242 $::Statistics->{'current_controllers'}--;
243 }
244
245 1;
246 ############################################################################EOF

  ViewVC Help
Powered by ViewVC 1.1.26