Skip to content

Commit

Permalink
Ready to start testing
Browse files Browse the repository at this point in the history
  • Loading branch information
winton committed Jan 16, 2011
1 parent 58db62b commit 49e4318
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 20 deletions.
16 changes: 15 additions & 1 deletion lib/puggernaut.rb
Expand Up @@ -11,5 +11,19 @@
require 'puggernaut/server' require 'puggernaut/server'


module Puggernaut module Puggernaut
# snort snort class <<self

attr_accessor :env

def logger
unless @logger
base = File.expand_path('../../', __FILE__)
FileUtils.mkdir_p("#{base}/log")
file = File.open("#{base}/log/#{env}.log", 'a')
file.sync = true
@logger = Logger.new(file)
end
@logger
end
end
end end
29 changes: 29 additions & 0 deletions lib/puggernaut/client.rb
@@ -1,8 +1,37 @@
module Puggernaut module Puggernaut
class Client class Client


def initialize(env, servers)
Puggernaut.env = env

loop do
begin
GC.start
EM.epoll if EM.epoll?
EM.run do
@connections = servers.inject([]) do |array, (host, port)|
logger.info "#{Time.now} Starting TCP client for #{host}:#{port}"
array << EM.connect(host, port, Tcp)
end
end
rescue Interrupt
logger.info "#{Time.now} Shuting down client..."
exit
rescue
logger.error "#{Time.now} Error: " + $!.message
logger.error "\t" + $!.backtrace.join("\n\t")
end
end
end

def logger def logger
Puggernaut.logger Puggernaut.logger
end end

def say(messages)
@connections.each do |connection|
connection.say messages
end
end
end end
end end
42 changes: 42 additions & 0 deletions lib/puggernaut/client/tcp.rb
@@ -0,0 +1,42 @@
module Puggernaut
class Client
module Tcp

include EM::Deferrable

def connection_completed
@reconnecting = false
@connected = true
succeed
end

def logger
Puggernaut.logger
end

def say(messages)
messages.each do |room, messages|
messages.each do |message|
send_data "#{room}|#{message}"
logger.info "#{Time.now} Said #{message} to #{room}"
end
end
end

def send_data(data)
callback{ super(data) }
end

def unbind
@deferred_status = nil
if @connected || @reconnecting
EM.add_timer(1) { reconnect @host, @port }
@connected = false
@reconnecting = true
else
raise 'Unable to connect to server'
end
end
end
end
end
42 changes: 28 additions & 14 deletions lib/puggernaut/server.rb
Expand Up @@ -5,23 +5,37 @@
module Puggernaut module Puggernaut
class Server class Server


def initialize(env='development')
self.class.env = env
end

class <<self class <<self
attr_accessor :env, :rooms attr_accessor :rooms

end
def logger
unless @logger def initialize(env='development', port=8000)
base = File.expand_path('../../', __FILE__) Puggernaut.env = env
FileUtils.mkdir_p("#{base}/log")
file = File.open("#{base}/log/#{env}.log", 'a') loop do
file.sync = true begin
@logger = Logger.new(file) GC.start
self.class.rooms = {}
EM.epoll if EM.epoll?
EM.run do
logger.info "#{Time.now} Starting HTTP server on port #{port}"
EM.start_server '0.0.0.0', port, Http

logger.info "#{Time.now} Starting TCP server on port #{port+1}"
EM.start_server '0.0.0.0', port + 1, Tcp
end
rescue Interrupt
logger.info "#{Time.now} Shuting down server..."
exit
rescue
logger.error "#{Time.now} Error: " + $!.message
logger.error "\t" + $!.backtrace.join("\n\t")
end end
@logger
end end
end end

def logger
Puggernaut.logger
end
end end
end end
8 changes: 4 additions & 4 deletions lib/puggernaut/server/http.rb
Expand Up @@ -11,19 +11,19 @@ def receive_data(data)
method, request, version = lines.shift.split(' ', 3) method, request, version = lines.shift.split(' ', 3)


if request.nil? if request.nil?
logger.error "#{Time.now} strange request: #{[method, request, version].inspect}" logger.error "#{Time.now} Strange request: #{[method, request, version].inspect}"
close_connection close_connection
return return
else else
path, query = request.split('?', 2) path, query = request.split('?', 2)
logger.info "#{Time.now} request on #{path} with #{query}" logger.info "#{Time.now} Request on #{path} with #{query}"
query = CGI.parse(query) if not query.nil? query = CGI.parse(query) if not query.nil?
end end


if path == '/' if path == '/'
if query && query['rooms'] if query && query['rooms']
@rooms = query['rooms'].split(',').inject([]) do |array, room| @rooms = query['rooms'].split(',').inject([]) do |array, room|
array << (Puggernaut.rooms[room] ||= Room.new(room)) array << (Puggernaut::Server.rooms[room] ||= Room.new(room))
array array
end end
if query['last'] if query['last']
Expand All @@ -33,7 +33,7 @@ def receive_data(data)
array array
}.join("\n") }.join("\n")
else else
EventMachine::Timer.new(30) { respond } EM::Timer.new(30) { respond }
@subscription_ids = @rooms.collect do |room| @subscription_ids = @rooms.collect do |room|
room.subscribe { |str| respond str } room.subscribe { |str| respond str }
end end
Expand Down
2 changes: 1 addition & 1 deletion lib/puggernaut/server/tcp.rb
Expand Up @@ -11,7 +11,7 @@ def receive_data(data)
room, message = line.split('|', 1) room, message = line.split('|', 1)
room = Puggernaut.rooms[room] ||= Room.new(room) room = Puggernaut.rooms[room] ||= Room.new(room)
id = room.say message id = room.say message
logger.info "#{Time.now} message #{id} sent to #{room.room}" logger.info "#{Time.now} Message #{id} sent to #{room.room}"
end end
end end
end end
Expand Down

0 comments on commit 49e4318

Please sign in to comment.