# frozen_string_literal: true
#
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
#
# ronin-support is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ronin-support 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 Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with ronin-support. If not, see .
#
require 'ronin/support/network/asn/record'
require 'ronin/support/network/dns'
require 'date'
module Ronin
module Support
module Network
module ASN
#
# Represents a DNS record returned by
# [Team Cymru's ASN rDNS service][1].
#
# [1]: https://team-cymru.com/community-services/ip-asn-mapping/
#
class DNSRecord < Record
#
# Initializes the record.
#
# @param [Integer] number
# The ASN number.
#
# @param [IPRange::CIDR, IPRange::Range] range
# The IP range of the ASN record.
#
# @param [String, nil] country_code
# The country code of the ASN record.
#
def initialize(number,range,country_code)
super(number,range,country_code,nil)
end
#
# The name of the ASN record.
#
# @return [String]
#
# @note
# Calling this method for the first time will lazy query
# `AS.asn.cymru.com` for the additional ASN information.
#
def name
query_additional_info! if @name.nil?
return @name
end
#
# The registry's name of the ASN record.
#
# @return [String]
#
# @note
# Calling this method for the first time will lazy query
# `AS.asn.cymru.com` for the additional ASN information.
#
def registry
query_additional_info! if @registry.nil?
return @registry
end
#
# The date the ASN record was registered.
#
# @return [Date]
#
# @note
# Calling this method for the first time will lazy query
# `AS.asn.cymru.com` for the additional ASN information.
#
def date
query_additional_info! if @date.nil?
return @date
end
private
#
# Queries the additional information for the AS number.
#
def query_additional_info!
string = DNS.get_txt_string("AS#{@number}.asn.cymru.com")
_, _, @registry, @date, @name = string.split(' | ',5)
@date = Date.parse(@date)
@name.chomp!(", #{country_code}")
end
end
end
end
end
end