Project

General

Profile

Download (2.35 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/>.
#++

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
bc642412 Marc Dequènes (Duck)
module BotServerUNIXSocket
def setup
super
ecdabe95 Marc Dequènes (Duck)
@socket = File.join(Config::RUN_DIR, @config.bot_name.downcase + ".sock")
at_exit { remove_socket_file }
end

bc642412 Marc Dequènes (Duck)
def start_work
super
EventMachine.start_unix_domain_server(@socket, Conversation, self)
ecdabe95 Marc Dequènes (Duck)
end

def remove_socket_file
File.delete(@socket) if @socket && File.exist?(@socket)
end
bc642412 Marc Dequènes (Duck)
# backend-specific capabilities
def capabilities
super + []
end

# TODO: should be common to the future BotClientUNIXSocket
def identifier_prefix
"unix_socket"
end
ecdabe95 Marc Dequènes (Duck)
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

bc642412 Marc Dequènes (Duck)
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

d1e614b5 Marc Dequènes (Duck)
def setup
super
bc642412 Marc Dequènes (Duck)
@comm_list = {}
d1e614b5 Marc Dequènes (Duck)
end

bc642412 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)
d1e614b5 Marc Dequènes (Duck)
end

def ask_to_stop
bc642412 Marc Dequènes (Duck)
@comm_list.values.each {|conv| conv.bye }
d1e614b5 Marc Dequènes (Duck)
super
end

def interface
1c89625f Marc Dequènes (Duck)
EmptyInterface.instance
d1e614b5 Marc Dequènes (Duck)
end
end
ecdabe95 Marc Dequènes (Duck)
end