Project

General

Profile

Download (2.73 KB) Statistics
| Branch: | Tag: | Revision:
ecdabe95 Marc Dequènes (Duck)
#--
# 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'
d1e614b5 Marc Dequènes (Duck)
require 'cyborghood/cyborg/interface'
b7f7d214 Marc Dequènes (Duck)
require 'cyborghood/cyborg/conversation'
ecdabe95 Marc Dequènes (Duck)

module CyborgHood
class BotServer
private_class_method :new

3d653143 Marc Dequènes (Duck)
attr_reader :interface

050eca43 Marc Dequènes (Duck)
def self.build(interface)
ecdabe95 Marc Dequènes (Duck)
case Config.instance.botnet.connection_type
when 'unix_socket'
050eca43 Marc Dequènes (Duck)
return BotServerUNIXSocket.new(interface)
ecdabe95 Marc Dequènes (Duck)
else
raise CyberError.new(:unrecoverable, "config", "Unknown botnet connection type")
end
end

050eca43 Marc Dequènes (Duck)
def initialize(interface)
@interface = interface

ecdabe95 Marc Dequènes (Duck)
@config = Config.instance
3d653143 Marc Dequènes (Duck)
@comm_list = {}
ecdabe95 Marc Dequènes (Duck)
end

def run
EventMachine.run do
yield
end
end

def stop
3d653143 Marc Dequènes (Duck)
@comm_list.values.each {|conv| conv.bye }
ecdabe95 Marc Dequènes (Duck)
EventMachine.stop
end
3d653143 Marc Dequènes (Duck)
# 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
69a12fdb Marc Dequènes (Duck)
def schedule_task(callback, &task)
EventMachine.defer(task, callback)
end
ecdabe95 Marc Dequènes (Duck)
end

class BotServerUNIXSocket < BotServer
public_class_method :new

050eca43 Marc Dequènes (Duck)
def initialize(interface)
super(interface)
ecdabe95 Marc Dequènes (Duck)
@socket = File.join(Config::RUN_DIR, @config.bot_name.downcase + ".sock")
at_exit { remove_socket_file }
end

def run
super do
3d653143 Marc Dequènes (Duck)
EventMachine.start_unix_domain_server(@socket, ConversationUNIXSocket, self)
ecdabe95 Marc Dequènes (Duck)
end
end

private

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

b7f7d214 Marc Dequènes (Duck)
# default interface if not overridden
bc473567 Marc Dequènes (Duck)
class EmptyInterface
include CyborgServerInterface
b7f7d214 Marc Dequènes (Duck)
include CyborgServerRootInterfaceAddon
bc473567 Marc Dequènes (Duck)
end

d1e614b5 Marc Dequènes (Duck)
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
1c89625f Marc Dequènes (Duck)
EmptyInterface.instance
d1e614b5 Marc Dequènes (Duck)
end
end
ecdabe95 Marc Dequènes (Duck)
end