From 65454077a8c63b50adda4e8c6095c8f00675c4d2 Mon Sep 17 00:00:00 2001 From: Gabriele Contini <contini.mailing@gmail.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