R/whois.R

Defines functions whois

Documented in whois

#' Issue a 'WHOIS' query and retrieve the response
#'
#' WHOIS (pronounced as the phrase "who is") is a query and response protocol
#' that is widely used for querying databases that store the registered users
#' or assignees of an Internet resource, such as a domain name, an IP address
#' block or an autonomous system, but is also used for a wider range of other
#' information. The protocol stores and delivers database content in a human-
#' readable format. The current iteration of the WHOIS protocol was drafted
#' by the Internet Society, and is documented in RFC 3912.
#'
#' The default server — `whois.pwhois.org` — is [The Prefix WhoIs Project](https://pwhois.org/)
#' WHOIS server which provides a whois-compatible client and server framework for
#' disclosing various up-to-date routing information. Instead of using
#' registrar-originated network information (which is often unspecific or
#' inaccurate), Prefix WhoIs uses the Internet's global routing table as
#' gleaned from a number of routing peers around the world. Other sources of
#' information, such as imported data from ARIN are also supported.
#'
#' The pwhois service supports special query types including:
#'
#' - `registry key=value`: you can search the pwhois database for any registry
#'    field. The ones available at the time of the date on
#'    this package are: "`Origin-AS`", "`Prefix"`, "`AS-Path"`,
#'    "`AS-Org-Name`", "`Org-Name`", "`Net-Name`", "`Cache-Date`",
#'    "`Latitude`", "`Longitude`", "`City"`, "`Region"` ,
#'    "`Country"` , and "`Country-Code`"
#' - `type=cymru`: The record(s) will be returned in
#'    [Team Cymru format](https://team-cymru.com/community-services/ip-asn-mapping/)
#'    and [tidy_cymru()] can be used to post-process the response.
#' - `type=rpsl`: The record(s) will be returned in
#'    [Routing Policy Specification Language](https://tools.ietf.org/html/rfc2650)
#'   (RPSL) format. A 'tidy' post-processor is on the TODO list. PRs are welcome.
#'
#' This function can also be used to query the
#' [Team Cymru WHOIS](https://team-cymru.com/community-services/ip-asn-mapping/)
#' server which supports various enhanced queries. See the link for more
#' information. [tidy_cymru()] can be used to post-process these responses.
#'
#' @param query <chr> the text query to send to the destination whois `host`
#' @param host  <chr> the WHOIS host to query; This defaults to
#'        [The Prefix WhoIs Project](https://pwhois.org/) WHOIS server
#'        (a.k.a. "pwhois") as it allows for more robust queries to be performed.
#' @param port  <int> TCP port the `host` WHOIS server is running on;
#'        defaults to `43` (the standard WHOIS port)
#' @param timeout connection timeout; see [connections]
#' @return raw character response from the `host` WHOIS server. Use
#'         the built-in tidying functions to post-process the response.
#' @export
#' @examples
#' whois("registry org-name=apple, inc") # 'registry' is only supported on pwhois
#' whois('type=cymru 17.253.144.10') # 'type=cymru' is only supported on pwhois
#' whois('type=rpsl 17.253.144.10') # 'type=rpsl' is only supported on pwhois
#' whois('-v AS23028', "whois.cymru.com") # this only works with the Team Cymru WHOIS service
#' whois("17.253.144.10")
whois <- function(query, host = "whois.pwhois.org", port = 43L,
                  timeout = getOption("timeout")) {

  query <- as.character(query[1])
  host <- as.character(host[1])
  port <- as.integer(port[1])

  if (!endsWith(query, "\n")) query <- sprintf("%s\n", query)

  open_socket(
    host = host,
    port = port,
    blocking = TRUE,
    open = "r+",
    timeout = timeout
  ) -> con

  on.exit(close_socket(con))

  if (!inherits(con, "sockconn")) {
    warning(sprintf("Error opening connection to %s:%s", query, port))
    return(NA_character_)
  }

  cat(query, file = con)

  res <- readLines(con)

  res

}
hrbrmstr/pwhois documentation built on April 26, 2021, 5:45 a.m.