Revision 7bfcd98b
Added by Marc Dequènes about 13 years ago
- ID 7bfcd98b929705cc5c65b729a60f022827a66bfe
lib/cyborghood/cyborg/botnet/interface.rb | ||
---|---|---|
end
|
||
end
|
||
|
||
def attr_search_node
|
||
def attr_search_node(list = nil, &block)
|
||
list ||= block
|
||
|
||
lookup_node = self
|
||
|
||
node '?', :hidden => true do
|
||
... | ... | |
if request.args.empty?
|
||
request.reply.results = lookup_node.__send__(:visible_nodes_names)
|
||
else
|
||
node_names_list = []
|
||
|
||
lookup_node.__send__(:visible_nodes).each do |match, node|
|
||
if match.is_a? String
|
||
match_list = [match]
|
||
elsif match.is_a? Proc
|
||
match_list = match.call
|
||
else
|
||
next
|
||
end
|
||
|
||
match_list.each do |child_node_name|
|
||
node.__send__(:load, child_node_name)
|
||
result = node.__send__(:request, request.session)
|
||
next unless result.respond_to? :to_hash
|
||
|
||
if hash_match_criterias(result.to_hash, request.args.first)
|
||
node_names_list << child_node_name
|
||
end
|
||
end
|
||
end
|
||
|
||
request.reply.results = node_names_list
|
||
request.reply.results = list.nil? ? search_among_children(request, lookup_node) :
|
||
search_in_list(request, lookup_node, list)
|
||
end
|
||
end
|
||
end
|
||
... | ... | |
|
||
def _call(session, node_path, args = nil)
|
||
args ||= []
|
||
raise CyberError.new(:unrecoverable, 'api/cyborghood', "wrong format for arguments") unless args.is_a? Array
|
||
raise CyberError.new(:unrecoverable, 'api/cyborghood', "wrong format for arguments when calling node '#{node_path}'") unless args.is_a? Array
|
||
|
||
node = find_node(session, node_path)
|
||
raise CyberError.new(:unrecoverable, 'api/cyborghood', "unknown node") if node.nil?
|
||
raise CyberError.new(:unrecoverable, 'api/cyborghood', "unknown node '#{node_path}'") if node.nil?
|
||
|
||
logger.debug "[Server API] Node '#{node_path}' found"
|
||
node.__send__(:request, session, args)
|
||
... | ... | |
rescue
|
||
logger.debug "node request error message: " + $!
|
||
logger.debug "node request error backtrace: " + $!.backtrace.join("\n")
|
||
raise CyberError.new(:unrecoverable, 'api/cyborghood', "method call failed: " + $!)
|
||
raise CyberError.new(:unrecoverable, 'api/cyborghood', "call failed on node '#{node_path}': " + $!)
|
||
end
|
||
else
|
||
visible_nodes_names
|
||
... | ... | |
|
||
def hash_match_criterias(hash, crit)
|
||
crit.each do |key, wanted_value|
|
||
value = hash[key]
|
||
# force cast to string in case of a composite object
|
||
value = hash[key].to_s
|
||
|
||
if wanted_value.is_a? Array
|
||
return false unless wanted_value.include?(value)
|
||
... | ... | |
|
||
true
|
||
end
|
||
|
||
def search_among_children(request, lookup_node)
|
||
node_names_list = []
|
||
|
||
lookup_node.__send__(:visible_nodes).each do |match, node|
|
||
if match.is_a? String
|
||
match_list = [match]
|
||
elsif match.is_a? Proc
|
||
match_list = match.call
|
||
else
|
||
next
|
||
end
|
||
|
||
match_list.each do |child_node_name|
|
||
node.__send__(:load, child_node_name)
|
||
result = node.__send__(:request, request.session)
|
||
next unless result.respond_to? :to_hash
|
||
|
||
if hash_match_criterias(result.to_hash, request.args.first)
|
||
node_names_list << child_node_name
|
||
end
|
||
end
|
||
end
|
||
|
||
node_names_list
|
||
end
|
||
|
||
def search_in_list(request, lookup_node, list)
|
||
criterias = request.args.first
|
||
return [] unless criterias.is_a? Hash
|
||
|
||
if list.is_a? Proc
|
||
list = list.call(criterias)
|
||
# if result is an array, then a final list of names is given, return it
|
||
return list if list.is_a? Array
|
||
# else it must be a Hash which needs to be filtered
|
||
end
|
||
|
||
node_names_list = []
|
||
|
||
list.each do |element_name, element|
|
||
if hash_match_criterias(element.to_hash, criterias)
|
||
node_names_list << element_name
|
||
end
|
||
end
|
||
|
||
node_names_list
|
||
end
|
||
end
|
||
end
|
||
end # DSL
|
||
end
|
Also available in: Unified diff
[evol] Librarian API work §3