| | |
| | | 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}; |
| | |
| | | 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) { |
| | |
| | | // 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; |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // 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; |
| | | } |
| | | } |
| | |
| | | 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 |