pyhw 0.7.4__py3-none-any.whl → 0.9.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- pyhw/__init__.py +1 -1
- pyhw/__main__.py +2 -2
- pyhw/backend/cpu/cpuBase.py +6 -3
- pyhw/backend/cpu/linux.py +3 -0
- pyhw/backend/cpu/windows.py +48 -0
- pyhw/backend/gpu/gpuBase.py +8 -4
- pyhw/backend/gpu/linux.py +1 -1
- pyhw/backend/gpu/windows.py +41 -0
- pyhw/backend/host/hostBase.py +5 -5
- pyhw/backend/host/hostInfo.py +17 -8
- pyhw/backend/host/linux.py +1 -1
- pyhw/backend/host/windows.py +32 -1
- pyhw/backend/kernel/kernelBase.py +3 -2
- pyhw/backend/kernel/kernelInfo.py +6 -0
- pyhw/backend/kernel/windows.py +32 -1
- pyhw/backend/memory/memoryBase.py +8 -4
- pyhw/backend/memory/windows.py +36 -0
- pyhw/backend/nic/linux.py +2 -0
- pyhw/backend/nic/nicBase.py +8 -4
- pyhw/backend/nic/windows.py +44 -0
- pyhw/backend/npu/linux.py +18 -2
- pyhw/backend/npu/npuBase.py +8 -6
- pyhw/backend/npu/windows.py +40 -0
- pyhw/backend/os/osBase.py +6 -3
- pyhw/backend/os/osInfo.py +6 -0
- pyhw/backend/os/windows.py +43 -0
- pyhw/backend/shell/shellBase.py +4 -1
- pyhw/backend/shell/shellInfo.py +10 -0
- pyhw/backend/shell/unix.py +2 -10
- pyhw/backend/shell/windows.py +29 -0
- pyhw/backend/title/titleBase.py +2 -2
- pyhw/backend/title/titleInfo.py +9 -0
- pyhw/backend/title/unix.py +2 -9
- pyhw/backend/title/windows.py +10 -1
- pyhw/backend/uptime/linux.py +3 -3
- pyhw/backend/uptime/macos.py +3 -3
- pyhw/backend/uptime/uptimeBase.py +6 -3
- pyhw/backend/uptime/windows.py +49 -0
- pyhw/frontend/color/colorConfig.py +52 -0
- pyhw/frontend/logo/ascii/windows_10.pyhw +19 -0
- pyhw/frontend/logo/ascii/windows_11.pyhw +17 -0
- pyhw/frontend/logo/ascii/windows_2025.pyhw +17 -0
- pyhw/frontend/logo/ascii/windows_old.pyhw +16 -0
- pyhw/pyhwUtil/pyhwUtil.py +13 -4
- {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/METADATA +8 -4
- {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/RECORD +50 -36
- {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/LICENSE +0 -0
- {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/WHEEL +0 -0
- {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/entry_points.txt +0 -0
- {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/top_level.txt +0 -0
pyhw/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = '0.
|
1
|
+
__version__ = '0.9.0'
|
pyhw/__main__.py
CHANGED
@@ -17,8 +17,8 @@ from .pyhwUtil import getOS, selectOSLogo
|
|
17
17
|
|
18
18
|
def main():
|
19
19
|
current_os = getOS()
|
20
|
-
if current_os not in ["linux", "macos", "freebsd"]:
|
21
|
-
print(f"Only Linux, macOS, and
|
20
|
+
if current_os not in ["linux", "macos", "freebsd", "windows"]:
|
21
|
+
print(f"Only Linux, macOS, FreeBSD and Windows are supported for now. Current OS: {current_os}")
|
22
22
|
return
|
23
23
|
data = Data()
|
24
24
|
data.title = TitleDetect(os=current_os).getTitle().title
|
pyhw/backend/cpu/cpuBase.py
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
from .linux import CPUDetectLinux
|
2
|
-
from .macos import CPUDetectMacOS
|
3
|
-
from .bsd import CPUDetectBSD
|
4
1
|
from ...pyhwException import OSUnsupportedException
|
5
2
|
|
6
3
|
|
@@ -10,10 +7,16 @@ class CPUDetect:
|
|
10
7
|
|
11
8
|
def getCPUInfo(self):
|
12
9
|
if self.OS == "linux":
|
10
|
+
from .linux import CPUDetectLinux
|
13
11
|
return CPUDetectLinux().getCPUInfo()
|
14
12
|
elif self.OS == "macos":
|
13
|
+
from .macos import CPUDetectMacOS
|
15
14
|
return CPUDetectMacOS().getCPUInfo()
|
16
15
|
elif self.OS == "freebsd":
|
16
|
+
from .bsd import CPUDetectBSD
|
17
17
|
return CPUDetectBSD().getCPUInfo()
|
18
|
+
elif self.OS == "windows":
|
19
|
+
from .windows import CPUDetectWindows
|
20
|
+
return CPUDetectWindows().getCPUInfo()
|
18
21
|
else:
|
19
22
|
raise OSUnsupportedException("Unsupported operating system")
|
pyhw/backend/cpu/linux.py
CHANGED
@@ -73,6 +73,9 @@ class CPUDetectLinux:
|
|
73
73
|
model = compatible.split(",")[-1]
|
74
74
|
if model.startswith("sun"):
|
75
75
|
self.__cpuInfo.model = f"Allwinner {model.split('-')[-1].upper()} ({model})"
|
76
|
+
elif "cvitek" in compatible:
|
77
|
+
model = compatible.split(",")[-1]
|
78
|
+
self.__cpuInfo.model = f"Cvitek {model}"
|
76
79
|
else:
|
77
80
|
pass
|
78
81
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
import re
|
2
|
+
import os
|
3
|
+
import subprocess
|
4
|
+
from .cpuInfo import CPUInfo
|
5
|
+
import json
|
6
|
+
|
7
|
+
|
8
|
+
class CPUDetectWindows:
|
9
|
+
def __init__(self):
|
10
|
+
self.__cpuInfo = CPUInfo()
|
11
|
+
|
12
|
+
def getCPUInfo(self):
|
13
|
+
self.__getCPUInfo()
|
14
|
+
self.__modelClean()
|
15
|
+
if self.__cpuInfo.model == "":
|
16
|
+
self.__cpuInfo.model = "Unknown"
|
17
|
+
if self.__cpuInfo.model != "":
|
18
|
+
self.__cpuInfo.cpu = self.__cpuInfo.model
|
19
|
+
if self.__cpuInfo.cores != "":
|
20
|
+
self.__cpuInfo.cpu += f" ({self.__cpuInfo.cores})"
|
21
|
+
if self.__cpuInfo.frequency != "":
|
22
|
+
self.__cpuInfo.cpu += f" @ {self.__cpuInfo.frequency}"
|
23
|
+
return self.__cpuInfo
|
24
|
+
|
25
|
+
def __getCPUInfo(self):
|
26
|
+
COMMAND = "Get-CimInstance -ClassName Win32_Processor | Select-Object Name,NumberOfLogicalProcessors,MaxClockSpeed | ConvertTo-JSON"
|
27
|
+
|
28
|
+
try:
|
29
|
+
result = subprocess.run(["powershell", "-NoProfile", "-Command", COMMAND], capture_output=True, text=True)
|
30
|
+
except subprocess.SubprocessError:
|
31
|
+
exit(-1)
|
32
|
+
|
33
|
+
res = json.loads(result.stdout)
|
34
|
+
name = res["Name"]
|
35
|
+
cores = res["NumberOfLogicalProcessors"]
|
36
|
+
frequency = round(int(res["MaxClockSpeed"]) / 1000.0, 2) # GHz
|
37
|
+
if "@" in name:
|
38
|
+
self.__cpuInfo.model = name.split("@")[0].strip()
|
39
|
+
else:
|
40
|
+
self.__cpuInfo.model = name
|
41
|
+
self.__cpuInfo.cores = str(cores)
|
42
|
+
self.__cpuInfo.frequency = f"{frequency:.2f} GHz"
|
43
|
+
|
44
|
+
def __modelClean(self):
|
45
|
+
self.__cpuInfo.model = self.__cpuInfo.model.replace("(R)", "")
|
46
|
+
self.__cpuInfo.model = self.__cpuInfo.model.replace("(TM)", "")
|
47
|
+
self.__cpuInfo.model = self.__cpuInfo.model.replace("CPU ", "")
|
48
|
+
|
pyhw/backend/gpu/gpuBase.py
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
from
|
2
|
-
from .macos import GPUDetectMacOS
|
3
|
-
from .bsd import GPUDetectBSD
|
1
|
+
from ...pyhwException import OSUnsupportedException
|
4
2
|
|
5
3
|
|
6
4
|
class GPUDetect:
|
@@ -9,10 +7,16 @@ class GPUDetect:
|
|
9
7
|
|
10
8
|
def getGPUInfo(self):
|
11
9
|
if self.OS == "linux":
|
10
|
+
from .linux import GPUDetectLinux
|
12
11
|
return GPUDetectLinux().getGPUInfo()
|
13
12
|
elif self.OS == "macos":
|
13
|
+
from .macos import GPUDetectMacOS
|
14
14
|
return GPUDetectMacOS().getGPUInfo()
|
15
15
|
elif self.OS == "freebsd":
|
16
|
+
from .bsd import GPUDetectBSD
|
16
17
|
return GPUDetectBSD().getGPUInfo()
|
18
|
+
elif self.OS == "windows":
|
19
|
+
from .windows import GPUDetectWindows
|
20
|
+
return GPUDetectWindows().getGPUInfo()
|
17
21
|
else:
|
18
|
-
raise
|
22
|
+
raise OSUnsupportedException("Unsupported operating system")
|
pyhw/backend/gpu/linux.py
CHANGED
@@ -29,7 +29,7 @@ class GPUDetectLinux:
|
|
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.
|
32
|
-
if getArch()
|
32
|
+
if getArch() in ["aarch64", "arm32", "riscv64"]:
|
33
33
|
self.__gpuInfo.number = 1
|
34
34
|
self.__gpuInfo.gpus.append(f"{CPUDetect(os='linux').getCPUInfo().model} [SOC Integrated]")
|
35
35
|
else:
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import subprocess
|
2
|
+
from .gpuInfo import GPUInfo
|
3
|
+
from ..cpu import CPUDetect
|
4
|
+
from ...pyhwUtil import getArch
|
5
|
+
import pypci
|
6
|
+
|
7
|
+
|
8
|
+
class GPUDetectWindows:
|
9
|
+
def __init__(self):
|
10
|
+
self.__gpuInfo = GPUInfo()
|
11
|
+
|
12
|
+
def getGPUInfo(self):
|
13
|
+
self.__getGPUInfo()
|
14
|
+
self.__sortGPUList()
|
15
|
+
return self.__gpuInfo
|
16
|
+
|
17
|
+
def __getGPUInfo(self):
|
18
|
+
gpu_devices = pypci.PCI().FindAllVGA()
|
19
|
+
if len(gpu_devices) == 0:
|
20
|
+
self.__handleNonePciDevices()
|
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))
|
28
|
+
self.__gpuInfo.number += 1
|
29
|
+
|
30
|
+
def __handleNonePciDevices(self):
|
31
|
+
self.__gpuInfo.gpus.append("Not found")
|
32
|
+
self.__gpuInfo.number = 1
|
33
|
+
|
34
|
+
@staticmethod
|
35
|
+
def __gpuNameClean(gpu_name: str):
|
36
|
+
gpu_name_clean = gpu_name.replace("Corporation ", "")
|
37
|
+
return gpu_name_clean
|
38
|
+
|
39
|
+
def __sortGPUList(self):
|
40
|
+
self.__gpuInfo.gpus.sort()
|
41
|
+
|
pyhw/backend/host/hostBase.py
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
from .linux import HostDetectLinux
|
2
|
-
from .macos import HostDetectMacOS
|
3
|
-
from .windows import HostDetectWindows
|
4
|
-
from .bsd import HostDetectBSD
|
5
1
|
from ...pyhwException import OSUnsupportedException
|
6
2
|
|
7
3
|
|
@@ -11,12 +7,16 @@ class HostDetect:
|
|
11
7
|
|
12
8
|
def getHostInfo(self):
|
13
9
|
if self.OS == "linux":
|
10
|
+
from .linux import HostDetectLinux
|
14
11
|
return HostDetectLinux().getHostInfo()
|
15
12
|
elif self.OS == "macos":
|
13
|
+
from .macos import HostDetectMacOS
|
16
14
|
return HostDetectMacOS().getHostInfo()
|
17
15
|
elif self.OS == "freebsd":
|
16
|
+
from .bsd import HostDetectBSD
|
18
17
|
return HostDetectBSD().getHostInfo()
|
19
18
|
elif self.OS == "windows":
|
20
|
-
|
19
|
+
from .windows import HostDetectWindows
|
20
|
+
return HostDetectWindows().getHostInfo()
|
21
21
|
else:
|
22
22
|
raise OSUnsupportedException("Unsupported operating system")
|
pyhw/backend/host/hostInfo.py
CHANGED
@@ -3,11 +3,20 @@ from dataclasses import dataclass
|
|
3
3
|
|
4
4
|
@dataclass
|
5
5
|
class HostInfo:
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
"""
|
7
|
+
HostInfo class to store host information.
|
8
|
+
"""
|
9
|
+
def __init__(self):
|
10
|
+
"""
|
11
|
+
Initialize HostInfo class, model attribute is required.
|
12
|
+
"""
|
13
|
+
self.os = ""
|
14
|
+
self.model = ""
|
15
|
+
self.family = ""
|
16
|
+
self.name = ""
|
17
|
+
self.version = ""
|
18
|
+
self.sku = ""
|
19
|
+
self.serial = ""
|
20
|
+
self.uuid = ""
|
21
|
+
self.vendor = ""
|
22
|
+
|
pyhw/backend/host/linux.py
CHANGED
@@ -39,7 +39,7 @@ class HostDetectLinux:
|
|
39
39
|
self._hostInfo.model = self._hostInfo.name + " " + self._hostInfo.version
|
40
40
|
except FileNotFoundError:
|
41
41
|
pass
|
42
|
-
elif self._arch in ["aarch64", "arm32"]:
|
42
|
+
elif self._arch in ["aarch64", "arm32", "riscv64"]:
|
43
43
|
# try to find dmi folder since some arm based desktops and servers may have same structure as x86_64 machines.
|
44
44
|
if os.path.exists("/sys/devices/virtual/dmi/id"):
|
45
45
|
try:
|
pyhw/backend/host/windows.py
CHANGED
@@ -1,5 +1,36 @@
|
|
1
1
|
"""
|
2
2
|
In dev.
|
3
3
|
"""
|
4
|
+
from ...pyhwUtil import getArch
|
5
|
+
from ...pyhwException import BackendException
|
6
|
+
from .hostInfo import HostInfo
|
7
|
+
import winreg
|
8
|
+
|
9
|
+
|
4
10
|
class HostDetectWindows:
|
5
|
-
|
11
|
+
def __init__(self):
|
12
|
+
self._hostInfo = HostInfo()
|
13
|
+
self._arch = getArch()
|
14
|
+
|
15
|
+
def getHostInfo(self):
|
16
|
+
self._getModel()
|
17
|
+
return self._hostInfo
|
18
|
+
|
19
|
+
def _getModel(self):
|
20
|
+
try:
|
21
|
+
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"HARDWARE\DESCRIPTION\System\BIOS")
|
22
|
+
manufacturer, _ = winreg.QueryValueEx(key, "SystemManufacturer")
|
23
|
+
name, _ = winreg.QueryValueEx(key, "SystemProductName")
|
24
|
+
version, _ = winreg.QueryValueEx(key, "SystemVersion")
|
25
|
+
winreg.CloseKey(key)
|
26
|
+
except FileNotFoundError:
|
27
|
+
raise BackendException("Unable to retrieve system information.")
|
28
|
+
self._hostInfo.name = name
|
29
|
+
self._hostInfo.version = version
|
30
|
+
self._hostInfo.vendor = manufacturer
|
31
|
+
self.__handleVM()
|
32
|
+
self._hostInfo.model = self._hostInfo.name + " " + self._hostInfo.version
|
33
|
+
|
34
|
+
def __handleVM(self):
|
35
|
+
if self._hostInfo.name.startswith("VMware"):
|
36
|
+
self._hostInfo.version = ""
|
@@ -1,4 +1,3 @@
|
|
1
|
-
from .unix import KernelDetectUnix
|
2
1
|
from ...pyhwException import OSUnsupportedException
|
3
2
|
|
4
3
|
|
@@ -8,8 +7,10 @@ class KernelDetect:
|
|
8
7
|
|
9
8
|
def getKernelInfo(self):
|
10
9
|
if self.OS in ["linux", "macos", "freebsd"]:
|
10
|
+
from .unix import KernelDetectUnix
|
11
11
|
return KernelDetectUnix().getKernelInfo()
|
12
12
|
elif self.OS == "windows":
|
13
|
-
|
13
|
+
from .windows import KernelDetectWindows
|
14
|
+
return KernelDetectWindows().getKernelInfo()
|
14
15
|
else:
|
15
16
|
raise OSUnsupportedException("Unsupported operating system")
|
@@ -3,7 +3,13 @@ from dataclasses import dataclass
|
|
3
3
|
|
4
4
|
@dataclass
|
5
5
|
class KernelInfo:
|
6
|
+
"""
|
7
|
+
Data class for storing kernel information.
|
8
|
+
"""
|
6
9
|
def __init__(self):
|
10
|
+
"""
|
11
|
+
Initialize the data class, kernel attribute is required.
|
12
|
+
"""
|
7
13
|
self.name = ""
|
8
14
|
self.version = ""
|
9
15
|
self.machine = ""
|
pyhw/backend/kernel/windows.py
CHANGED
@@ -1,7 +1,38 @@
|
|
1
1
|
"""
|
2
2
|
In dev.
|
3
3
|
"""
|
4
|
+
from .kernelInfo import KernelInfo
|
5
|
+
from ...pyhwException import BackendException
|
6
|
+
import platform
|
7
|
+
import winreg
|
4
8
|
|
5
9
|
|
6
10
|
class KernelDetectWindows:
|
7
|
-
|
11
|
+
def __init__(self):
|
12
|
+
self.__kernelInfo = KernelInfo()
|
13
|
+
|
14
|
+
def getKernelInfo(self):
|
15
|
+
version = platform.version()
|
16
|
+
machine = platform.machine()
|
17
|
+
display = self.__get_windows_version()
|
18
|
+
if display != "":
|
19
|
+
self.__kernelInfo.kernel = f"{version} ({display}) {machine}"
|
20
|
+
else:
|
21
|
+
self.__kernelInfo.kernel = f"{version} {machine}"
|
22
|
+
return self.__kernelInfo
|
23
|
+
|
24
|
+
@staticmethod
|
25
|
+
def __get_windows_version():
|
26
|
+
try:
|
27
|
+
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")
|
28
|
+
display_version, _ = winreg.QueryValueEx(key, "DisplayVersion")
|
29
|
+
winreg.CloseKey(key)
|
30
|
+
return str(display_version)
|
31
|
+
except:
|
32
|
+
try:
|
33
|
+
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")
|
34
|
+
release_id, _ = winreg.QueryValueEx(key, "ReleaseId")
|
35
|
+
winreg.CloseKey(key)
|
36
|
+
return str(release_id)
|
37
|
+
except:
|
38
|
+
return ""
|
@@ -1,6 +1,4 @@
|
|
1
|
-
from
|
2
|
-
from .macos import MemoryDetectMacOS
|
3
|
-
from .bsd import MemoryDetectBSD
|
1
|
+
from ...pyhwException import OSUnsupportedException
|
4
2
|
|
5
3
|
|
6
4
|
class MemoryDetect:
|
@@ -9,10 +7,16 @@ class MemoryDetect:
|
|
9
7
|
|
10
8
|
def getMemoryInfo(self):
|
11
9
|
if self.OS == "linux":
|
10
|
+
from .linux import MemoryDetectLinux
|
12
11
|
return MemoryDetectLinux().getMemoryInfo()
|
13
12
|
elif self.OS == "macos":
|
13
|
+
from .macos import MemoryDetectMacOS
|
14
14
|
return MemoryDetectMacOS().getMemoryInfo()
|
15
15
|
elif self.OS == "freebsd":
|
16
|
+
from .bsd import MemoryDetectBSD
|
16
17
|
return MemoryDetectBSD().getMemoryInfo()
|
18
|
+
elif self.OS == "windows":
|
19
|
+
from .windows import MemoryDetectWindows
|
20
|
+
return MemoryDetectWindows().getMemoryInfo()
|
17
21
|
else:
|
18
|
-
raise
|
22
|
+
raise OSUnsupportedException("Unsupported operating system")
|
@@ -0,0 +1,36 @@
|
|
1
|
+
from ...pyhwException import BackendException
|
2
|
+
from .memoryInfo import MemoryInfo
|
3
|
+
import subprocess
|
4
|
+
import json
|
5
|
+
|
6
|
+
|
7
|
+
class MemoryDetectWindows:
|
8
|
+
def __init__(self):
|
9
|
+
self._memoryInfo = MemoryInfo()
|
10
|
+
|
11
|
+
def getMemoryInfo(self):
|
12
|
+
self._getMemory()
|
13
|
+
self._memoryInfo.memory = f"{self._memoryInfo.used} MiB / {self._memoryInfo.total} MiB"
|
14
|
+
return self._memoryInfo
|
15
|
+
|
16
|
+
def _getMemory(self):
|
17
|
+
COMMAND = 'Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object FreePhysicalMemory,TotalVisibleMemorySize | ConvertTo-JSON'
|
18
|
+
try:
|
19
|
+
result = subprocess.run(["powershell", "-NoProfile", "-Command", COMMAND], capture_output=True, text=True)
|
20
|
+
except subprocess.SubprocessError:
|
21
|
+
raise BackendException("Failed to get memory information on Windows.")
|
22
|
+
|
23
|
+
res = json.loads(result.stdout)
|
24
|
+
free_memory = int(res['FreePhysicalMemory']) / 1024
|
25
|
+
total_memory = int(res['TotalVisibleMemorySize']) / 1024
|
26
|
+
used_memory = total_memory - free_memory
|
27
|
+
self._memoryInfo.total = round(total_memory, 2)
|
28
|
+
self._memoryInfo.available = round(free_memory, 2)
|
29
|
+
self._memoryInfo.used = round(used_memory, 2)
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
|
pyhw/backend/nic/linux.py
CHANGED
@@ -39,6 +39,8 @@ class NICDetectLinux:
|
|
39
39
|
for interface in interfaces:
|
40
40
|
try:
|
41
41
|
if_ip = subprocess.run(["bash", "-c", f"ip -4 addr show {interface} | grep inet | awk '{{print $2}}'"], capture_output=True, text=True).stdout.strip().split("/")[0]
|
42
|
+
if if_ip == "":
|
43
|
+
continue
|
42
44
|
self._nicInfo.nics.append(f"{interface} @ {if_ip}")
|
43
45
|
self._nicInfo.number += 1
|
44
46
|
except:
|
pyhw/backend/nic/nicBase.py
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
from
|
2
|
-
from .macos import NICDetectMacOS
|
3
|
-
from .bsd import NICDetectBSD
|
1
|
+
from ...pyhwException import OSUnsupportedException
|
4
2
|
|
5
3
|
|
6
4
|
class NICDetect:
|
@@ -16,10 +14,16 @@ class NICDetect:
|
|
16
14
|
:return: dataclass NICInfo, direct attr: nics
|
17
15
|
"""
|
18
16
|
if self.OS == "linux":
|
17
|
+
from .linux import NICDetectLinux
|
19
18
|
return NICDetectLinux().getNICInfo()
|
20
19
|
elif self.OS == "macos":
|
20
|
+
from .macos import NICDetectMacOS
|
21
21
|
return NICDetectMacOS().getNICInfo()
|
22
22
|
elif self.OS == "freebsd":
|
23
|
+
from .bsd import NICDetectBSD
|
23
24
|
return NICDetectBSD().getNICInfo()
|
25
|
+
elif self.OS == "windows":
|
26
|
+
from .windows import NICDetectWindows
|
27
|
+
return NICDetectWindows().getNICInfo()
|
24
28
|
else:
|
25
|
-
raise
|
29
|
+
raise OSUnsupportedException("Unsupported operating system")
|
@@ -0,0 +1,44 @@
|
|
1
|
+
import subprocess
|
2
|
+
from .nicInfo import NICInfo
|
3
|
+
from ...pyhwUtil import getArch
|
4
|
+
from ...pyhwException import BackendException
|
5
|
+
import pypci
|
6
|
+
import os
|
7
|
+
|
8
|
+
|
9
|
+
class NICDetectWindows:
|
10
|
+
def __init__(self):
|
11
|
+
self._nicInfo = NICInfo()
|
12
|
+
|
13
|
+
def getNICInfo(self):
|
14
|
+
self._getNICInfo()
|
15
|
+
self._sortNICList()
|
16
|
+
return self._nicInfo
|
17
|
+
|
18
|
+
def _getNICInfo(self):
|
19
|
+
nic_devices = pypci.PCI().FindAllNIC()
|
20
|
+
if len(nic_devices) == 0:
|
21
|
+
self.__handleNonePciDevices()
|
22
|
+
else:
|
23
|
+
for device in nic_devices:
|
24
|
+
if device.subsystem_device_name != "":
|
25
|
+
device_name = f"{device.vendor_name} {device.device_name} ({device.subsystem_device_name})"
|
26
|
+
else:
|
27
|
+
device_name = f"{device.vendor_name} {device.device_name}"
|
28
|
+
self._nicInfo.nics.append(self._nicNameClean(device_name))
|
29
|
+
self._nicInfo.number += 1
|
30
|
+
|
31
|
+
def __handleNonePciDevices(self):
|
32
|
+
# need to update
|
33
|
+
self._nicInfo.nics.append("Not found")
|
34
|
+
self._nicInfo.number = 1
|
35
|
+
|
36
|
+
@staticmethod
|
37
|
+
def _nicNameClean(nic_name: str):
|
38
|
+
nic_name_clean = nic_name.replace("Corporation ", "")
|
39
|
+
return nic_name_clean
|
40
|
+
|
41
|
+
def _sortNICList(self):
|
42
|
+
return self._nicInfo.nics.sort()
|
43
|
+
|
44
|
+
|
pyhw/backend/npu/linux.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
from .npuInfo import NPUInfo
|
2
2
|
import pypci
|
3
|
+
import os
|
3
4
|
|
4
5
|
|
5
6
|
class NPUDetectLinux:
|
@@ -25,9 +26,24 @@ class NPUDetectLinux:
|
|
25
26
|
self._npuInfo.number += 1
|
26
27
|
|
27
28
|
def _handleNonePciDevices(self):
|
29
|
+
if os.path.exists("/sys/firmware/devicetree/base/tpu/compatible"):
|
30
|
+
try:
|
31
|
+
with open("/sys/firmware/devicetree/base/tpu/compatible", "r") as f:
|
32
|
+
compatible = f.read().strip()
|
33
|
+
except FileNotFoundError:
|
34
|
+
compatible = ""
|
35
|
+
if "cvitek" in compatible:
|
36
|
+
model = compatible.split(",")[-1]
|
37
|
+
self._npuInfo.npus.append(f"Cvitek {model}")
|
38
|
+
self._npuInfo.number = 1
|
39
|
+
else:
|
40
|
+
pass
|
41
|
+
else:
|
42
|
+
pass
|
28
43
|
# Place Holder for unknown NPU
|
29
|
-
self._npuInfo.number
|
30
|
-
|
44
|
+
if self._npuInfo.number == 0:
|
45
|
+
self._npuInfo.number = 1
|
46
|
+
self._npuInfo.npus.append("Not found")
|
31
47
|
|
32
48
|
@staticmethod
|
33
49
|
def _npuNameClean(npu_name: str):
|
pyhw/backend/npu/npuBase.py
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
from
|
2
|
-
from .macos import NPUDetectMacOS
|
3
|
-
from .bsd import NPUDetectBSD
|
1
|
+
from ...pyhwException import OSUnsupportedException
|
4
2
|
|
5
3
|
|
6
4
|
class NPUDetect:
|
@@ -9,12 +7,16 @@ class NPUDetect:
|
|
9
7
|
|
10
8
|
def getNPUInfo(self):
|
11
9
|
if self.OS == "linux":
|
10
|
+
from .linux import NPUDetectLinux
|
12
11
|
return NPUDetectLinux().getNPUInfo()
|
13
12
|
elif self.OS == "macos":
|
13
|
+
from .macos import NPUDetectMacOS
|
14
14
|
return NPUDetectMacOS().getNPUInfo()
|
15
15
|
elif self.OS == "freebsd":
|
16
|
+
from .bsd import NPUDetectBSD
|
16
17
|
return NPUDetectBSD().getNPUInfo()
|
18
|
+
elif self.OS == "windows":
|
19
|
+
from .windows import NPUDetectWindows
|
20
|
+
return NPUDetectWindows().getNPUInfo()
|
17
21
|
else:
|
18
|
-
raise
|
19
|
-
|
20
|
-
|
22
|
+
raise OSUnsupportedException("Unsupported operating system")
|
@@ -0,0 +1,40 @@
|
|
1
|
+
from .npuInfo import NPUInfo
|
2
|
+
import pypci
|
3
|
+
|
4
|
+
|
5
|
+
class NPUDetectWindows:
|
6
|
+
def __init__(self):
|
7
|
+
self._npuInfo = NPUInfo()
|
8
|
+
|
9
|
+
def getNPUInfo(self):
|
10
|
+
self._getNPUInfo()
|
11
|
+
self._sortNPUList()
|
12
|
+
return self._npuInfo
|
13
|
+
|
14
|
+
def _getNPUInfo(self):
|
15
|
+
npu_devices = pypci.PCI().FindAllNPU()
|
16
|
+
if len(npu_devices) == 0:
|
17
|
+
self._handleNonePciDevices()
|
18
|
+
else:
|
19
|
+
for device in npu_devices:
|
20
|
+
if device.subsystem_device_name != "":
|
21
|
+
device_name = f"{device.vendor_name} {device.device_name} ({device.subsystem_device_name})"
|
22
|
+
else:
|
23
|
+
device_name = f"{device.vendor_name} {device.device_name}"
|
24
|
+
self._npuInfo.npus.append(self._npuNameClean(device_name))
|
25
|
+
self._npuInfo.number += 1
|
26
|
+
|
27
|
+
def _handleNonePciDevices(self):
|
28
|
+
# Place Holder for unknown NPU
|
29
|
+
self._npuInfo.number = 1
|
30
|
+
self._npuInfo.npus.append("Not found")
|
31
|
+
|
32
|
+
@staticmethod
|
33
|
+
def _npuNameClean(npu_name: str):
|
34
|
+
npu_name_clean = npu_name.replace("Corporation ", "")
|
35
|
+
return npu_name_clean
|
36
|
+
|
37
|
+
def _sortNPUList(self):
|
38
|
+
self._npuInfo.npus.sort()
|
39
|
+
|
40
|
+
|
pyhw/backend/os/osBase.py
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
from .linux import OSDetectLinux
|
2
|
-
from .macos import OSDetectMacOS
|
3
|
-
from .bsd import OSDetectBSD
|
4
1
|
from ...pyhwException import OSUnsupportedException
|
5
2
|
|
6
3
|
|
@@ -10,10 +7,16 @@ class OSDetect:
|
|
10
7
|
|
11
8
|
def getOSInfo(self):
|
12
9
|
if self.__OS == "linux":
|
10
|
+
from .linux import OSDetectLinux
|
13
11
|
return OSDetectLinux().getOSInfo()
|
14
12
|
elif self.__OS == "macos":
|
13
|
+
from .macos import OSDetectMacOS
|
15
14
|
return OSDetectMacOS().getOSInfo()
|
16
15
|
elif self.__OS == "freebsd":
|
16
|
+
from .bsd import OSDetectBSD
|
17
17
|
return OSDetectBSD().getOSInfo()
|
18
|
+
elif self.__OS == "windows":
|
19
|
+
from .windows import OSDetectWindows
|
20
|
+
return OSDetectWindows().getOSInfo()
|
18
21
|
else:
|
19
22
|
raise OSUnsupportedException("Unsupported operating system")
|
pyhw/backend/os/osInfo.py
CHANGED
@@ -3,7 +3,13 @@ from dataclasses import dataclass
|
|
3
3
|
|
4
4
|
@dataclass
|
5
5
|
class OSInfo:
|
6
|
+
"""
|
7
|
+
Dataclass to hold the OS information
|
8
|
+
"""
|
6
9
|
def __init__(self):
|
10
|
+
"""
|
11
|
+
Initialize the dataclass, prettyName and id attributes are required.
|
12
|
+
"""
|
7
13
|
self.prettyName = ""
|
8
14
|
self.name = ""
|
9
15
|
self.id = ""
|