pyhw 0.2.0b0__py3-none-any.whl → 0.7.3__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. pyhw/__init__.py +1 -1
  2. pyhw/__main__.py +10 -3
  3. pyhw/backend/backendBase.py +2 -0
  4. pyhw/backend/cpu/bsd.py +12 -0
  5. pyhw/backend/cpu/cpuBase.py +3 -0
  6. pyhw/backend/cpu/linux.py +26 -0
  7. pyhw/backend/cpu/macos.py +3 -1
  8. pyhw/backend/gpu/bsd.py +7 -0
  9. pyhw/backend/gpu/gpuBase.py +3 -0
  10. pyhw/backend/gpu/linux.py +20 -11
  11. pyhw/backend/gpu/macos.py +54 -17
  12. pyhw/backend/host/bsd.py +13 -0
  13. pyhw/backend/host/hostBase.py +3 -0
  14. pyhw/backend/host/linux.py +48 -21
  15. pyhw/backend/host/macos.py +11 -1
  16. pyhw/backend/kernel/kernelBase.py +1 -3
  17. pyhw/backend/memory/bsd.py +11 -0
  18. pyhw/backend/memory/linux.py +8 -8
  19. pyhw/backend/memory/memoryBase.py +3 -0
  20. pyhw/backend/nic/__init__.py +4 -0
  21. pyhw/backend/nic/bsd.py +7 -0
  22. pyhw/backend/nic/linux.py +41 -0
  23. pyhw/backend/nic/macos.py +27 -0
  24. pyhw/backend/nic/nicBase.py +25 -0
  25. pyhw/backend/nic/nicInfo.py +8 -0
  26. pyhw/backend/npu/__init__.py +5 -0
  27. pyhw/backend/npu/bsd.py +6 -0
  28. pyhw/backend/npu/linux.py +38 -0
  29. pyhw/backend/npu/macos.py +65 -0
  30. pyhw/backend/npu/npuBase.py +20 -0
  31. pyhw/backend/npu/npuInfo.py +10 -0
  32. pyhw/backend/os/bsd.py +7 -0
  33. pyhw/backend/os/linux.py +20 -15
  34. pyhw/backend/os/macos.py +21 -3
  35. pyhw/backend/os/osBase.py +3 -0
  36. pyhw/backend/shell/shellBase.py +1 -1
  37. pyhw/backend/shell/unix.py +20 -2
  38. pyhw/backend/title/titleBase.py +1 -1
  39. pyhw/backend/uptime/bsd.py +7 -0
  40. pyhw/backend/uptime/macos.py +12 -12
  41. pyhw/backend/uptime/uptimeBase.py +3 -0
  42. pyhw/frontend/color/colorConfig.py +70 -1
  43. pyhw/frontend/frontendBase.py +41 -2
  44. pyhw/frontend/logo/ascii/alpine.pyhw +6 -0
  45. pyhw/frontend/logo/ascii/arch.pyhw +19 -0
  46. pyhw/frontend/logo/ascii/armbian.pyhw +14 -0
  47. pyhw/frontend/logo/ascii/centos.pyhw +19 -0
  48. pyhw/frontend/logo/ascii/freebsd.pyhw +15 -0
  49. pyhw/frontend/logo/ascii/raspbian.pyhw +10 -0
  50. pyhw/library/lib/iokitGPULib.dylib +0 -0
  51. pyhw/library/lib/iokitHostLib.dylib +0 -0
  52. pyhw/pyhwUtil/__init__.py +2 -2
  53. pyhw/pyhwUtil/pyhwUtil.py +137 -4
  54. pyhw-0.7.3.dist-info/METADATA +131 -0
  55. pyhw-0.7.3.dist-info/RECORD +100 -0
  56. {pyhw-0.2.0b0.dist-info → pyhw-0.7.3.dist-info}/WHEEL +1 -1
  57. pyhw/macos.py +0 -146
  58. pyhw-0.2.0b0.dist-info/METADATA +0 -50
  59. pyhw-0.2.0b0.dist-info/RECORD +0 -75
  60. {pyhw-0.2.0b0.dist-info → pyhw-0.7.3.dist-info}/LICENSE +0 -0
  61. {pyhw-0.2.0b0.dist-info → pyhw-0.7.3.dist-info}/entry_points.txt +0 -0
  62. {pyhw-0.2.0b0.dist-info → pyhw-0.7.3.dist-info}/top_level.txt +0 -0
