Sha256: 320326aad05884bb4a62c8c8cec5f4837bb1113a9ffad0cc46b7d3d45920d6a9

Contents?: true

Size: 1.86 KB

Versions: 2

Compression:

Stored size: 1.86 KB

Contents

module Lita
  module Handlers
    class Dig < Handler
      config :default_resolver, default: '8.8.8.8'

      DNS_TYPES = %w(a ns md cname soa mb mg mr null wks ptr hinfo minfo
                     mx txt rp afsdb x25 isdn rt nsap nsapptr sig key px
                     gpos aaaa loc nxt eid nimloc srv atma naptr kx cert
                     dname opt ds sshfp rrsig nsec dnskey uinfo uid gid
                     unspec tkey tsig ixfr axfr mailb maila any)

      route(
        /^dig
          (?:\s\@)?(?<resolver>\S+)?
          (\s+(?<record>\S+))
          (?<type>\s\w+)?
          (?<short>\s\+short)?$
        /x,
        :resolve,
        command: true,
        help: {
          t('help.resolve.syntax') => t('help.resolve.desc')
        }
      )

      def resolve(response)
        resolver = response.match_data['resolver'] || config.default_resolver
        record   = response.match_data['record']
        type     = (response.match_data['type'] || 'a').strip
        short    = response.match_data['short']
        result   = lookup(record, type, resolver)
        response.reply(format_lookup(result, short))
      end

      private

      def lookup(argument, type, server = nil)
        return t('error.unknown_type') unless DNS_TYPES.include?(type.downcase)
        type = Object.const_get('Net::DNS::' + type.upcase)

        resolver = Net::DNS::Resolver.new
        resolver.nameservers = server unless server.nil?

        begin
          resolver.query(argument, type)
        rescue
          t('error.unable_to_resolve', argument: argument)
        end
      end

      def format_lookup(lookup, compact = false)
        result = ''
        if compact
          lookup.each_address do |ip|
            result += "#{ip}\n"
          end
        else
          result = lookup.to_s
        end
        result
      end
    end

    Lita.register_handler(Dig)
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
lita-dig-1.2.0 lib/lita/handlers/dig.rb
lita-dig-1.1.0 lib/lita/handlers/dig.rb