Project

General

Profile

Download (2.73 KB) Statistics
| Branch: | Tag: | Revision:
#--
# CyborgHood, a distributed system management software.
# Copyright (c) 2009-2010 Marc Dequènes (Duck) <Duck@DuckCorp.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#++

require 'eventmachine'
require 'cyborghood/cyborg/interface'
require 'cyborghood/cyborg/conversation'


module CyborgHood
class BotServer
private_class_method :new

attr_reader :interface

def self.build(interface)
case Config.instance.botnet.connection_type
when 'unix_socket'
return BotServerUNIXSocket.new(interface)
else
raise CyberError.new(:unrecoverable, "config", "Unknown botnet connection type")
end
end

def initialize(interface)
@interface = interface

@config = Config.instance

@comm_list = {}
end

def run
EventMachine.run do
yield
end
end

def stop
@comm_list.values.each {|conv| conv.bye }
EventMachine.stop
end

# used to quit properly and later to reuse communication channels
def register_communication(peer, conversation)
@comm_list[peer] = conversation
end

def unregister_communication(peer)
@comm_list.delete(peer)
end

def schedule_task(callback, &task)
EventMachine.defer(task, callback)
end
end

class BotServerUNIXSocket < BotServer
public_class_method :new

def initialize(interface)
super(interface)

@socket = File.join(Config::RUN_DIR, @config.bot_name.downcase + ".sock")
at_exit { remove_socket_file }
end

def run
super do
EventMachine.start_unix_domain_server(@socket, ConversationUNIXSocket, self)
end
end

private

def remove_socket_file
File.delete(@socket) if @socket && File.exist?(@socket)
end
end

# default interface if not overridden
class EmptyInterface
include CyborgServerInterface
include CyborgServerRootInterfaceAddon
end

module SimpleServer
def setup
super
@server = BotServer.build(self.interface)
end

def run
super
@server.run
end

def ask_to_stop
@server.stop
super
end

def interface
EmptyInterface.instance
end
end
end
(4-4/5)