pyhw/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '0.1.0'
1
+ __version__ = '0.7.3'
pyhw/__main__.py CHANGED
@@ -9,15 +9,16 @@ from .backend.os import OSDetect
9
9
  from .backend.cpu import CPUDetect
10
10
  from .backend.gpu import GPUDetect
11
11
  from .backend.memory import MemoryDetect
12
+ from .backend.nic import NICDetect
13
+ from .backend.npu import NPUDetect
12
14
  from .pyhwUtil import createDataString
13
15
  from .pyhwUtil import getOS, selectOSLogo
14
16
 
15
17
 
16
18
  def main():
17
19
  current_os = getOS()
18
- print("This is a test version of PyHw. Currently, it only supports Linux and macOS.")
19
- if current_os != "linux" and current_os != "macos":
20
- print(f"Only Linux and macOS is supported for now. Current os: {current_os}")
20
+ if current_os not in ["linux", "macos", "freebsd"]:
21
+ print(f"Only Linux, macOS, and FreeBSD is supported for now. Current os: {current_os}")
21
22
  return
22
23
  data = Data()
23
24
  data.title = TitleDetect(os=current_os).getTitle().title
@@ -31,6 +32,12 @@ def main():
31
32
  if gpu_info.number > 0:
32
33
  data.GPU = gpu_info.gpus
33
34
  data.Memory = MemoryDetect(os=current_os).getMemoryInfo().memory
35
+ nic_info = NICDetect(os=current_os).getNICInfo()
36
+ if nic_info.number > 0:
37
+ data.NIC = nic_info.nics
38
+ npu_info = NPUDetect(os=current_os).getNPUInfo()
39
+ if npu_info.number > 0:
40
+ data.NPU = npu_info.npus
34
41
 
35
42
  Printer(logo_os=selectOSLogo(OSDetect(os=current_os).getOSInfo().id), data=createDataString(data)).cPrint()
36
43
 
@@ -19,3 +19,5 @@ class Data:
19
19
  CPU = "Default Value"
20
20
  GPU = ["Default Value"]
21
21
  Memory = "Default Value"
22
+ NIC = ["Default Value"]
23
+ NPU = ["Default Value"]
@@ -0,0 +1,12 @@
1
+ from .cpuInfo import CPUInfo
2
+ from ...pyhwUtil import sysctlGetString, sysctlGetInt, getArch
3
+
4
+
5
+ class CPUDetectBSD:
6
+ def __init__(self):
7
+ self.__cpuInfo = CPUInfo()
8
+
9
+ def getCPUInfo(self):
10
+ self.__cpuInfo.cpu = sysctlGetString("hw.model")
11
+ return self.__cpuInfo
12
+
@@ -1,5 +1,6 @@
1
1
  from .linux import CPUDetectLinux
2
2
  from .macos import CPUDetectMacOS
3
+ from .bsd import CPUDetectBSD
3
4
  from ...pyhwException import OSUnsupportedException
4
5
 
5
6
 
@@ -12,5 +13,7 @@ class CPUDetect:
12
13
  return CPUDetectLinux().getCPUInfo()
13
14
  elif self.OS == "macos":
14
15
  return CPUDetectMacOS().getCPUInfo()
16
+ elif self.OS == "freebsd":
17
+ return CPUDetectBSD().getCPUInfo()
15
18
  else:
16
19
  raise OSUnsupportedException("Unsupported operating system")
pyhw/backend/cpu/linux.py CHANGED
@@ -10,6 +10,9 @@ class CPUDetectLinux:
10
10
  def getCPUInfo(self):
11
11
  self.__getCPUInfo()
12
12
  self.__modelClean()
13
+ self.__handleSBC()
14
+ if self.__cpuInfo.model == "":
15
+ self.__cpuInfo.model = "Unknown"
13
16
  if self.__cpuInfo.model != "":
14
17
  self.__cpuInfo.cpu = self.__cpuInfo.model
15
18
  if self.__cpuInfo.cores != "":
