From 75e4394d720c9cf8039a5e07110322c2b55bce8c Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周日, 08 3月 2020 21:45:16 +0800
Subject: [PATCH] Merge branch 'feature/pc_identifiers' of https://github.com/open-license-manager/open-license-manager.git into feature/pc_identifiers

---
 build/.gitkeep                                   |    0 
 src/library/os/execution_environment.hpp         |    9 ++++
 src/library/os/windows/cpu_info.cpp              |   34 +++++++++++++++++
 src/library/os/windows/execution_environment.cpp |   61 +++++++++++++++++++++---------
 4 files changed, 85 insertions(+), 19 deletions(-)

diff --git a/build/.gitkeep b/build/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/.gitkeep
diff --git a/src/library/os/execution_environment.hpp b/src/library/os/execution_environment.hpp
index bc503fb..db36205 100644
--- a/src/library/os/execution_environment.hpp
+++ b/src/library/os/execution_environment.hpp
@@ -13,6 +13,12 @@
 namespace license {
 namespace os {
 
+/*
+ * windows bios sometimes reports vm names add execution environment detection from bios
+const char *vmVendors[] = {
+	"VMware", "Microsoft Corporation", "Virtual Machine", "innotek GmbH", "PowerVM", "Bochs", "KVM"};
+*/
+
 typedef enum { NONE, CONTAINER, VM } VIRTUALIZATION;
 
 typedef enum {
@@ -35,8 +41,9 @@
 	std::string sys_vendor;
 	std::string bios_vendor;
 	std::string bios_description;
-	//detect if it's a kind of container technology (docker or lxc)
+	// detect if it's a kind of container technology (docker or lxc)
 	bool is_container() const;
+
 public:
 	ExecutionEnvironment();
 	~ExecutionEnvironment(){};
diff --git a/src/library/os/windows/cpu_info.cpp b/src/library/os/windows/cpu_info.cpp
index 192e178..cb41804 100644
--- a/src/library/os/windows/cpu_info.cpp
+++ b/src/library/os/windows/cpu_info.cpp
@@ -45,4 +45,38 @@
 	return string(reinterpret_cast<const char *>(cpui), 12);
 }
 }  // namespace os
+=======
+using namespace std;
+
+CpuInfo::CpuInfo() {}
+
+CpuInfo::~CpuInfo() {}
+/**
+ * Detect Virtual machine using hypervisor bit.
+ * @return true if the cpu hypervisor bit is set to 1
+ */
+bool CpuInfo::is_hypervisor_set() const {
+	int cpui[4] = {0};
+	__cpuid(cpui, 0x1);
+
+	return ((cpui[2] >> 31) & 1);
+}
+
+uint32_t CpuInfo::model() const {
+	int cpui[4] = {0};
+	__cpuid(cpui, 0x1);
+	// ax bits 0-3 stepping,4-7 model,8-11 family id,12-13 processor type
+	//        14-15 reserved, 16-19 extended model, 20-27 extended family, 27-31 reserved
+	// bx bits 0-7 brand index
+	return (cpui[0] & 0x3FFF) | (cpui[0] & 0x3FF8000) >> 2 | (cpui[1] & 0xff) << 24;
+}
+
+string CpuInfo::vendor() const {
+	// hypervisor flag false, try to get the vendor name, see if it's a virtual cpu
+	int cpui[4] = {0};
+	__cpuid(cpui, 0x0);
+	return string(reinterpret_cast<const char *>(cpui), 12);
+}
+
+>>>>>>> branch 'feature/pc_identifiers' of https://github.com/open-license-manager/open-license-manager.git
 } /* namespace license */
diff --git a/src/library/os/windows/execution_environment.cpp b/src/library/os/windows/execution_environment.cpp
index 86513d5..f5a0fb8 100644
--- a/src/library/os/windows/execution_environment.cpp
+++ b/src/library/os/windows/execution_environment.cpp
@@ -1,39 +1,64 @@
-/*
- * virtualization.cpp
- *
- *  Created on: Dec 15, 2019
- *      Author: GC
- */
+#include <paths.h>
 #include <sys/stat.h>
+#include <unistd.h>
 #include <fstream>
 #include <iostream>
 #include <stdio.h>
-#include <string>
+#include <string.h>
+#include <dirent.h>
+#include <sys/utsname.h>
 
 #include "isvm/BIOSReader.h"
 #include "isvm/Native.h"
 #include "../../base/base.h"
-#include "../../base/StringUtils.h"
 #include "../cpu_info.hpp"
 #include "../execution_environment.hpp"
 
 namespace license {
-namespace os {
 using namespace std;
 
-ExecutionEnvironment::ExecutionEnvironment() {
+
+
+VIRTUALIZATION ExecutionEnvironment::getVirtualization() {
+	VIRTUALIZATION result;
+	CpuInfo cpuInfo;
+	bool isContainer = false;
+	if (isContainer) {
+		result = CONTAINER;
+	} else if (cpuInfo.cpu_virtual() || is_cloud()) {
+		result = VM;
+	} else {
+		result = NONE;
+	}
+	return result;
+}
+
+bool ExecutionEnvironment::is_cloud() { return getCloudProvider() != ON_PREMISE; }
+
+bool ExecutionEnvironment::is_docker() { return false; }
+
+CLOUD_PROVIDER ExecutionEnvironment::getCloudProvider() {
 	if (InitEntryPoints()) {
 		BIOSReader reader;
 		SystemInformation info = reader.readSystemInfo();
-		sys_vendor = toupper_copy(info.Manufacturer);
-		bios_vendor = toupper_copy(info.ProductName);
-		bios_description = toupper_copy(info.SysVersion) + toupper_copy(info.family);
+
+		const char *vmVendors[] = {
+			"VMware", "Microsoft Corporation", "Virtual Machine", "innotek GmbH", "PowerVM", "Bochs", "KVM"};
+
+		const int count = _countof(vmVendors);
+		for (int i = 0; i != count; ++i) {
+			const char *vendor = vmVendors[i];
+
+			if (std::string::npos != info.Manufacturer.find(vendor) ||
+				std::string::npos != info.ProductName.find(vendor) ||
+				std::string::npos != info.SerialNum.find(vendor)) {
+				std::cout << "Inside virual machine!";
+				return 1;
+			}
+		}
+	} else {
+		return -1;
 	}
 }
 
-//TODO
-bool ExecutionEnvironment::is_docker() const { return false; }
-//TODO
-bool ExecutionEnvironment::is_container() const { return is_docker(); }
-}  // namespace os
 }  // namespace license

--
Gitblit v1.9.1