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