

{"id":4357,"date":"2016-05-01T20:31:46","date_gmt":"2016-05-02T01:31:46","guid":{"rendered":"http:\/\/rud.is\/b\/?p=4357"},"modified":"2018-03-07T16:42:22","modified_gmt":"2018-03-07T21:42:22","slug":"pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/","title":{"rendered":"Pining for the fjoRds &#038; monitoring SSL\/TLS certificate expiration in R with flexdashboard"},"content":{"rendered":"<p>Rumors of my demise have been (almost) greatly exaggerated.<\/p>\n<p>Folks have probably noticed that <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https:\/\/rud.is\/b\/tag\/52vis\/\">#52Vis<\/a> has stalled, as has most blogging, package &#038; Twitter activity. I came down with a nasty bout of bronchitis after attending rOpenSci Unconf 16 (there were _so_ many people hacking [the sick kind] up a storm in SFO!) and then managed to get pneumonia (which I&#8217;m still working through) so any and all awake time has gone to work, class and fam. However, <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https:\/\/rud.is\/b\/tag\/52vis\/\">#52Vis<\/a> winds back up this week, a new R endeavor will be revealed and hopefully I&#8217;ll be done with getting ill until Fall.<\/p>\n<p>Getting ill does have some advantages. I completely forgot about renewing SSL\/TLS certificates on some (official &#8211; yikes!) sites I help manage and decided to have that not be &#8220;a thing&#8221; moving forward with some help from R. Specifically, I decided to use the `openssl` and `flexdashboard` packages to accomplish my monitoring goals. I&#8217;m probably not the only one who needs to care about SSL\/TLS certificate renewals so my illness-born-invention is presented below for anyone else to use or mod.<\/p>\n<p>### Flexing flexdashboard muscles<\/p>\n<p>If you haven&#8217;t heard about [`flexdashboard`](http:\/\/rstudio.github.io\/flexdashboard\/) then you should visit that link before continuing. It&#8217;s an emerging package from the fine folks over at RStudio that makes it super-easy to create quick and pretty dashboards. You can look [at the examples](http:\/\/rstudio.github.io\/flexdashboard\/examples.html) if you want proof. Here&#8217;s how `flexdashboard` fit into my goals. I wanted a way to:<\/p>\n<p>&#8211; provide a character vector of hosts and ports (you can run SSL\/TLS on any port and for many types of services)<br \/>\n&#8211; retrieve the certificates at those endpoints<br \/>\n&#8211; compare the expiration date to the current date<br \/>\n&#8211; provided a dashboard-like view of the state of those certificates, ordered from soonest-expiring to longest-expiring and color-coded (to make it easier to see the certs of impending DOOM)<\/p>\n<p>I immediately thought of `flexdashboard` but my hopes were quickly dashed when all attempts to provide a list of `valueBox()` elements (as I could with `htmlwidgets` in R markdown documents) failed to deliver the desired result of a scrolling, responsive set of boxes.<\/p>\n<p>My workaround was to have an R script create a `flexdashboard` R markdown document on the fly then call `rmarkdown::render()` to generate the final HTML page. Rather than bore you with a tiny view of the sites I work with, I decided to scrape the list of R CRAN mirrors that are SSL\/TLS-enabled and present them via this rube goldberg contraption as the show-and-tell example.<\/p>\n<p>The annotated code is below and in [this gist](https:\/\/gist.github.com\/hrbrmstr\/910af8ddc6371572aa4414b77ae86c6a).<\/p>\n<pre id=\"prism-r-code\"><code class=\"language-r\">library(rvest)\r\nlibrary(urltools)\r\nlibrary(rmarkdown)\r\n\r\n# Some Rmd template setup -----------------------------------------------------------\r\n\r\npreamble &lt;- &#039;---\r\ntitle: &quot;CRAN Mirrors Certificate Expiration Dashboard (Days left from %s)&quot;\r\noutput:\r\n  flexdashboard::flex_dashboard:\r\n    orientation: rows\r\n    vertical_layout: scroll\r\n---\r\n```{r setup, include=FALSE}\r\nlibrary(flexdashboard)\r\nlibrary(openssl)\r\nlibrary(purrr)\r\nlibrary(dplyr)\r\nlibrary(scales)\r\n&#039;\r\n\r\nafter_data &lt;- &#039;\r\n\r\ndsc &lt;- safely(download_ssl_cert);\r\n\r\nexpires_delta &lt;- function(site) {\r\n\r\n  site_info &lt;- strsplit(site, &quot;:&quot;)[[1]]\r\n  port &lt;- as.numeric(site_info[2])\r\n\r\n  chain_res &lt;- dsc(site_info[1], port)\r\n  if (!is.null(chain_res$result)) {\r\n\r\n    chain &lt;- chain_res$result\r\n\r\n    valid_from &lt;- as.Date(as.POSIXct(as.list(chain[[1]])$validity[1],\r\n                                     &quot;%b %d %H:%M:%S %Y&quot;, tz=&quot;GMT&quot;))\r\n    expires_on &lt;- as.Date(as.POSIXct(as.list(chain[[1]])$validity[2],\r\n                                     &quot;%b %d %H:%M:%S %Y&quot;, tz=&quot;GMT&quot;))\r\n\r\n    data_frame(site=site_info[1],\r\n               valid_from=valid_from,\r\n               expires_on=expires_on,\r\n               cert_valid_length=expires_on-valid_from,\r\n               days_left_from_valid=expires_on - valid_from,\r\n               days_left_from_today=expires_on - Sys.Date(),\r\n               days_left_from_today_lab=comma(expires_on - Sys.Date()),\r\n               color=&quot;primary&quot;,\r\n               color=ifelse(days_left_from_today&lt;=15, &quot;danger&quot;, color),\r\n               color=ifelse(days_left_from_today&gt;15 &amp; days_left_from_today&lt;60, &quot;warning&quot;, color))\r\n\r\n  } else {\r\n\r\n    data_frame(site=site_info[1],\r\n               valid_from=NA,\r\n               expires_on=NA,\r\n               cert_valid_length=NA,\r\n               days_left_from_valid=NA,\r\n               days_left_from_today=NA,\r\n               days_left_from_today_lab=&quot;Host unreachable&quot;,\r\n               color=&quot;info&quot;)\r\n\r\n  }\r\n\r\n}\r\n\r\nssl_df &lt;- arrange(map_df(sites, expires_delta), days_left_from_today)\r\n```\r\n\r\n&#039;\r\n\r\n# Get a list of all https-enabled CRAN mirrors --------------------------------------\r\n\r\npg &lt;- read_html(&quot;https:\/\/cran.r-project.org\/mirrors.html&quot;)\r\nsites &lt;- sprintf(&quot;%s:443&quot;, domain(html_attr(html_nodes(pg, &quot;td &gt; a[href^=&#039;https:&#039;]&quot;), &quot;href&quot;)))\r\n\r\n# Capture this vector for use in the R markdown template ----------------------------\r\n\r\nsetup_data &lt;- capture.output(dput(sites))\r\n\r\n# Create a temporary Rmd file -------------------------------------------------------\r\n\r\ndashfile &lt;- tempfile(fileext=&quot;.Rmd&quot;)\r\n\r\n# Write out the initial template bits we&#039;ve been making -----------------------------\r\n\r\ncat(sprintf(preamble, Sys.Date()), &quot;sites &lt;- &quot;, setup_data, after_data, file=dashfile)\r\n\r\n# 5 valueBoxes per row seems like a good # ----------------------------------------\r\n\r\nmax_vbox_per_row &lt;- 5\r\n\r\nn_dashrows &lt;- ceiling(length(sites)\/max_vbox_per_row)\r\n\r\n# Generate a valueBox() per site, making rows every max_vbox_per_row ----------------\r\n\r\nfor (i in 1:length(sites)) {\r\n\r\n  if (((i-1) %% max_vbox_per_row) == 0) {\r\n    cat(&#039;\r\nRow\r\n-------------------------------------\r\n\r\n&#039;, file=dashfile, append=TRUE)\r\n  }\r\n\r\n  cat(sprintf(&quot;\\n### %s\\n```{r}\\n&quot;, gsub(&quot;:.*$&quot;, &quot;&quot;, sites[i])), file=dashfile, append=TRUE)\r\n  cat(sprintf(&#039;valueBox(ssl_df[%d, &quot;days_left_from_today_lab&quot;], icon=&quot;fa-lock&quot;, color=ssl_df[%d, &quot;color&quot;])\\n```\\n&#039;, i, i),\r\n      file=dashfile, append=TRUE)\r\n}\r\n\r\n# Temporary html file (you prbly want this more readily available -------------------\r\n\r\ndir &lt;- tempfile()\r\ndir.create(dir)\r\ndash_html &lt;- file.path(dir, &quot;sslexpires.html&quot;)\r\n\r\n# Render the dashboard --------------------------------------------------------------\r\n\r\nrmarkdown::render(dashfile, output_file=dash_html)\r\n\r\n# View in RStudio -------------------------------------------------------------------\r\n\r\nrstudioapi::viewer(dash_html)\r\n\r\n# Clean up --------------------------------------------------------------------------\r\n\r\nunlink(dashfile)<\/code><\/pre>\n<p>You can see the output below and can use [this link](\/projects\/sslexpires.html) to bust the iframe.<\/p>\n<p><iframe seamless=\"seamless\" scrolling=\"yes\" style=\"width:100%; height:600px; max-height:100%\" src=\"\/projects\/sslexpires.html\"><\/iframe><\/p>\n<p>You can use different values for the color thresholds or use a different visual display altogether. The `flexdashboard` package works with virtually any widget or static R visualization. You should also look at the frame-busted version and shrink the browser window (or view it on a mobile phone) to see the responsive nature of the framework. <\/p>\n<p>I&#8217;m pretty sure the CRAN R mirror that is displaying an error is due to my accessing it via the resolved IPv6 address (I run IPV6 at home and have an IPv6 internet connection) vs the IPv4 address it&#8217;s probably actually listening on.<\/p>\n<p>Keep an eye out for <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https:\/\/rud.is\/b\/tag\/52vis\/\">#52vis<\/a> news and the new R project I hinted at in the intro. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Rumors of my demise have been (almost) greatly exaggerated. Folks have probably noticed that #52Vis has stalled, as has most blogging, package &#038; Twitter activity. I came down with a nasty bout of bronchitis after attending rOpenSci Unconf 16 (there were _so_ many people hacking [the sick kind] up a storm in SFO!) and then [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4366,"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":[774,91],"tags":[810],"class_list":["post-4357","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dashboard","category-r","tag-post"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Pining for the fjoRds &amp; monitoring SSL\/TLS certificate expiration in R with flexdashboard - 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\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pining for the fjoRds &amp; monitoring SSL\/TLS certificate expiration in R with flexdashboard - rud.is\" \/>\n<meta property=\"og:description\" content=\"Rumors of my demise have been (almost) greatly exaggerated. Folks have probably noticed that #52Vis has stalled, as has most blogging, package &#038; Twitter activity. I came down with a nasty bout of bronchitis after attending rOpenSci Unconf 16 (there were _so_ many people hacking [the sick kind] up a storm in SFO!) and then [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-02T01:31:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-03-07T21:42:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/05\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1233\" \/>\n\t<meta property=\"og:image:height\" content=\"626\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Pining for the fjoRds &#038; monitoring SSL\\\/TLS certificate expiration in R with flexdashboard\",\"datePublished\":\"2016-05-02T01:31:46+00:00\",\"dateModified\":\"2018-03-07T21:42:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/\"},\"wordCount\":613,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2016\\\/05\\\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1\",\"keywords\":[\"post\"],\"articleSection\":[\"dashboard\",\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/\",\"name\":\"Pining for the fjoRds & monitoring SSL\\\/TLS certificate expiration in R with flexdashboard - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2016\\\/05\\\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1\",\"datePublished\":\"2016-05-02T01:31:46+00:00\",\"dateModified\":\"2018-03-07T21:42:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2016\\\/05\\\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2016\\\/05\\\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1\",\"width\":1233,\"height\":626},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/05\\\/01\\\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pining for the fjoRds &#038; monitoring SSL\\\/TLS certificate expiration in R with flexdashboard\"}]},{\"@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":"Pining for the fjoRds & monitoring SSL\/TLS certificate expiration in R with flexdashboard - 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\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/","og_locale":"en_US","og_type":"article","og_title":"Pining for the fjoRds & monitoring SSL\/TLS certificate expiration in R with flexdashboard - rud.is","og_description":"Rumors of my demise have been (almost) greatly exaggerated. Folks have probably noticed that #52Vis has stalled, as has most blogging, package &#038; Twitter activity. I came down with a nasty bout of bronchitis after attending rOpenSci Unconf 16 (there were _so_ many people hacking [the sick kind] up a storm in SFO!) and then [&hellip;]","og_url":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/","og_site_name":"rud.is","article_published_time":"2016-05-02T01:31:46+00:00","article_modified_time":"2018-03-07T21:42:22+00:00","og_image":[{"width":1233,"height":626,"url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/05\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1","type":"image\/png"}],"author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Pining for the fjoRds &#038; monitoring SSL\/TLS certificate expiration in R with flexdashboard","datePublished":"2016-05-02T01:31:46+00:00","dateModified":"2018-03-07T21:42:22+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/"},"wordCount":613,"commentCount":2,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"image":{"@id":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/05\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1","keywords":["post"],"articleSection":["dashboard","R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/","url":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/","name":"Pining for the fjoRds & monitoring SSL\/TLS certificate expiration in R with flexdashboard - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/#primaryimage"},"image":{"@id":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/05\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1","datePublished":"2016-05-02T01:31:46+00:00","dateModified":"2018-03-07T21:42:22+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/#primaryimage","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/05\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/05\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1","width":1233,"height":626},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2016\/05\/01\/pining-for-the-fjords-monitoring-ssltls-certificate-expiration-in-r-with-flexdashboard\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Pining for the fjoRds &#038; monitoring SSL\/TLS certificate expiration in R with flexdashboard"}]},{"@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":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/05\/Fullscreen_5_1_16__9_28_PM.png?fit=1233%2C626&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p23idr-18h","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":4335,"url":"https:\/\/rud.is\/b\/2016\/04\/13\/52vis-week-3-waste-not-want-not\/","url_meta":{"origin":4357,"position":0},"title":"52Vis Week #3 &#8211; Waste Not, Want Not","author":"hrbrmstr","date":"2016-04-13","format":false,"excerpt":"The Wall Street Journal did a project piece [a while back](http:\/\/projects.wsj.com\/waste-lands\/) in the _\"Waste Lands: America's Forgotten Nuclear Legacy\"_. They dug through [Department of Energy](http:\/\/www.lm.doe.gov\/default.aspx?id=2602) and [CDC](http:\/\/www.cdc.gov\/niosh\/ocas\/ocasawe.html) data to provide an overview of the lingering residue of this toxic time in America's past (somehow, I have to believe the fracking\u2026","rel":"","context":"In &quot;52vis&quot;","block_context":{"text":"52vis","link":"https:\/\/rud.is\/b\/category\/52vis\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/waste.png?fit=1200%2C983&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/waste.png?fit=1200%2C983&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/waste.png?fit=1200%2C983&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/waste.png?fit=1200%2C983&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/waste.png?fit=1200%2C983&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":4242,"url":"https:\/\/rud.is\/b\/2016\/04\/06\/52vis-week-2-2016-week-14-honing-in-on-the-homeless\/","url_meta":{"origin":4357,"position":1},"title":"52Vis Week 2 (2016 Week #14) &#8211; Honing in on the Homeless","author":"hrbrmstr","date":"2016-04-06","format":false,"excerpt":">UPDATE: Since I put in a \"pull request\" requirement, I intended to put in a link to getting started with GitHub. Dr. Jenny Bryan's @stat545 has a great [section on git](https:\/\/stat545-ubc.github.io\/git00_index.html) that should hopefully make it a bit less painful. ### Why 52Vis? In case folks are wondering why I'm\u2026","rel":"","context":"In &quot;Charts &amp; Graphs&quot;","block_context":{"text":"Charts &amp; Graphs","link":"https:\/\/rud.is\/b\/category\/charts-graphs\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/percapita.png?fit=800%2C1200&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/percapita.png?fit=800%2C1200&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/percapita.png?fit=800%2C1200&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/percapita.png?fit=800%2C1200&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":4308,"url":"https:\/\/rud.is\/b\/2016\/04\/13\/52-vis-week-2-wrap-up\/","url_meta":{"origin":4357,"position":2},"title":"52 Vis Week #2 Wrap Up","author":"hrbrmstr","date":"2016-04-13","format":false,"excerpt":"I've been staring at this homeless data set for a few weeks now since I'm using it both here and in the data science class I'm teaching. It's been one of the most mindful data sets I've worked with in a while. Even when reduced to pure numbers in named\u2026","rel":"","context":"In &quot;52vis&quot;","block_context":{"text":"52vis","link":"https:\/\/rud.is\/b\/category\/52vis\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"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":4357,"position":3},"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":11659,"url":"https:\/\/rud.is\/b\/2018\/11\/17\/tis-the-season-to-check-your-ssl-tls-cipher-list-thrice-rcurl-curl-openssl\/","url_meta":{"origin":4357,"position":4},"title":"Tis the Season to Check your SSL\/TLS Cipher List Thrice (RCurl\/curl\/openssl)","author":"hrbrmstr","date":"2018-11-17","format":false,"excerpt":"The libcurl library (the foundational library behind the RCurl and curl packages) has switched to using OpenSSL's default ciphers since version 7.56.0 (October 4 2017). If you're a regular updater of curl\/httr you should be fairly current with these cipher suites, but if you're not a keen updater or use\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":4292,"url":"https:\/\/rud.is\/b\/2016\/04\/13\/52-vis-week-1-winners\/","url_meta":{"origin":4357,"position":5},"title":"52 Vis Week 1 Winners!","author":"hrbrmstr","date":"2016-04-13","format":false,"excerpt":"The response to 52Vis has exceeded expectations and there have been great entries for both weeks. It's time to award some prizes! ### Week 1 - Send in the Drones I'll take [this week](https:\/\/github.com\/52vis\/2016-13) in comment submission order (remember, the rules changed to submission via PR in Week 2). NOTE:\u2026","rel":"","context":"In &quot;52vis&quot;","block_context":{"text":"52vis","link":"https:\/\/rud.is\/b\/category\/52vis\/"},"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\/4357","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=4357"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/4357\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media\/4366"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=4357"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=4357"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=4357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}