Project

General

Profile

Download (3.34 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'
e321ca6f Marc Dequènes (Duck)
require 'cyborghood/cyborg/botnet_dsl'
c501ebc2 Marc Dequènes (Duck)
require 'set'
ecdabe95 Marc Dequènes (Duck)
module CyborgHood
b7f7d214 Marc Dequènes (Duck)
# default interface if not overridden
70c59c34 Marc Dequènes (Duck)
# a mere "BotClient" would then always have a default basic interface
bc473567 Marc Dequènes (Duck)
class EmptyInterface
include CyborgServerInterface
b7f7d214 Marc Dequènes (Duck)
include CyborgServerRootInterfaceAddon
bc473567 Marc Dequènes (Duck)
end

d57fd602 Marc Dequènes (Duck)
module BotNetClientUNIXSocket
45333094 Marc Dequènes (Duck)
def identifier_prefix
"unix_socket"
end

7d493229 Marc Dequènes (Duck)
def setup
super
c501ebc2 Marc Dequènes (Duck)
@pending_conversation_close = Set.new
7d493229 Marc Dequènes (Duck)
end

d57fd602 Marc Dequènes (Duck)
def peer_socket(peer)
File.join(Config::RUN_DIR, peer.downcase + ".sock")
end

def contact_peer(peer, &block)
if @comm_list.has_key? peer
block.call @comm_list[peer]
else
0299bce8 Marc Dequènes (Duck)
if @comm_list_attempt.has_key? peer
@comm_list_attempt[peer] << block
else
@comm_list_attempt[peer] = [block]

# demultiplex callbacks
callback = proc do |conversation|
block_list = @comm_list_attempt[peer]
# purge list at once to avoid races
@comm_list_attempt.delete(peer)

block_list.each do |block|
block.call conversation
end
end
begin
EventMachine.connect_unix_domain(peer_socket(peer), Conversation, self, callback)
rescue
# TODO: retry (wait_timer + recursive call + counter)
block.call false
end
35e0fb89 Marc Dequènes (Duck)
end
d57fd602 Marc Dequènes (Duck)
end
end
end

70c59c34 Marc Dequènes (Duck)
module BotNet
bc642412 Marc Dequènes (Duck)
attr_reader :interface

d57fd602 Marc Dequènes (Duck)
def self.included(base)
case Config.instance.botnet.connection_type
when 'unix_socket'
return base.class_eval("include BotNetClientUNIXSocket")
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 = {}
0299bce8 Marc Dequènes (Duck)
@comm_list_attempt = {}
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)
7d493229 Marc Dequènes (Duck)
@pending_conversation_close.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
f292535b Marc Dequènes (Duck)
protected

7d493229 Marc Dequènes (Duck)
def process_system_notification(msg)
if msg[:topic] == 'CONVERSATION IDLE'
peer = @comm_list[msg[:peer]]
return if peer.nil?

peer.bye
else
super
end
end

f292535b Marc Dequènes (Duck)
def ready_to_stop?
4d9f2962 Marc Dequènes (Duck)
@comm_list.empty? and super
f292535b Marc Dequènes (Duck)
end
d1e614b5 Marc Dequènes (Duck)
end
ecdabe95 Marc Dequènes (Duck)
end