@@ -51,3 +54,26 @@ class CPUDetectLinux:
51
54
  def __modelClean(self):
52
55
  self.__cpuInfo.model = self.__cpuInfo.model.replace("(R)", "")
53
56
  self.__cpuInfo.model = self.__cpuInfo.model.replace("(TM)", "")
57
+
58
+ def __handleSBC(self):
59
+ # some values should be double-checked
60
+ # Info source: https://github.com/raspberrypi/firmware/tree/master/boot
61
+ if os.path.exists("/sys/firmware/devicetree/base/compatible"):
62
+ try:
63
+ with open("/sys/firmware/devicetree/base/compatible", "r") as f:
64
+ compatible = f.read().strip()
65
+ except FileNotFoundError:
66
+ compatible = ""
67
+ if "raspberrypi" in compatible:
68
+ model = compatible.split(",")[-1]
69
+ if model.startswith("bcm"):
70
+ self.__cpuInfo.model = model.upper()
71
+ elif "orangepi" in compatible:
72
+ if "allwinner" in compatible:
73
+ model = compatible.split(",")[-1]
74
+ if model.startswith("sun"):
75
+ self.__cpuInfo.model = f"Allwinner {model.split('-')[-1].upper()} ({model})"
76
+ else:
77
+ pass
78
+
79
+
pyhw/backend/cpu/macos.py CHANGED
@@ -64,6 +64,8 @@ class CPUDetectMacOS:
64
64
  "Apple M3": "4.05 GHz",
65
65
  "Apple M3 Pro": "4.05 GHz",
66
66
  "Apple M3 Max": "4.05 GHz",
67
- "Apple M4": "4.40 GHz"
67
+ "Apple M4": "4.40 GHz",
68
+ "Apple M4 Pro": "4.40 GHz",
69
+ "Apple M4 Max": "4.40 GHz"
68
70
  }
69
71
  self.__cpuInfo.frequency = freq.get(self.__cpuInfo.model, "Unknown")
@@ -0,0 +1,7 @@
1
+ from .linux import GPUDetectLinux
2
+
3
+
4
+ class GPUDetectBSD(GPUDetectLinux):
5
+ def __init__(self):
6
+ super().__init__()
7
+
@@ -1,5 +1,6 @@
1
1
  from .linux import GPUDetectLinux
2
2
  from .macos import GPUDetectMacOS
3
+ from .bsd import GPUDetectBSD
3
4
 
4
5
 
5
6
  class GPUDetect:
@@ -11,5 +12,7 @@ class GPUDetect:
11
12
  return GPUDetectLinux().getGPUInfo()
12
13
  elif self.OS == "macos":
13
14
  return GPUDetectMacOS().getGPUInfo()
15
+ elif self.OS == "freebsd":
16
+ return GPUDetectBSD().getGPUInfo()
14
17
  else:
15
18
  raise NotImplementedError("Unsupported operating system")
pyhw/backend/gpu/linux.py CHANGED
@@ -2,6 +2,7 @@ import subprocess
2
2
  from .gpuInfo import GPUInfo
3
3
  from ..cpu import CPUDetect
4
4
  from ...pyhwUtil import getArch
5
+ import pypci
5
6
 
6
7
 
7
8
  class GPUDetectLinux:
@@ -10,22 +11,21 @@ class GPUDetectLinux:
10
11
 
11
12
  def getGPUInfo(self):
12
13
  self.__getGPUInfo()
14
+ self.__sortGPUList()
13
15
  return self.__gpuInfo
14
16
 
15
17
  def __getGPUInfo(self):
16
- try:
17
- pci_info = subprocess.run(["bash", "-c", "lspci"], capture_output=True, text=True).stdout.strip()
18
- except subprocess.SubprocessError:
19
- return
20
- if len(pci_info) == 0: # no pcie devices found
18
+ gpu_devices = pypci.PCI().FindAllVGA()
19
+ if len(gpu_devices) == 0:
21
20
  self.__handleNonePciDevices()
