codeout/irrc

View on GitHub
lib/irrc/whoisd/client.rb

Summary

Maintainability
A
35 mins
Test Coverage
require 'net/telnet'

require 'irrc/connecting'
require 'irrc/logging'
require 'irrc/parameter'
require 'irrc/prefix'
require 'irrc/runner'
require 'irrc/socket'
require 'irrc/whoisd/api'

module Irrc
  module Whoisd

    # Public: Whoisd client worker.
    class Client
      include Irrc::Connecting
      include Irrc::Logging
      include Irrc::Parameter
      include Irrc::Prefix
      include Irrc::Runner
      include Irrc::Whoisd::Api


      private

      def process(query)
        case query.object_type
        when 'as-set'
          expand_set query, 'as-set'
        when 'route-set'
          expand_set query, 'route-set'
        when 'aut-num'
          expand_aut_num query
        end

        query
      end

      # Public: Expand an as-set or route-set object into any object.
      def expand_set(query, type)
        result = cache(query.object, query.sources) {
          begin
            command = expand_set_command(query.object, query.sources, type)
            execute(command)
          rescue
            raise "'#{command}' failed on '#{@fqdn}' (#{$!.message})."
          end
        }

        parse_objects_from_set(result).each do |object|
          next if query.ancestor_object?(object)

          child = query.fork(object)

          case child.object_type
          when 'aut-num'
            query.add_aut_num_result object
          when nil  # it looks prefix which is a member of route-set
            prefix = classify_by_protocol(object)
            query.protocols.each do |protocol|
              query.add_prefix_result prefix[protocol], nil, protocol
            end
          end
        end
      end

      # Public: Expand an aut-num object into routes
      def expand_aut_num(query)
        return if query.protocols.empty?

        result = cache(query.object, query.sources) {
          begin
            command = expand_aut_num_command(query.object, query.sources)
            execute(command)
          rescue
            raise "'#{command}' failed on '#{@fqdn}' (#{$!.message})."
          end
        }

        query.protocols.each do |protocol|
          query.add_prefix_result parse_prefixes_from_aut_num(result, protocol), query.object, protocol
        end
      end
    end
  end
end