Project

General

Profile

« Previous | Next » 

Revision bc642412

Added by Marc Dequènes over 13 years ago

  • ID bc642412b31c7f4a3066a649cd06cc2a0acc4b8b

[evol] moved EM loop in Cyborg, simplified and enhanced bot interface, and made Conversation common for any connection type

View differences:

lib/cyborghood/cyborg/server.rb
# 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)
module BotServerUNIXSocket
def setup
super
@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
def start_work
super
EventMachine.start_unix_domain_server(@socket, Conversation, self)
end
private
def remove_socket_file
File.delete(@socket) if @socket && File.exist?(@socket)
end
# backend-specific capabilities
def capabilities
super + []
end
# TODO: should be common to the future BotClientUNIXSocket
def identifier_prefix
"unix_socket"
end
end
# default interface if not overridden
......
include CyborgServerRootInterfaceAddon
end
module SimpleServer
module BotServer
attr_reader :interface
def self.included(base)
case Config.instance.botnet.connection_type
when 'unix_socket'
return base.class_eval("include BotServerUNIXSocket")
else
raise CyberError.new(:unrecoverable, "config", "Unknown botnet connection type")
end
end
def setup
super
@server = BotServer.build(self.interface)
@comm_list = {}
end
def run
super
@server.run
# 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 ask_to_stop
@server.stop
@comm_list.values.each {|conv| conv.bye }
super
end

Also available in: Unified diff