22
- for line in pci_info.split("\n"):
23
- if "VGA" in line or "Display" in line or "3D" in line:
24
- gpu = line.split(": ")[1]
25
- self.__gpuInfo.gpus.append(gpu)
21
+ else:
22
+ for device in gpu_devices:
23
+ if device.subsystem_device_name != "":
24
+ device_name = f"{device.vendor_name} {device.device_name} ({device.subsystem_device_name})"
25
+ else:
26
+ device_name = f"{device.vendor_name} {device.device_name}"
27
+ self.__gpuInfo.gpus.append(self.__gpuNameClean(device_name))
26
28
  self.__gpuInfo.number += 1
27
- if self.__gpuInfo.number == 0:
28
- self.__handleNonePciDevices() # fallback to a sbc device detection method
29
29
 
30
30
  def __handleNonePciDevices(self):
31
31
  # if detector can't find any VGA/Display/3D GPUs, assume the host is a sbc device, this function is a placeholder for a more advanced method.
@@ -35,3 +35,12 @@ class GPUDetectLinux:
35
35
  else:
36
36
  self.__gpuInfo.number = 1
37
37
  self.__gpuInfo.gpus.append("Not found")
38
+
39
+ @staticmethod
40
+ def __gpuNameClean(gpu_name: str):
41
+ gpu_name_clean = gpu_name.replace("Corporation ", "")
42
+ return gpu_name_clean
43
+
44
+ def __sortGPUList(self):
45
+ self.__gpuInfo.gpus.sort()
46
+
pyhw/backend/gpu/macos.py CHANGED
@@ -2,6 +2,8 @@ from .gpuInfo import GPUInfo
2
2
  from ...pyhwUtil import getArch
3
3
  import json
4
4
  import subprocess
5
+ import ctypes
6
+ from pathlib import Path
5
7
 
6
8
 
7
9
  class GPUDetectMacOS:
@@ -32,24 +34,49 @@ class GPUDetectMacOS:
32
34
  self.__gpuInfo.gpus.append(f'{gpu.get("sppci_model")} ({gpu.get("sppci_cores")} cores) [SOC Integrated]')
33
35
 
34
36
  def __getGPUIntel(self):
35
- gpus = list()
36
- try:
37
- gpu_info_dict = json.loads(subprocess.check_output(["system_profiler", "SPDisplaysDataType", "-json"]))
38
- if 'SPDisplaysDataType' in gpu_info_dict:
39
- gpus = gpu_info_dict['SPDisplaysDataType']
40
- self.__gpuInfo.number = len(gpus)
41
- else:
42
- pass
43
- except Exception:
44
- return
37
+ if self.__getGPUIOKit():
38
+ pass
39
+ else: # fallback to the default implementation
40
+ gpus = list()
41
+ try:
42
+ gpu_info_dict = json.loads(subprocess.check_output(["system_profiler", "SPDisplaysDataType", "-json"]))
43
+ if 'SPDisplaysDataType' in gpu_info_dict:
44
+ gpus = gpu_info_dict['SPDisplaysDataType']
45
+ self.__gpuInfo.number = len(gpus)
46
+ else:
47
+ pass
48
+ except Exception:
49
+ return
45
50
 
