From e047dbe884f5288943d5ba2f8843a078d647d7ef Mon Sep 17 00:00:00 2001 From: gcontini <1121667+gcontini@users.noreply.github.com> Date: 周六, 25 4月 2020 21:01:33 +0800 Subject: [PATCH] first docker & vm detection --- src/library/os/linux/execution_environment.cpp | 50 ++++++++++++++++---------------------------------- 1 files changed, 16 insertions(+), 34 deletions(-) diff --git a/src/library/os/linux/execution_environment.cpp b/src/library/os/linux/execution_environment.cpp index 1f14d62..7df96e9 100644 --- a/src/library/os/linux/execution_environment.cpp +++ b/src/library/os/linux/execution_environment.cpp @@ -25,7 +25,7 @@ using namespace std; // 0=NO 1=Docker/2=Lxc -static int checkContainerProc() { +static CONTAINER_TYPE checkContainerProc() { // in docer /proc/self/cgroups contains the "docker" or "lxc" string // https://stackoverflow.com/questions/23513045/how-to-check-if-a-process-is-running-inside-docker-container char path[MAX_PATH] = {0}; @@ -40,11 +40,11 @@ char *line = NULL; size_t len = 0; ssize_t read; - int result = 0; + CONTAINER_TYPE result = NONE; fp = fopen(proc_path, "r"); if (fp == NULL) { - return 0; + return NONE; } while ((read = getline(&line, &len, fp)) != -1 && result == 0) { @@ -52,10 +52,10 @@ // printf("Retrieved line of length %zu:\n", read); // printf("%s", line); if (strstr(line, "docker") != NULL) { - result = 1; + result = DOCKER; } if (strstr(line, "lxc") != NULL) { - result = 2; + result = LXC; } } @@ -65,17 +65,17 @@ } // 0=NO 1=Docker/2=Lxc -static int checkSystemdContainer() { +static CONTAINER_TYPE checkSystemdContainer() { ifstream systemd_container("/var/run/systemd/container"); - int result = 0; + CONTAINER_TYPE result = NONE; if (systemd_container.good()) { - result = 1; + result = DOCKER; for (string line; getline(systemd_container, line);) { if (line.find("docker") != string::npos) { - result = 1; + result = DOCKER; break; } else if (line.find("lxc") != string::npos) { - result = 2; + result = LXC; break; } } @@ -83,33 +83,15 @@ return result; } -ExecutionEnvironment::ExecutionEnvironment() { - try { - m_bios_vendor = toupper_copy(trim_copy(get_file_contents("/sys/class/dmi/id/sys_vendor", 256))); - - } catch (...) { +static CONTAINER_TYPE get_container_type() { + CONTAINER_TYPE result = checkContainerProc(); + if (result == NONE) { + result = checkSystemdContainer(); } - try { - m_bios_description = toupper_copy(trim_copy(get_file_contents("/sys/class/dmi/id/modalias", 256))); - char last_char = m_bios_description[m_bios_description.length() - 1]; - if (last_char == '\r' || last_char == '\n') { - m_bios_description = m_bios_description.erase(m_bios_description.length() - 1); - } - } catch (...) { - } - try { - m_sys_vendor = get_file_contents("/sys/class/dmi/id/sys_vendor", 256); - char last_char = m_sys_vendor[m_sys_vendor.length() - 2]; - if (last_char == '\r' || last_char == '\n') { - m_sys_vendor = m_sys_vendor.erase(m_sys_vendor.length() - 1); - } - } catch (...) { - } + return result; } -bool ExecutionEnvironment::is_container() const { return (checkContainerProc() != 0 || checkSystemdContainer() != 0); } - -bool ExecutionEnvironment::is_docker() const { return (checkContainerProc() == 1 || checkSystemdContainer() == 1); } +ExecutionEnvironment::ExecutionEnvironment() : m_container_type(get_container_type()) {} } // namespace os } // namespace license -- Gitblit v1.9.1