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/execution_environment_common.cpp | 81 +++++++++++++++++++++++++++++++--------- 1 files changed, 63 insertions(+), 18 deletions(-) diff --git a/src/library/os/execution_environment_common.cpp b/src/library/os/execution_environment_common.cpp index 06f5c56..5f8d1bf 100644 --- a/src/library/os/execution_environment_common.cpp +++ b/src/library/os/execution_environment_common.cpp @@ -8,6 +8,7 @@ #include <string.h> #include <unordered_map> #include <array> +#include <licensecc/datatypes.h> #include "../base/base.h" #include "cpu_info.hpp" @@ -17,39 +18,83 @@ namespace os { using namespace std; -VIRTUALIZATION ExecutionEnvironment::getVirtualization() const { - VIRTUALIZATION result; - CpuInfo cpuInfo; +const unordered_map<string, LCC_API_VIRTUALIZATION_DETAIL> virtual_cpu_names{ + {"bhyve bhyve ", V_OTHER}, {"KVM", KVM}, {"MICROSOFT", HV}, {" lrpepyh vr", HV}, + {"prl hyperv ", V_OTHER}, {"VMWARE", VMWARE}, {"XenVMMXenVMM", V_XEN}, {"ACRNACRNACRN", V_OTHER}, + {"VBOX", VIRTUALBOX}}; + +const unordered_map<string, LCC_API_VIRTUALIZATION_DETAIL> vm_vendors{{"VMWARE", VMWARE}, + {"MICROSOFT", HV}, + {"VITRUAL MACHINE", V_OTHER}, + {"INNOTEK GMBH", V_OTHER}, + {"POWERVM", V_OTHER}, + {"BOCHS", V_OTHER}, + {"KVM", KVM}}; + +static LCC_API_VIRTUALIZATION_DETAIL find_in_map(const unordered_map<string, LCC_API_VIRTUALIZATION_DETAIL>& map, const string& data) { + for (auto it : map) { + if (data.find(it.first) != string::npos) { + return it.second; + } + } + return BARE_TO_METAL; +} + +LCC_API_VIRTUALIZATION_SUMMARY ExecutionEnvironment::virtualization() const { + LCC_API_VIRTUALIZATION_SUMMARY result; bool isContainer = is_container(); if (isContainer) { - result = CONTAINER; - } else if (cpuInfo.cpu_virtual() || is_cloud()) { - result = VM; + result = LCC_API_VIRTUALIZATION_SUMMARY::CONTAINER; + } else if (virtualization_detail() != BARE_TO_METAL || is_cloud()) { + result = LCC_API_VIRTUALIZATION_SUMMARY::VM; } else { - result = NONE; + result = LCC_API_VIRTUALIZATION_SUMMARY::NONE; + } + return result; +} + +LCC_API_VIRTUALIZATION_DETAIL ExecutionEnvironment::virtualization_detail() const { + LCC_API_VIRTUALIZATION_DETAIL result = BARE_TO_METAL; + const string bios_description = m_dmi_info.bios_description(); + const string bios_vendor = m_dmi_info.bios_vendor(); + const string sys_vendor = m_dmi_info.sys_vendor(); + if ((result = find_in_map(vm_vendors, bios_description)) == BARE_TO_METAL) { + if ((result = find_in_map(vm_vendors, bios_vendor)) == BARE_TO_METAL) { + if ((result = find_in_map(vm_vendors, sys_vendor)) == BARE_TO_METAL) { + if ((result = find_in_map(virtual_cpu_names, m_cpu_info.vendor())) == BARE_TO_METAL) { + result = find_in_map(virtual_cpu_names, m_cpu_info.brand()); + } + } + } + } + if (result == BARE_TO_METAL && m_cpu_info.is_hypervisor_set()) { + result = V_OTHER; } return result; } bool ExecutionEnvironment::is_cloud() const { - CLOUD_PROVIDER prov = getCloudProvider(); + const LCC_API_CLOUD_PROVIDER prov = cloud_provider(); return prov != ON_PREMISE && prov != PROV_UNKNOWN; } // TODO test and azure -CLOUD_PROVIDER ExecutionEnvironment::getCloudProvider() const { - CLOUD_PROVIDER result = PROV_UNKNOWN; - if (m_bios_description.size() > 0 || m_bios_vendor.size() > 0 || m_sys_vendor.size() > 0) { - if (m_bios_vendor.find("SEABIOS") != string::npos || m_bios_description.find("ALIBABA") != string::npos || - m_sys_vendor.find("ALIBABA") != string::npos) { +LCC_API_CLOUD_PROVIDER ExecutionEnvironment::cloud_provider() const { + LCC_API_CLOUD_PROVIDER result = PROV_UNKNOWN; + const string bios_description = m_dmi_info.bios_description(); + const string bios_vendor = m_dmi_info.bios_vendor(); + const string sys_vendor = m_dmi_info.sys_vendor(); + if (bios_description.size() > 0 || bios_vendor.size() > 0 || sys_vendor.size() > 0) { + if (bios_vendor.find("SEABIOS") != string::npos || bios_description.find("ALIBABA") != string::npos || + sys_vendor.find("ALIBABA") != string::npos) { result = ALI_CLOUD; - } else if (m_sys_vendor.find("GOOGLE") != string::npos || m_bios_description.find("GOOGLE") != string::npos) { + } else if (sys_vendor.find("GOOGLE") != string::npos || bios_description.find("GOOGLE") != string::npos) { result = GOOGLE_CLOUD; - } else if (m_bios_vendor.find("AWS") != string::npos || m_bios_description.find("AMAZON") != string::npos || - m_sys_vendor.find("AWS") != string::npos) { + } else if (bios_vendor.find("AWS") != string::npos || bios_description.find("AMAZON") != string::npos || + sys_vendor.find("AWS") != string::npos) { result = AWS; - } else if (m_bios_description.find("HP-COMPAQ") != string::npos || m_bios_description.find("ASUS") || - m_bios_description.find("DELL")) { + } else if (bios_description.find("HP-COMPAQ") != string::npos || bios_description.find("ASUS") || + bios_description.find("DELL")) { result = ON_PREMISE; } } -- Gitblit v1.9.1