46
- for gpu in gpus:
47
- if self.__handleVendor(gpu.get("spdisplays_vendor")) == "Intel": # Integrated GPU
48
- self.__gpuInfo.gpus.append(f'{gpu.get("sppci_model")} [CPU Integrated]')
49
- elif self.__handleVendor(gpu.get("spdisplays_vendor")) == "AMD": # dGPU
50
- self.__gpuInfo.gpus.append(f'{gpu.get("sppci_model")} [Discrete]')
51
- elif self.__handleVendor(gpu.get("spdisplays_vendor")) == "Nvidia": # Since current macOS does not support NVIDIA GPUs, this condition is not applicable
52
- pass
51
+ for gpu in gpus:
52
+ if self.__handleVendor(gpu.get("spdisplays_vendor")) == "Intel": # Integrated GPU
53
+ self.__gpuInfo.gpus.append(f'{gpu.get("sppci_model")} [CPU Integrated]')
54
+ elif self.__handleVendor(gpu.get("spdisplays_vendor")) == "AMD": # dGPU
55
+ self.__gpuInfo.gpus.append(f'{gpu.get("sppci_model")} {gpu.get("spdisplays_vram")} [Discrete]')
56
+ elif self.__handleVendor(gpu.get("spdisplays_vendor")) == "Nvidia": # Since current macOS does not support NVIDIA GPUs, this condition is not applicable
57
+ pass
58
+
59
+ def __getGPUIOKit(self):
60
+ try:
61
+ package_root = Path(__file__).resolve().parent.parent.parent
62
+ lib = ctypes.CDLL(f"{package_root}/library/lib/iokitGPULib.dylib")
63
+ lib.getGPUInfo.restype = ctypes.c_char_p
64
+ gpu_info = lib.getGPUInfo()
65
+ gpus = gpu_info.decode('utf-8').split("; ")
66
+ self.__gpuInfo.number = len(gpus)
67
+ for gpu in gpus:
68
+ info_list = gpu.split(", ")
69
+ model = info_list[0]
70
+ vendor_id = info_list[1]
71
+ vram = round(int(info_list[2]) / 1024, None)
72
+ if self.__handleVendorID(vendor_id) == "Intel": # Integrated GPU
73
+ self.__gpuInfo.gpus.append(f'{model} [CPU Integrated]')
74
+ elif self.__handleVendorID(vendor_id) == "AMD": # dGPU
75
+ self.__gpuInfo.gpus.append(f'{model} {vram} GB [Discrete]')
76
+ return True
77
+ except Exception as e:
78
+ # print(f"An error occurred while getting GPU info using IOKit: {e}")
79
+ return False
53
80
 
54
81
  @staticmethod
55
82
  def __handleVendor(vendor):
@@ -61,3 +88,13 @@ class GPUDetectMacOS:
61
88
  return "AMD"
62
89
  else:
63
90
  return vendor
91
+
92
+ @staticmethod
93
+ def __handleVendorID(vendor_id):
94
+ if vendor_id == "0x8086":
95
+ return "Intel"
96
+ elif vendor_id == "0x1002":
97
+ return "AMD"
98
+ else:
99
+ return vendor_id
100
+
@@ -0,0 +1,13 @@
1
+ from .linux import HostDetectLinux
2
+
3
+
4
+ class HostDetectBSD(HostDetectLinux):
5
+ def __init__(self):
6
+ HostDetectLinux.__init__(self)
7
+
8
+ def getHostInfo(self):
9
+ self._hostInfo.name = f"General {self._arch} FreeBSD Host"
10
+ self._hostInfo.version = ""
11
+ self._hostInfo.model = self._hostInfo.name + " " + self._hostInfo.version
12
+ return self._hostInfo
13
+
@@ -1,6 +1,7 @@
1
1
  from .linux import HostDetectLinux
2
2
  from .macos import HostDetectMacOS
3
3
  from .windows import HostDetectWindows
4
+ from .bsd import HostDetectBSD
4
5
  from ...pyhwException import OSUnsupportedException
5
6
 
6
7
 
@@ -13,6 +14,8 @@ class HostDetect:
13
14
  return HostDetectLinux().getHostInfo()
14
15
  elif self.OS == "macos":
15
16
  return HostDetectMacOS().getHostInfo()
17
+ elif self.OS == "freebsd":
18
+ return HostDetectBSD().getHostInfo()
16
19
  elif self.OS == "windows":
17
20
  pass
18
21
  else:
@@ -1,35 +1,62 @@
1
1
  """
2
2
  In dev.
3
3
  """
4
- from ...pyhwUtil import getArch
4
+ from ...pyhwUtil import getArch, getDocker
5
5
  from .hostInfo import HostInfo
6
+ import os
6
7
 
7
8
 
8
9
  class HostDetectLinux:
9
10
  def __init__(self):
10
- self.__hostInfo = HostInfo()
11
- self.__arch = getArch()
11
+ self._hostInfo = HostInfo()
12
+ self._arch = getArch()
13
+ self._docker = getDocker()
12
14
 
13
15
  def getHostInfo(self):
14
- self.__getModel()
15
- return self.__hostInfo
16
+ self._getModel()
17
+ return self._hostInfo
16
18
 
