1 2# Result is underined if not Linux 3 4current_r_platform_data_linux <- function(raw, etc = "/etc") { 5 os <- tryCatch( 6 suppressWarnings(readLines(file.path(etc, "os-release"))), 7 error = function(e) NULL 8 ) 9 rh <- tryCatch( 10 suppressWarnings(readLines(file.path(etc, "redhat-release"))), 11 error = function(e) NULL 12 ) 13 14 cbind(raw, parse_linux_platform_info(os, rh)) 15} 16 17unknown_dist <- function() { 18 data.frame( 19 stringsAsFactors = FALSE, 20 distribution = "unknown" 21 ) 22} 23 24parse_linux_platform_info <- function(os_release = NULL, 25 redhat_release = NULL) { 26 if (is.null(os_release) && 27 is.null(redhat_release)) { 28 unknown_dist() 29 30 } else if (!is.null(os_release)) { 31 parse_os_release(os_release) 32 33 } else { 34 parse_redhat_release(redhat_release) 35 } 36} 37 38is_quoted <- function(x) { 39 l <- nchar(x) 40 l >= 2 && 41 substr(x, 1, 1) %in% c("'", '"') && 42 substr(x, 1, 1) == substr(x, l, l) 43} 44 45remove_quotes <- function(x) { 46 l <- nchar(x) 47 if (l < 2) { 48 x 49 } else { 50 substr(x, 2, l - 1) 51 } 52} 53 54parse_os_release <- function(lines) { 55 id <- grep("^ID=", lines, value = TRUE)[1] 56 if (is.na(id)) return(unknown_dist()) 57 id <- trimws(sub("^ID=(.*)$", "\\1", id, perl = TRUE)) 58 if (is_quoted(id)) id <- remove_quotes(id) 59 60 ver <- grep("^VERSION_ID=", lines, value = TRUE)[1] 61 if (!is.na(ver)) { 62 ver <- trimws(sub("VERSION_ID=(.*)$", "\\1", ver, perl = TRUE)) 63 if (is_quoted(ver)) ver <- remove_quotes(ver) 64 } 65 66 out <- data.frame( 67 stringsAsFactors = FALSE, 68 distribution = id 69 ) 70 if (!is.na(ver)) out$release <- ver 71 72 out 73} 74 75parse_redhat_release <- function(lines) { 76 pcs <- strsplit(lines[1], " ", fixed = TRUE)[[1]] 77 id <- tolower(pcs[1]) 78 if (id == "" || is.na(id)) return(unknown_dist()) 79 80 wver <- grepl("^[-\\.0-9]+$", pcs) 81 82 out <- data.frame( 83 stringsAsFactors = FALSE, 84 distribution = id 85 ) 86 if (any(wver)) out$release <- pcs[wver][1] 87 88 out 89} 90