

{"id":12383,"date":"2019-06-28T07:29:57","date_gmt":"2019-06-28T12:29:57","guid":{"rendered":"https:\/\/rud.is\/b\/?p=12383"},"modified":"2019-06-28T07:30:45","modified_gmt":"2019-06-28T12:30:45","slug":"quick-hit-dig-ging-into-dns-records-with-processx","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/","title":{"rendered":"Quick hit: &#8216;dig&#8217;-ging Into r-project.org DNS Records with {processx}"},"content":{"rendered":"<p>The <code>r-project.org<\/code> domain had some temporary technical difficulties this week (2019-29) that made reaching R-related resources problematic for a bunch of folks for a period of time. Incidents like this underscore the need for regional and network diversity when it comes to ensuring the availability of DNS services. That is, it does no good if you have two DNS servers if they&#8217;re both connected to the same power source and\/or network connection since if power goes out or the network gets wonky no client will be able to translate <code>r-project.org<\/code> to an IP address that it can then connect to.<\/p>\n<p>I&#8217;m not at-keyboard much this week so only had time to take an external poke at the (new) <code>r-project.org<\/code> DNS configuration late yesterday and today before the sleepyhead vacationers emerged from slumber. To my surprise, the <code>r-project.org<\/code> current DNS setup allows full <a href=\"https:\/\/en.wikipedia.org\/wiki\/DNS_zone_transfer\">zone transfers<\/a>, which means you can get the full &#8220;database&#8221; of <code>r-project.org<\/code> DNS records if you know the right incantations.<\/p>\n<p>So, I wrote a small R function wrapper for the <a href=\"https:\/\/ftp.isc.org\/isc\/bind9\/cur\/9.15\/doc\/arm\/man.dig.html\"><code>dig<\/code> command<\/a> using {processx}. Folks on the legacy Windows operating system are on your own for getting a copy of <code>dig<\/code> installed but users of proper, modern operating systems like Linux or macOS should have it installed by-default (or will be an easy package manager grab away).<\/p>\n<h3>Wrapping dig<\/h3>\n<p>The R-wrapper for the <code>dig<\/code> command is pretty straightforward:<\/p>\n<pre><code class=\"language-r\">library(stringi) # string processing\nlibrary(processx) # system processes orchestration\nlibrary(tidyverse) # good data wrangling idioms\n\ndig &lt;- function(..., cat = TRUE) {\n\n  processx::run(\n    command = unname(Sys.which(\"dig\")), \n    args = unlist(list(...)),\n  ) -&gt; out\n\n  if (cat) message(out$stdout)\n\n  invisible(out)\n\n}\n<\/code><\/pre>\n<p>We expand the ellipses into command arguments, run the command, return the output and optionally display the output via <code>message()<\/code>.<\/p>\n<p>Let&#8217;s see if it works by getting the <code>dig<\/code> help:<\/p>\n<pre><code class=\"language-r\">dig(\"-h\")\n## Usage:  dig [@global-server] [domain] [q-type] [q-class] {q-opt}\n##             {global-d-opt} host [@local-server] {local-d-opt}\n##             [ host [@local-server] {local-d-opt} [...]]\n## Where:  domain    is in the Domain Name System\n##         q-class  is one of (in,hs,ch,...) [default: in]\n##         q-type   is one of (a,any,mx,ns,soa,hinfo,axfr,txt,...) [default:a]\n##                  (Use ixfr=version for type ixfr)\n##         q-opt    is one of:\n##                  -4                  (use IPv4 query transport only)\n##                  -6                  (use IPv6 query transport only)\n##                  -b address[#port]   (bind to source address\/port)\n##                  -c class            (specify query class)\n##                  -f filename         (batch mode)\n##                  -i                  (use IP6.INT for IPv6 reverse lookups)\n##                  -k keyfile          (specify tsig key file)\n##                  -m                  (enable memory usage debugging)\n##                  -p port             (specify port number)\n##                  -q name             (specify query name)\n##                  -t type             (specify query type)\n##                  -u                  (display times in usec instead of msec)\n##                  -x dot-notation     (shortcut for reverse lookups)\n##                  -y [hmac:]name:key  (specify named base64 tsig key)\n##         d-opt    is of the form +keyword[=value], where keyword is:\n##                  +[no]aaonly         (Set AA flag in query (+[no]aaflag))\n##                  +[no]additional     (Control display of additional section)\n##                  +[no]adflag         (Set AD flag in query (default on))\n##                  +[no]all            (Set or clear all display flags)\n##                  +[no]answer         (Control display of answer section)\n##                  +[no]authority      (Control display of authority section)\n##                  +[no]besteffort     (Try to parse even illegal messages)\n##                  +bufsize=###        (Set EDNS0 Max UDP packet size)\n##                  +[no]cdflag         (Set checking disabled flag in query)\n##                  +[no]cl             (Control display of class in records)\n##                  +[no]cmd            (Control display of command line)\n##                  +[no]comments       (Control display of comment lines)\n##                  +[no]crypto         (Control display of cryptographic fields in records)\n##                  +[no]defname        (Use search list (+[no]search))\n##                  +[no]dnssec         (Request DNSSEC records)\n##                  +domain=###         (Set default domainname)\n##                  +[no]edns[=###]     (Set EDNS version) [0]\n##                  +ednsflags=###      (Set EDNS flag bits)\n##                  +[no]ednsnegotiation (Set EDNS version negotiation)\n##                  +ednsopt=###[:value] (Send specified EDNS option)\n##                  +noednsopt          (Clear list of +ednsopt options)\n##                  +[no]expire         (Request time to expire)\n##                  +[no]fail           (Don't try next server on SERVFAIL)\n##                  +[no]identify       (ID responders in short answers)\n##                  +[no]idnout         (convert IDN response)\n##                  +[no]ignore         (Don't revert to TCP for TC responses.)\n##                  +[no]keepopen       (Keep the TCP socket open between queries)\n##                  +[no]multiline      (Print records in an expanded format)\n##                  +ndots=###          (Set search NDOTS value)\n##                  +[no]nsid           (Request Name Server ID)\n##                  +[no]nssearch       (Search all authoritative nameservers)\n##                  +[no]onesoa         (AXFR prints only one soa record)\n##                  +[no]opcode=###     (Set the opcode of the request)\n##                  +[no]qr             (Print question before sending)\n##                  +[no]question       (Control display of question section)\n##                  +[no]recurse        (Recursive mode)\n##                  +retry=###          (Set number of UDP retries) [2]\n##                  +[no]rrcomments     (Control display of per-record comments)\n##                  +[no]search         (Set whether to use searchlist)\n##                  +[no]short          (Display nothing except short\n##                                       form of answer)\n##                  +[no]showsearch     (Search with intermediate results)\n##                  +[no]split=##       (Split hex\/base64 fields into chunks)\n##                  +[no]stats          (Control display of statistics)\n##                  +subnet=addr        (Set edns-client-subnet option)\n##                  +[no]tcp            (TCP mode (+[no]vc))\n##                  +time=###           (Set query timeout) [5]\n##                  +[no]trace          (Trace delegation down from root [+dnssec])\n##                  +tries=###          (Set number of UDP attempts) [3]\n##                  +[no]ttlid          (Control display of ttls in records)\n##                  +[no]vc             (TCP mode (+[no]tcp))\n##         global d-opts and servers (before host name) affect all queries.\n##         local d-opts and servers (after host name) affect only that lookup.\n##         -h                           (print help and exit)\n##         -v                           (print version and exit)\n<\/code><\/pre>\n<p>To get the DNS records of <code>r-project.org<\/code> DNS we need to find the nameservers, which we can do via:<\/p>\n<pre><code class=\"language-r\">ns &lt;- dig(\"+short\", \"NS\", \"@9.9.9.9\", \"r-project.org\")\n## ns1.wu-wien.ac.at.\n## ns2.urbanek.info.\n## ns1.urbanek.info.\n## ns3.urbanek.info.\n## ns4.urbanek.info.\n## ns2.wu-wien.ac.at.\n<\/code><\/pre>\n<p>There are six of them (which IIRC is a few more than they had earlier this week). I wanted to see if any supported zone transfers. Here&#8217;s one way to do that:<\/p>\n<pre><code class=\"language-r\">stri_split_lines(ns$stdout, omit_empty = TRUE) %&gt;% # split the response in stdout into lines\n  flatten_chr() %&gt;% # turn the list into a character vector\n  map_df(~{ # make a data frame out of the following\n    tibble(\n      ns = .x, # the nameserver we are probing\n      res = dig(\"+noall\", \"+answer\", \"AXFR\", glue::glue(\"@{.x}\"), \"r-project.org\", cat = FALSE) %&gt;%  # the dig zone transfer request\n        pluck(\"stdout\") # we only want the `stdout` element of the {processx} return value\n    )\n  }) -&gt; xdf\n\nxdf\n## # A tibble: 6 x 2\n##   ns              res                                                  \n##   &lt;chr&gt;           &lt;chr&gt;                                                \n## 1 ns1.wu-wien.ac\u2026 \"; Transfer failed.\\n\"                               \n## 2 ns2.urbanek.in\u2026 \"R-project.org.\\t\\t7200\\tIN\\tSOA\\tns0.wu-wien.ac.at.\u2026\n## 3 ns1.urbanek.in\u2026 \"R-project.org.\\t\\t7200\\tIN\\tSOA\\tns0.wu-wien.ac.at.\u2026\n## 4 ns3.urbanek.in\u2026 \"R-project.org.\\t\\t7200\\tIN\\tSOA\\tns0.wu-wien.ac.at.\u2026\n## 5 ns4.urbanek.in\u2026 \"R-project.org.\\t\\t7200\\tIN\\tSOA\\tns0.wu-wien.ac.at.\u2026\n## 6 ns2.wu-wien.ac\u2026 \"; Transfer failed.\\n\" \n<\/code><\/pre>\n<p>(NOTE: You may not get things in the same order if you try this at home due to the way DNS queries and responses work.)<\/p>\n<p>So, two servers did not accept our request but four did. Let&#8217;s see what a set of zone transfer records looks like:<\/p>\n<pre><code class=\"language-r\">cat(xdf[[\"res\"]][[2]]) \n## R-project.org.    7200  IN  SOA ns0.wu-wien.ac.at. postmaster.wu-wien.ac.at. 2019040400 3600 1800 604800 3600\n## R-project.org.    7200  IN  NS  ns1.urbanek.info.\n## R-project.org.    7200  IN  NS  ns1.wu-wien.ac.at.\n## R-project.org.    7200  IN  NS  ns2.urbanek.info.\n## R-project.org.    7200  IN  NS  ns2.wu-wien.ac.at.\n## R-project.org.    7200  IN  NS  ns3.urbanek.info.\n## R-project.org.    7200  IN  NS  ns4.urbanek.info.\n## R-project.org.    7200  IN  A 137.208.57.37\n## R-project.org.    7200  IN  MX  5 mc1.ethz.ch.\n## R-project.org.    7200  IN  MX  5 mc2.ethz.ch.\n## R-project.org.    7200  IN  MX  5 mc3.ethz.ch.\n## R-project.org.    7200  IN  MX  5 mc4.ethz.ch.\n## R-project.org.    7200  IN  TXT \"v=spf1 ip4:129.132.119.208\/32 ~all\"\n## cran.at.R-project.org.  7200  IN  CNAME cran.wu-wien.ac.at.\n## beta.R-project.org. 7200  IN  A 137.208.57.37\n## bugs.R-project.org. 7200  IN  CNAME rbugs.urbanek.info.\n## cran.ch.R-project.org.  7200  IN  CNAME cran.wu-wien.ac.at.\n## cloud.R-project.org.  7200  IN  CNAME d3caqzu56oq2n9.cloudfront.net.\n## cran.R-project.org. 7200  IN  CNAME cran.wu-wien.ac.at.\n## ftp.cran.R-project.org. 7200  IN  CNAME cran.wu-wien.ac.at.\n## www.cran.R-project.org. 7200  IN  CNAME cran.wu-wien.ac.at.\n## cran-archive.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at.\n## developer.R-project.org. 7200 IN  CNAME rdevel.urbanek.info.\n## cran.es.R-project.org.  7200  IN  A 137.208.57.37\n## ess.R-project.org.  7200  IN  CNAME ess.math.ethz.ch.\n## journal.R-project.org.  7200  IN  CNAME cran.wu-wien.ac.at.\n## mac.R-project.org.  7200  IN  CNAME r.research.att.com.\n## portal.R-project.org. 7200  IN  CNAME r-project.org.\n## r-forge.R-project.org.  7200  IN  CNAME r-forge.wu-wien.ac.at.\n## *.r-forge.R-project.org. 7200 IN  CNAME r-forge.wu-wien.ac.at.\n## search.R-project.org. 7200  IN  CNAME finzi.psych.upenn.edu.\n## svn.R-project.org.  7200  IN  CNAME svn-stat.math.ethz.ch.\n## translation.R-project.org. 7200 IN  CNAME translation.r-project.kr.\n## cran.uk.R-project.org.  7200  IN  CNAME cran.wu-wien.ac.at.\n## cran.us.R-project.org.  7200  IN  A 137.208.57.37\n## user2004.R-project.org. 7200  IN  CNAME r-project.org.\n## useR2006.R-project.org. 7200  IN  CNAME r-project.org.\n## user2007.R-project.org. 7200  IN  CNAME r-project.org.\n## useR2008.R-project.org. 7200  IN  CNAME r-project.org.\n## useR2009.R-project.org. 7200  IN  CNAME r-project.org.\n## user2010.R-project.org. 7200  IN  CNAME r-project.org.\n## useR2011.R-project.org. 7200  IN  CNAME r-project.org.\n## useR2012.R-project.org. 7200  IN  CNAME r-project.org.\n## useR2013.R-project.org. 7200  IN  CNAME r-project.org.\n## user2014.R-project.org. 7200  IN  CNAME user2014.github.io.\n## useR2015.R-project.org. 7200  IN  CNAME r-project.org.\n## useR2016.R-project.org. 7200  IN  CNAME user2016.github.io.\n## useR2017.R-project.org. 7200  IN  CNAME r-project.org.\n## useR2018.R-project.org. 7200  IN  CNAME user-2018.netlify.com.\n## useR2019.R-project.org. 7200  IN  A 5.135.185.16\n## wiki.R-project.org. 7200  IN  CNAME cran.wu-wien.ac.at.\n## win-builder.R-project.org. 7200 IN  A 129.217.207.166\n## win-builder.R-project.org. 7200 IN  MX  0 rdevel.urbanek.info.\n## www.R-project.org.  7200  IN  CNAME cran.wu-wien.ac.at.\n## R-project.org.    7200  IN  SOA ns0.wu-wien.ac.at. postmaster.wu-wien.ac.at. 2019040400 3600 1800 604800 3600\n<\/code><\/pre>\n<p>That&#8217;s not pretty, but it&#8217;s wrangle-able. Let&#8217;s turn it into a data frame:<\/p>\n<pre><code class=\"language-r\">xdf[[\"res\"]][[2]] %&gt;% # get the response text\n  stri_split_lines(omit_empty = TRUE) %&gt;%  # split it into lines\n  flatten_chr() %&gt;%  # turn it into a character vector\n  stri_split_regex(\"[[:space:]]+\", n = 5, simplify = TRUE) %&gt;% # split at whitespace, limiting to five fields\n  as_tibble(.name_repair = \"unique\") %&gt;% # make it a tibble\n  set_names(c(\"host\", \"ttl\", \"class\", \"record_type\", \"value\")) %&gt;% # better colnames\n  mutate(host = stri_trans_tolower(host)) %&gt;% # case matters not in DNS names\n  print(n=nrow(.)) # see our results\n## # A tibble: 55 x 5\n##    host                     ttl   class record_type value                                                              \n##    &lt;chr&gt;                    &lt;chr&gt; &lt;chr&gt; &lt;chr&gt;       &lt;chr&gt;                                                              \n##  1 r-project.org.           7200  IN    SOA         ns0.wu-wien.ac.at. postmaster.wu-wien.ac.at. 2019040400 3600 1800 \u2026\n##  2 r-project.org.           7200  IN    NS          ns1.urbanek.info.                                                  \n##  3 r-project.org.           7200  IN    NS          ns1.wu-wien.ac.at.                                                 \n##  4 r-project.org.           7200  IN    NS          ns2.urbanek.info.                                                  \n##  5 r-project.org.           7200  IN    NS          ns2.wu-wien.ac.at.                                                 \n##  6 r-project.org.           7200  IN    NS          ns3.urbanek.info.                                                  \n##  7 r-project.org.           7200  IN    NS          ns4.urbanek.info.                                                  \n##  8 r-project.org.           7200  IN    A           137.208.57.37                                                      \n##  9 r-project.org.           7200  IN    MX          5 mc1.ethz.ch.                                                     \n## 10 r-project.org.           7200  IN    MX          5 mc2.ethz.ch.                                                     \n## 11 r-project.org.           7200  IN    MX          5 mc3.ethz.ch.                                                     \n## 12 r-project.org.           7200  IN    MX          5 mc4.ethz.ch.                                                     \n## 13 r-project.org.           7200  IN    TXT         \"\\\"v=spf1 ip4:129.132.119.208\/32 ~all\\\"\"                           \n## 14 cran.at.r-project.org.   7200  IN    CNAME       cran.wu-wien.ac.at.                                                \n## 15 beta.r-project.org.      7200  IN    A           137.208.57.37                                                      \n## 16 bugs.r-project.org.      7200  IN    CNAME       rbugs.urbanek.info.                                                \n## 17 cran.ch.r-project.org.   7200  IN    CNAME       cran.wu-wien.ac.at.                                                \n## 18 cloud.r-project.org.     7200  IN    CNAME       d3caqzu56oq2n9.cloudfront.net.                                     \n## 19 cran.r-project.org.      7200  IN    CNAME       cran.wu-wien.ac.at.                                                \n## 20 ftp.cran.r-project.org.  7200  IN    CNAME       cran.wu-wien.ac.at.                                                \n## 21 www.cran.r-project.org.  7200  IN    CNAME       cran.wu-wien.ac.at.                                                \n## 22 cran-archive.r-project.\u2026 7200  IN    CNAME       cran.wu-wien.ac.at.                                                \n## 23 developer.r-project.org. 7200  IN    CNAME       rdevel.urbanek.info.                                               \n## 24 cran.es.r-project.org.   7200  IN    A           137.208.57.37                                                      \n## 25 ess.r-project.org.       7200  IN    CNAME       ess.math.ethz.ch.                                                  \n## 26 journal.r-project.org.   7200  IN    CNAME       cran.wu-wien.ac.at.                                                \n## 27 mac.r-project.org.       7200  IN    CNAME       r.research.att.com.                                                \n## 28 portal.r-project.org.    7200  IN    CNAME       r-project.org.                                                     \n## 29 r-forge.r-project.org.   7200  IN    CNAME       r-forge.wu-wien.ac.at.                                             \n## 30 *.r-forge.r-project.org. 7200  IN    CNAME       r-forge.wu-wien.ac.at.                                             \n## 31 search.r-project.org.    7200  IN    CNAME       finzi.psych.upenn.edu.                                             \n## 32 svn.r-project.org.       7200  IN    CNAME       svn-stat.math.ethz.ch.                                             \n## 33 translation.r-project.o\u2026 7200  IN    CNAME       translation.r-project.kr.                                          \n## 34 cran.uk.r-project.org.   7200  IN    CNAME       cran.wu-wien.ac.at.                                                \n## 35 cran.us.r-project.org.   7200  IN    A           137.208.57.37                                                      \n## 36 user2004.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 37 user2006.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 38 user2007.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 39 user2008.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 40 user2009.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 41 user2010.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 42 user2011.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 43 user2012.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 44 user2013.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 45 user2014.r-project.org.  7200  IN    CNAME       user2014.github.io.                                                \n## 46 user2015.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 47 user2016.r-project.org.  7200  IN    CNAME       user2016.github.io.                                                \n## 48 user2017.r-project.org.  7200  IN    CNAME       r-project.org.                                                     \n## 49 user2018.r-project.org.  7200  IN    CNAME       user-2018.netlify.com.                                             \n## 50 user2019.r-project.org.  7200  IN    A           5.135.185.16                                                       \n## 51 wiki.r-project.org.      7200  IN    CNAME       cran.wu-wien.ac.at.                                                \n## 52 win-builder.r-project.o\u2026 7200  IN    A           129.217.207.166                                                    \n## 53 win-builder.r-project.o\u2026 7200  IN    MX          0 rdevel.urbanek.info.                                             \n## 54 www.r-project.org.       7200  IN    CNAME       cran.wu-wien.ac.at.                                                \n## 55 r-project.org.           7200  IN    SOA         ns0.wu-wien.ac.at. postmaster.wu-wien.ac.at. 2019040400 3600 1800\n<\/code><\/pre>\n<h3>FIN<\/h3>\n<p>Zone transfers are a quick way to get all the DNS information for a site. As such, it isn&#8217;t generally recommended to allow zone transfers from just anyone (though trying to keep anything secret in public DNS is a path generally fraught with peril given how easy it is to brute-force record lookups). However, if <code>r-project.org<\/code> zone transfers stay generally open, then you can use this method to keep a local copy of <code>r-project.org<\/code> host info and make local <code>\/etc\/hosts<\/code> (or the Windows equivalent) entries when issues like the one this past week arise.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The r-project.org domain had some temporary technical difficulties this week (2019-29) that made reaching R-related resources problematic for a bunch of folks for a period of time. Incidents like this underscore the need for regional and network diversity when it comes to ensuring the availability of DNS services. That is, it does no good if [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[91],"tags":[],"class_list":["post-12383","post","type-post","status-publish","format-standard","hentry","category-r"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Quick hit: &#039;dig&#039;-ging Into r-project.org DNS Records with {processx} - rud.is<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Quick hit: &#039;dig&#039;-ging Into r-project.org DNS Records with {processx} - rud.is\" \/>\n<meta property=\"og:description\" content=\"The r-project.org domain had some temporary technical difficulties this week (2019-29) that made reaching R-related resources problematic for a bunch of folks for a period of time. Incidents like this underscore the need for regional and network diversity when it comes to ensuring the availability of DNS services. That is, it does no good if [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-28T12:29:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-06-28T12:30:45+00:00\" \/>\n<meta name=\"author\" content=\"hrbrmstr\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"hrbrmstr\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/28\\\/quick-hit-dig-ging-into-dns-records-with-processx\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/28\\\/quick-hit-dig-ging-into-dns-records-with-processx\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Quick hit: &#8216;dig&#8217;-ging Into r-project.org DNS Records with {processx}\",\"datePublished\":\"2019-06-28T12:29:57+00:00\",\"dateModified\":\"2019-06-28T12:30:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/28\\\/quick-hit-dig-ging-into-dns-records-with-processx\\\/\"},\"wordCount\":473,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"articleSection\":[\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/28\\\/quick-hit-dig-ging-into-dns-records-with-processx\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/28\\\/quick-hit-dig-ging-into-dns-records-with-processx\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/28\\\/quick-hit-dig-ging-into-dns-records-with-processx\\\/\",\"name\":\"Quick hit: 'dig'-ging Into r-project.org DNS Records with {processx} - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"datePublished\":\"2019-06-28T12:29:57+00:00\",\"dateModified\":\"2019-06-28T12:30:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/28\\\/quick-hit-dig-ging-into-dns-records-with-processx\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/28\\\/quick-hit-dig-ging-into-dns-records-with-processx\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/28\\\/quick-hit-dig-ging-into-dns-records-with-processx\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Quick hit: &#8216;dig&#8217;-ging Into r-project.org DNS Records with {processx}\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/\",\"name\":\"rud.is\",\"description\":\"&quot;In God we trust. All others must bring data&quot;\",\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rud.is\\\/b\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\",\"name\":\"hrbrmstr\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"width\":460,\"height\":460,\"caption\":\"hrbrmstr\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\"},\"description\":\"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7\",\"sameAs\":[\"http:\\\/\\\/rud.is\"],\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/author\\\/hrbrmstr\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Quick hit: 'dig'-ging Into r-project.org DNS Records with {processx} - rud.is","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/","og_locale":"en_US","og_type":"article","og_title":"Quick hit: 'dig'-ging Into r-project.org DNS Records with {processx} - rud.is","og_description":"The r-project.org domain had some temporary technical difficulties this week (2019-29) that made reaching R-related resources problematic for a bunch of folks for a period of time. Incidents like this underscore the need for regional and network diversity when it comes to ensuring the availability of DNS services. That is, it does no good if [&hellip;]","og_url":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/","og_site_name":"rud.is","article_published_time":"2019-06-28T12:29:57+00:00","article_modified_time":"2019-06-28T12:30:45+00:00","author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Quick hit: &#8216;dig&#8217;-ging Into r-project.org DNS Records with {processx}","datePublished":"2019-06-28T12:29:57+00:00","dateModified":"2019-06-28T12:30:45+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/"},"wordCount":473,"commentCount":1,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"articleSection":["R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/","url":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/","name":"Quick hit: 'dig'-ging Into r-project.org DNS Records with {processx} - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"datePublished":"2019-06-28T12:29:57+00:00","dateModified":"2019-06-28T12:30:45+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Quick hit: &#8216;dig&#8217;-ging Into r-project.org DNS Records with {processx}"}]},{"@type":"WebSite","@id":"https:\/\/rud.is\/b\/#website","url":"https:\/\/rud.is\/b\/","name":"rud.is","description":"&quot;In God we trust. All others must bring data&quot;","publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rud.is\/b\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886","name":"hrbrmstr","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","width":460,"height":460,"caption":"hrbrmstr"},"logo":{"@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1"},"description":"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7","sameAs":["http:\/\/rud.is"],"url":"https:\/\/rud.is\/b\/author\/hrbrmstr\/"}]}},"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p23idr-3dJ","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":12636,"url":"https:\/\/rud.is\/b\/2020\/01\/29\/monitoring-website-ssl-tls-certificate-expiration-times-with-r-openssl-pushoverr-and-dt\/","url_meta":{"origin":12383,"position":0},"title":"Monitoring Website SSL\/TLS Certificate Expiration Times with R, {openssl}, {pushoverr}, and {DT}","author":"hrbrmstr","date":"2020-01-29","format":false,"excerpt":"macOS R users who tend to work on the bleeding edge likely noticed some downtime at <mac.r-project.org> this past weekend. Part of the issue was an SSL\/TLS certificate expiration situation. Moving forward, we can monitor this with R using the super spiffy {openssl} and {pushoverr} packages whilst also generating a\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11859,"url":"https:\/\/rud.is\/b\/2019\/02\/03\/r-package-update-urlscan\/","url_meta":{"origin":12383,"position":1},"title":"R Package Update: urlscan","author":"hrbrmstr","date":"2019-02-03","format":false,"excerpt":"The urlscan? package (an interface to the urlscan.io API) is now at version 0.2.0 and supports urlscan.io's authentication requirement when submitting a link for analysis. The service is handy if you want to learn about the details \u2014 all the gory technical details \u2014 for a website. For instance, say\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3460,"url":"https:\/\/rud.is\/b\/2015\/06\/15\/metricsgraphics-0-8-5-is-now-on-cran\/","url_meta":{"origin":12383,"position":2},"title":"metricsgraphics 0.8.5 is now on CRAN!","author":"hrbrmstr","date":"2015-06-15","format":false,"excerpt":"I'm super-pleased to announce that the Benevolent CRAN Overlords [accepted the metricsgraphics package](http:\/\/cran.r-project.org\/web\/packages\/metricsgraphics\/index.html) into CRAN over the weekend. Now, you no longer need to rely on github\/devtools to use [MetricsGraphics.js](http:\/\/metricsgraphicsjs.org\/) charts from your R scripts. If you're not familiar with `htmlwidgets`, take a look at [the official site for them](http:\/\/www.htmlwidgets.org\/).\u2026","rel":"","context":"In &quot;d3&quot;","block_context":{"text":"d3","link":"https:\/\/rud.is\/b\/category\/d3\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3880,"url":"https:\/\/rud.is\/b\/2016\/01\/08\/iptools-0-3-0-violet-packet-now-on-cran-with-windows-support\/","url_meta":{"origin":12383,"position":3},"title":"iptools 0.3.0 (&#8220;Violet Packet&#8221;) Now on CRAN with Windows Support!","author":"hrbrmstr","date":"2016-01-08","format":false,"excerpt":"`iptools` is a set of tools for working with IP addresses. Not just work, but work _fast_. It's backed by `Rcpp` and now uses the [AsioHeaders](http:\/\/dirk.eddelbuettel.com\/blog\/2016\/01\/07\/#asioheaders_1.11.0-1) package by Dirk Eddelbuettel, which means it no longer needs to _link_ against the monolithic Boost libraries and *works on Windows*! What can you\u2026","rel":"","context":"In &quot;Cybersecurity&quot;","block_context":{"text":"Cybersecurity","link":"https:\/\/rud.is\/b\/category\/cybersecurity\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":12945,"url":"https:\/\/rud.is\/b\/2021\/02\/07\/fully-native-m1-apple-silicon-r-setup\/","url_meta":{"origin":12383,"position":4},"title":"Fully Native M1\/Apple Silicon R Setup","author":"hrbrmstr","date":"2021-02-07","format":false,"excerpt":"Presented without much commentary since I stopped once {ggrepel} and {graphlayouts} failed (RStudio doesn't support it yet, either, which I knew). The following steps will get you a fully working and STUPID FAST fully native ARM64 M1\/Apple Silicon R setup with {tidyverse} and {rJava}. Just remember, that if you need\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":12586,"url":"https:\/\/rud.is\/b\/2020\/01\/01\/writing-frictionless-r-package-wrappers-introduction\/","url_meta":{"origin":12383,"position":5},"title":"Writing Frictionless R Package Wrappers \u2014 Introduction","author":"hrbrmstr","date":"2020-01-01","format":false,"excerpt":"The R language and RStudio IDE are a powerful combination for \"getting stuff done\", and one aspect of R itself that makes it especially useful is the ability to use it with other programming languages via a robust foreign language interface capability1. The term \"foreign language\" refers to another programming\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/12383","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/comments?post=12383"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/12383\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=12383"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=12383"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=12383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}