17
- def __getModel(self):
18
- if self.__arch in ["x86_64", "x86"]:
19
- try:
20
- with open("/sys/devices/virtual/dmi/id/product_name", "r") as f:
21
- self.__hostInfo.name = f.read().strip()
22
- with open("/sys/devices/virtual/dmi/id/product_version", "r") as f:
23
- self.__hostInfo.version = f.read().strip()
24
- self.__hostInfo.model = self.__hostInfo.name + " " + self.__hostInfo.version
25
- except FileNotFoundError:
26
- pass
27
- elif self.__arch in ["aarch64", "arm32"]:
28
- try:
29
- with open("/sys/firmware/devicetree/base/model", "r") as f:
30
- self.__hostInfo.model = f.read().strip()
31
- except FileNotFoundError:
32
- pass
19
+ def _getModel(self):
20
+ if self._docker:
21
+ self._hostInfo.name = f"General {self._arch} Docker Host"
22
+ self._hostInfo.version = ""
23
+ self._hostInfo.model = self._hostInfo.name + " " + self._hostInfo.version
24
+ else:
25
+ if self._arch in ["x86_64", "x86"]:
26
+ try:
27
+ with open("/sys/devices/virtual/dmi/id/product_name", "r") as f:
28
+ product_name = f.read().strip()
29
+ if product_name.startswith("To be filled by O.E.M."):
30
+ self._hostInfo.name = f"General {self._arch} Host"
31
+ else:
32
+ self._hostInfo.name = product_name
33
+ with open("/sys/devices/virtual/dmi/id/product_version", "r") as f:
34
+ version = f.read().strip()
35
+ if version.startswith("To be filled by O.E.M."):
36
+ self._hostInfo.version = ""
37
+ else:
38
+ self._hostInfo.version = version
39
+ self._hostInfo.model = self._hostInfo.name + " " + self._hostInfo.version
40
+ except FileNotFoundError:
41
+ pass
42
+ elif self._arch in ["aarch64", "arm32"]:
43
+ # try to find dmi folder since some arm based desktops and servers may have same structure as x86_64 machines.
44
+ if os.path.exists("/sys/devices/virtual/dmi/id"):
45
+ try:
46
+ with open("/sys/devices/virtual/dmi/id/product_name", "r") as f:
47
+ self._hostInfo.name = f.read().strip()
48
+ with open("/sys/devices/virtual/dmi/id/product_version", "r") as f:
49
+ self._hostInfo.version = f.read().strip()
50
+ self._hostInfo.model = self._hostInfo.name + " " + self._hostInfo.version
51
+ except FileNotFoundError:
52
+ pass
53
+ else:
54
+ # some single board computers may not have dmi folder, try to find model name in device tree.
55
+ try:
56
+ with open("/sys/firmware/devicetree/base/model", "r") as f:
57
+ self._hostInfo.model = f.read().strip()
58
+ except FileNotFoundError:
59
+ pass
33
60
 
34
61
  def __getHostFamily(self):
35
62
  pass
@@ -172,6 +172,16 @@ class HostDetectMacOS:
172
172
 
173
173
  elif hw_model.startswith("Mac"):
174
174
  version = hw_model[len("Mac"):]
175
+ if self.__hwModelCheck(version, "16,3"):
176
+ return "iMac (24-inch, 2024, Four Thunderbolt / USB 4 ports)"
177
+ if self.__hwModelCheck(version, "16,2"):
178
+ return "iMac (24-inch, 2024, Two Thunderbolt / USB 4 ports)"
179
+ if self.__hwModelCheck(version, "16,1") or self.__hwModelCheck(version, "16,6") or self.__hwModelCheck(version, "16,8"):
180
+ return "MacBook Pro (14-inch, 2024, Three Thunderbolt 4 ports)"
181
+ if self.__hwModelCheck(version, "16,5") or self.__hwModelCheck(version, "16,7"):
182
+ return "MacBook Pro (16-inch, 2024, Three Thunderbolt 4 ports)"
183
+ if self.__hwModelCheck(version, "16,10") or self.__hwModelCheck(version, "16,15"):
184
+ return "Mac mini (M4, 2024)"
175
185
  if self.__hwModelCheck(version, "15,13"):
176
186
  return "MacBook Air (15-inch, M3, 2024)"
177
187
  if self.__hwModelCheck(version, "15,2"):
