Gabriele Contini
2020-03-08 65454077a8c63b50adda4e8c6095c8f00675c4d2
Merge branch 'feature/pc_identifiers' of
https://github.com/open-license-manager/open-license-manager.git into
feature/pc_identifiers

Conflicts:
src/library/hw_identifier/default_strategy.cpp
src/library/hw_identifier/identification_strategy.hpp
src/library/os/CMakeLists.txt
src/library/os/execution_environment.hpp
src/library/os/windows/cpu_info.cpp
src/library/os/windows/execution_environment.cpp
src/library/os/windows/isvm/BIOSReader.cpp
src/library/os/windows/isvm/BIOSReader.h
src/library/os/windows/os-win.c
3个文件已修改
1个文件已添加
104 ■■■■ 已修改文件
build/.gitkeep 补丁 | 查看 | 原始文档 | blame | 历史
src/library/os/execution_environment.hpp 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/os/windows/cpu_info.cpp 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/os/windows/execution_environment.cpp 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
build/.gitkeep
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(){};
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 */
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