|
|
@@ -0,0 +1,126 @@
|
|
|
+import sys
|
|
|
+import os
|
|
|
+import ctypes
|
|
|
+import _winreg
|
|
|
+
|
|
|
+"""Class to extract system information from a MS-Windows Box:
|
|
|
+
|
|
|
+Instructions for Using:
|
|
|
+
|
|
|
+Instance the class WindowsSystemInformation
|
|
|
+Then in the instance, access the following variables:
|
|
|
+
|
|
|
+os
|
|
|
+cpu
|
|
|
+totalRAM
|
|
|
+totalVM
|
|
|
+availableVM
|
|
|
+availableRAM
|
|
|
+
|
|
|
+Example:
|
|
|
+
|
|
|
+s = SystemInformation()
|
|
|
+print s.os
|
|
|
+
|
|
|
+s.refresh() # if you need to refresh the dynamic data (i.e. Memory stats, etc)
|
|
|
+"""
|
|
|
+
|
|
|
+def get_registry_value(key, subkey, value):
|
|
|
+ if sys.platform != 'win32':
|
|
|
+ raise OSError("get_registry_value is only supported on Windows")
|
|
|
+
|
|
|
+ key = getattr(_winreg, key)
|
|
|
+ handle = _winreg.OpenKey(key, subkey)
|
|
|
+ (value, type) = _winreg.QueryValueEx(handle, value)
|
|
|
+ return value
|
|
|
+
|
|
|
+class SystemInformation:
|
|
|
+ def __init__(self):
|
|
|
+
|
|
|
+ # Just in in case somebody called this class by accident, we should
|
|
|
+ # check to make sure the OS is MS-Windows before continuing.
|
|
|
+
|
|
|
+ assert sys.platform == 'win32', "Not an MS-Windows Computer. This class should not be called"
|
|
|
+
|
|
|
+ # os contains the Operating System Name with Service Pack and Build
|
|
|
+ # Example: Microsoft Windows XP Service Pack 2 (build 2600)
|
|
|
+
|
|
|
+ self.os = self._os_version().strip()
|
|
|
+
|
|
|
+ # cpu contains the CPU model and speed
|
|
|
+ # Example: Intel Core(TM)2 CPU 6700 @ 2.66GHz
|
|
|
+
|
|
|
+ self.cpu = self._cpu().strip()
|
|
|
+
|
|
|
+ self.totalRAM, self.availableRAM, self.totalPF, self.availablePF, self.memoryLoad, self.totalVM, self.availableVM = self._ram()
|
|
|
+
|
|
|
+ # totalRam contains the total amount of RAM in the system
|
|
|
+
|
|
|
+ self.totalRAM = self.totalRAM / 1024
|
|
|
+
|
|
|
+ # totalVM contains the total amount of VM available to the system
|
|
|
+
|
|
|
+ self.totalVM = self.totalVM / 1024
|
|
|
+
|
|
|
+ # availableVM contains the amount of VM that is free
|
|
|
+
|
|
|
+ self.availableVM = self.availableVM / 1024
|
|
|
+
|
|
|
+ # availableRam: Ammount of available RAM in the system
|
|
|
+
|
|
|
+ self.availableRAM = self.availableRAM / 1024
|
|
|
+
|
|
|
+ def refresh(self):
|
|
|
+ self.totalRAM, self.availableRAM, self.totalPF, self.availablePF, self.memoryLoad, self.totalVM, self.availableVM = self._ram()
|
|
|
+ self.totalRAM = self.totalRAM / 1024
|
|
|
+ self.totalVM = self.totalVM / 1024
|
|
|
+ self.availableVM = self.availableVM / 1024
|
|
|
+ self.availableRAM = self.availableRAM / 1024
|
|
|
+
|
|
|
+ def _os_version(self):
|
|
|
+ def get(key):
|
|
|
+ return get_registry_value(
|
|
|
+ "HKEY_LOCAL_MACHINE",
|
|
|
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
|
|
|
+ key)
|
|
|
+ os = get("ProductName")
|
|
|
+ sp = get("CSDVersion")
|
|
|
+ build = get("CurrentBuildNumber")
|
|
|
+ return "%s %s (build %s)" % (os, sp, build)
|
|
|
+
|
|
|
+ def _cpu(self):
|
|
|
+ return get_registry_value(
|
|
|
+ "HKEY_LOCAL_MACHINE",
|
|
|
+ "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
|
|
|
+ "ProcessorNameString")
|
|
|
+
|
|
|
+ def _ram(self):
|
|
|
+ kernel32 = ctypes.windll.kernel32
|
|
|
+ c_ulong = ctypes.c_ulong
|
|
|
+ class MEMORYSTATUS(ctypes.Structure):
|
|
|
+ _fields_ = [
|
|
|
+ ('dwLength', c_ulong),
|
|
|
+ ('dwMemoryLoad', c_ulong),
|
|
|
+ ('dwTotalPhys', c_ulong),
|
|
|
+ ('dwAvailPhys', c_ulong),
|
|
|
+ ('dwTotalPageFile', c_ulong),
|
|
|
+ ('dwAvailPageFile', c_ulong),
|
|
|
+ ('dwTotalVirtual', c_ulong),
|
|
|
+ ('dwAvailVirtual', c_ulong)
|
|
|
+ ]
|
|
|
+
|
|
|
+ memoryStatus = MEMORYSTATUS()
|
|
|
+ memoryStatus.dwLength = ctypes.sizeof(MEMORYSTATUS)
|
|
|
+ kernel32.GlobalMemoryStatus(ctypes.byref(memoryStatus))
|
|
|
+ return (memoryStatus.dwTotalPhys, memoryStatus.dwAvailPhys, memoryStatus.dwTotalPageFile, memoryStatus.dwAvailPageFile, memoryStatus.dwMemoryLoad, memoryStatus.dwTotalVirtual, memoryStatus.dwAvailVirtual)
|
|
|
+
|
|
|
+# To test, execute the script standalone.
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ s = SystemInformation()
|
|
|
+ print s.os
|
|
|
+ print s.cpu
|
|
|
+ print "RAM : %dKb total" % s.totalRAM
|
|
|
+ print "RAM : %dKb free" % s.availableRAM
|
|
|
+ print "Total VM: %dKb" % s.totalVM
|
|
|
+ print "Available VM: %dKb" % s.availableVM
|