@@ -262,7 +272,7 @@ class HostDetectMacOS:
262
272
  if self.__hwModelCheck(version, "9,1"):
263
273
  return "iMac (24/20-inch, Early 2009)"
264
274
 
265
- return "Unknown Mac Model"
275
+ return hw_model
266
276
 
267
277
  @staticmethod
268
278
  def __hwModelCheck(version: str, target: str):
@@ -7,9 +7,7 @@ class KernelDetect:
7
7
  self.OS = os
8
8
 
9
9
  def getKernelInfo(self):
10
- if self.OS == "linux":
11
- return KernelDetectUnix().getKernelInfo()
12
- elif self.OS == "macos":
10
+ if self.OS in ["linux", "macos", "freebsd"]:
13
11
  return KernelDetectUnix().getKernelInfo()
14
12
  elif self.OS == "windows":
15
13
  raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,11 @@
1
+ from .linux import MemoryDetectLinux
2
+
3
+
4
+ class MemoryDetectBSD(MemoryDetectLinux):
5
+ def __init__(self):
6
+ MemoryDetectLinux.__init__(self)
7
+
8
+ def getMemoryInfo(self):
9
+ self._memoryInfo.memory = f"Pass"
10
+ return self._memoryInfo
11
+
@@ -3,22 +3,22 @@ from .memoryInfo import MemoryInfo
3
3
 
4
4
  class MemoryDetectLinux:
5
5
  def __init__(self):
6
- self.__memoryInfo = MemoryInfo()
6
+ self._memoryInfo = MemoryInfo()
7
7
 
8
8
  def getMemoryInfo(self):
9
- self.__getMemory()
10
- self.__memoryInfo.memory = f"{self.__memoryInfo.used} MiB / {self.__memoryInfo.total} MiB"
11
- return self.__memoryInfo
9
+ self._getMemory()
10
+ self._memoryInfo.memory = f"{self._memoryInfo.used} MiB / {self._memoryInfo.total} MiB"
11
+ return self._memoryInfo
12
12
 
13
- def __getMemory(self):
13
+ def _getMemory(self):
14
14
  try:
15
15
  with open("/proc/meminfo", "r") as file:
16
16
  for line in file:
17
17
  if line.startswith("MemTotal:"):
18
- self.__memoryInfo.total = round(float(line.split(":")[1].strip()[:-3]) / 1024, 2)
18
+ self._memoryInfo.total = round(float(line.split(":")[1].strip()[:-3]) / 1024, 2)
19
19
  elif line.startswith("MemAvailable:"):
20
- self.__memoryInfo.available = round(float(line.split(":")[1].strip()[:-3]) / 1024, 2)
21
- self.__memoryInfo.used = round(self.__memoryInfo.total - self.__memoryInfo.available, 2)
20
+ self._memoryInfo.available = round(float(line.split(":")[1].strip()[:-3]) / 1024, 2)
21
+ self._memoryInfo.used = round(self._memoryInfo.total - self._memoryInfo.available, 2)
22
22
  except FileNotFoundError:
23
23
  pass
24
24
 
@@ -1,5 +1,6 @@
1
1
  from .linux import MemoryDetectLinux
2
2
  from .macos import MemoryDetectMacOS
3
+ from .bsd import MemoryDetectBSD
3
4
 
4
5
 
5
6
  class MemoryDetect:
@@ -11,5 +12,7 @@ class MemoryDetect:
11
12
  return MemoryDetectLinux().getMemoryInfo()
12
13
  elif self.OS == "macos":
13
14
  return MemoryDetectMacOS().getMemoryInfo()
15
+ elif self.OS == "freebsd":
16
+ return MemoryDetectBSD().getMemoryInfo()
14
17
  else:
15
18
  raise NotImplementedError("Unsupported operating system")
