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