Source code for py_vmdetect.py_vmdetect
# -*- coding: utf-8 -*-
import os.path
import sys
from cffi import FFI
major, minor = sys.version_info[0], sys.version_info[1]
if major > 3 and minor > 3:
import importlib.util
else:
import imp
[docs]class VMDetect():
vm_providers = {
1: "VM_OPENVZ",
2: "VM_XEN",
3: "VM_VMWARE",
4: "VM_KVM",
5: "VM_HYPERV",
6: "VM_USERMODELINUX",
7: "VM_FREEBSDJAIL",
8: "VM_VPC",
9: "VM_BHIVE",
10: "VM_QEMU",
11: "VM_LKVM",
12: "VM_VMM"
}
def __init__(self):
ffi = FFI()
ffi.cdef("int vm_by_cpuid();\
int isVMware();\
int isHyperV();\
int detectVZ();\
int isUserModeLinuxOrKvm();\
int detect_XEN_domU();\
int detectFreeBSDJAIL();\
")
path_string = os.path.dirname(os.path.realpath(__file__)) + "/_vmdetect_backend.so"
if not os.path.isfile(path_string):
if major > 3 and minor >= 4:
path_string = importlib.util.find_spec('_vmdetect_backend').origin
else:
path_string = imp.find_module('_vmdetect_backend')[-2]
self.vmdetect = ffi.dlopen(path_string)
[docs] def vm_provider_id(self):
r = self.vmdetect.vm_by_cpuid()
return r
[docs] def is_vm(self):
return self.vm_provider_id() != 0 or \
self.isVMware() or \
self.isHyperV() or \
self.isOpenVZ() or \
self.isUserModeLinux() or \
self.isKvm() or \
self.isXENDomU() or \
self.isFreeBSDJAIL()
[docs] def vm_provider_by_cpuid(self):
r = self.vmdetect.vm_by_cpuid()
return self.vm_providers.get(r, "UNKNOWN")
[docs] def isOpenVZ(self):
r = self.vmdetect.detectVZ()
return r == 1
[docs] def isXENDomU(self):
r = self.vmdetect.detect_XEN_domU()
return r == 2
[docs] def isVMware(self):
r = self.vmdetect.isVMware()
return r == 3
[docs] def isKvm(self):
r = self.vmdetect.isUserModeLinuxOrKvm()
return r == 4
[docs] def isHyperV(self):
r = self.vmdetect.isHyperV()
return r == 5
[docs] def isUserModeLinux(self):
r = self.vmdetect.isUserModeLinuxOrKvm()
return r == 6
[docs] def isFreeBSDJAIL(self):
r = self.vmdetect.detectFreeBSDJAIL()
return r == 7