@@ -0,0 +1,4 @@
1
+ from .nicBase import NICDetect
2
+
3
+
4
+ __all__ = ["NICDetect"]
@@ -0,0 +1,7 @@
1
+ from .linux import NICDetectLinux
2
+
3
+
4
+ class NICDetectBSD(NICDetectLinux):
5
+ def __init__(self):
6
+ NICDetectLinux.__init__(self)
7
+
@@ -0,0 +1,41 @@
1
+ import subprocess
2
+ from .nicInfo import NICInfo
3
+ from ...pyhwUtil import getArch
4
+ from ...pyhwException import BackendException
5
+ import pypci
6
+
7
+
8
+ class NICDetectLinux:
9
+ def __init__(self):
10
+ self._nicInfo = NICInfo()
11
+
12
+ def getNICInfo(self):
13
+ self._getNICInfo()
14
+ self._sortNICList()
15
+ return self._nicInfo
16
+
17
+ def _getNICInfo(self):
18
+ nic_devices = pypci.PCI().FindAllNIC()
19
+ if len(nic_devices) == 0:
20
+ self.__handleNonePciDevices()
21
+ else:
22
+ for device in nic_devices:
23
+ if device.subsystem_device_name != "":
24
+ device_name = f"{device.vendor_name} {device.device_name} ({device.subsystem_device_name})"
25
+ else:
26
+ device_name = f"{device.vendor_name} {device.device_name}"
27
+ self._nicInfo.nics.append(self._nicNameClean(device_name))
28
+ self._nicInfo.number += 1
29
+
30
+ def __handleNonePciDevices(self):
31
+ # placeholder for a more advanced method.
32
+ self._nicInfo.nics.append("Not found")
33
+ self._nicInfo.number = 1
34
+
35
+ @staticmethod
36
+ def _nicNameClean(nic_name: str):
37
+ nic_name_clean = nic_name.replace("Corporation ", "")
38
+ return nic_name_clean
39
+
40
+ def _sortNICList(self):
41
+ return self._nicInfo.nics.sort()
@@ -0,0 +1,27 @@
1
+ from .nicInfo import NICInfo
2
+ import subprocess
3
+
4
+
5
+ class NICDetectMacOS:
6
+ def __init__(self):
7
+ self.__nicInfo = NICInfo()
8
+
9
+ def getNICInfo(self):
10
+ self.__getNICInfo()
11
+ return self.__nicInfo
12
+
13
+ def __getNICInfo(self):
14
+ # Placeholder for a more advanced method.
15
+ try:
16
+ interface = subprocess.run(["bash", "-c", "route get default | grep interface"], capture_output=True, text=True).stdout.strip().split(":")[1]
17
+ if_ip = subprocess.run(["bash", "-c", f"ipconfig getifaddr {interface}"], capture_output=True, text=True).stdout.strip()
18
+ self.__nicInfo.nics.append(f"{interface} @ {if_ip}")
19
+ self.__nicInfo.number += 1
20
+ except:
21
+ self.__handleError()
22
+
23
+ def __handleError(self):
24
+ self.__nicInfo.nics.append("en0")
25
+ self.__nicInfo.number = 1
26
+
27
+
@@ -0,0 +1,25 @@
1
+ from .linux import NICDetectLinux
2
+ from .macos import NICDetectMacOS
3
+ from .bsd import NICDetectBSD
4
+
5
+
6
+ class NICDetect:
7
+ """
8
+ Class for network interface (NIC) detection.
9
+ """
10
+ def __init__(self, os):
11
+ self.OS = os
12
+
13
+ def getNICInfo(self):
14
+ """
15
+ Detects the network interfaces (NICs) connected to the system.
16
+ :return: dataclass NICInfo, direct attr: nics
17
+ """
18
+ if self.OS == "linux":
19
+ return NICDetectLinux().getNICInfo()
20
+ elif self.OS == "macos":
21
+ return NICDetectMacOS().getNICInfo()
22
+ elif self.OS == "freebsd":
23
+ return NICDetectBSD().getNICInfo()
24
+ else:
25
+ raise NotImplementedError("Unsupported operating system")
@@ -0,0 +1,8 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class NICInfo:
6
+ def __init__(self):
7
+ self.number = 0
8
+ self.nics = []
@@ -0,0 +1,5 @@
1
+ from .npuBase import NPUDetect
2
+
3
+ __all__ = ['NPUDetect']
4
+
5
+
@@ -0,0 +1,6 @@
1
+ from .linux import NPUDetectLinux
2
+
3
+
4
+ class NPUDetectBSD(NPUDetectLinux):
5
+ def __init__(self):
6
+ NPUDetectLinux.__init__(self)