Project

General

Profile

Download (3.43 KB) Statistics
| Branch: | Tag: | Revision:
d1e614b5 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 'singleton'


module CyborgHood
bc473567 Marc Dequènes (Duck)
module CyborgServerInterface
def self.included(base)
base.class_eval("include Singleton")
base.extend(ClassMethods)
end
d1e614b5 Marc Dequènes (Duck)
bc473567 Marc Dequènes (Duck)
module ClassMethods
def decompose_command(cmd)
object, method = cmd.split('.', 2)
ce98dac2 Marc Dequènes (Duck)
bc473567 Marc Dequènes (Duck)
if method
begin
klass = object.split('::').inject(self) {|scope, const_name| scope.const_get(const_name)}
rescue
return
end
ce98dac2 Marc Dequènes (Duck)
else
bc473567 Marc Dequènes (Duck)
if object.index("::")
return
else
klass = self
method = cmd
end
ce98dac2 Marc Dequènes (Duck)
end
bc473567 Marc Dequènes (Duck)
[klass, method]
ce98dac2 Marc Dequènes (Duck)
end

bc473567 Marc Dequènes (Duck)
def api_method_name?(method)
method =~ /^api_(.+)$/
$1
end
ce98dac2 Marc Dequènes (Duck)
bc473567 Marc Dequènes (Duck)
def api_method_to_class_method_name(method)
"api_#{method}".to_sym
end
ce98dac2 Marc Dequènes (Duck)
bc473567 Marc Dequènes (Duck)
def has_node?(cmd)
klass, method = self.decompose_command(cmd)
return false if klass.nil?
return true if method.nil?

inst = klass.instance
inst.api_methods.include?(method)
end
ce98dac2 Marc Dequènes (Duck)
end

d1e614b5 Marc Dequènes (Duck)
def initialize
@config = Config.instance
end

def api_modules
@modules ||= self.class.constants.select do |c|
cc = self.class.const_get(c)
cc.class == Class and cc.ancestors.include? CyborgServerInterface
end
end

def api_methods
ce98dac2 Marc Dequènes (Duck)
@methods ||= self.methods.collect{|m| self.class.api_method_name?(m) }.compact
d1e614b5 Marc Dequènes (Duck)
end

# preliminary incoming message handling
f94d64b1 Marc Dequènes (Duck)
def call(cmd, data)
ce98dac2 Marc Dequènes (Duck)
klass, method = self.class.decompose_command(cmd)
return "551 unknown object" if klass.nil?
d1e614b5 Marc Dequènes (Duck)
inst = klass.instance

unless inst.api_methods.include?(method)
return "551 this object has no such method"
end

ce98dac2 Marc Dequènes (Duck)
begin
f94d64b1 Marc Dequènes (Duck)
formated_data = YAML.load(data) unless data.nil?
ce98dac2 Marc Dequènes (Duck)
rescue
f94d64b1 Marc Dequènes (Duck)
return "552 unreadable data for arguments"
ce98dac2 Marc Dequènes (Duck)
end

f94d64b1 Marc Dequènes (Duck)
return "552 wrong format for arguments" unless formated_data.is_a? Array

d1e614b5 Marc Dequènes (Duck)
begin
# preliminary outgoing message handling
ce98dac2 Marc Dequènes (Duck)
real_method = self.class.api_method_to_class_method_name(method)
f94d64b1 Marc Dequènes (Duck)
#if inst.method(real_method).arity > 0
r = inst.send(real_method, *formated_data)
#else
# return "552 method does not take any argument" if formated_data
# r = inst.send(real_method)
#end
ce98dac2 Marc Dequènes (Duck)
r.to_yaml
d1e614b5 Marc Dequènes (Duck)
rescue
return "550 method call failed"
end
end
end

bc473567 Marc Dequènes (Duck)
module CyborgServerDefaultInterface
ce98dac2 Marc Dequènes (Duck)
PROTOCOL_VERSION = "0.1~"
d1e614b5 Marc Dequènes (Duck)
def api_product
PRODUCT
end

def api_version
VERSION
end

ce98dac2 Marc Dequènes (Duck)
def api_protocol_version
PROTOCOL_VERSION
d1e614b5 Marc Dequènes (Duck)
end

def api_bot_name
@config.bot_name
end
end
end