pyhw 0.7.4__py3-none-any.whl → 0.8.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/windows.py +48 -0
- pyhw/backend/gpu/gpuBase.py +8 -4
- pyhw/backend/gpu/windows.py +41 -0
- pyhw/backend/host/hostBase.py +5 -5
- pyhw/backend/host/hostInfo.py +17 -8
- 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 +23 -1
- pyhw/backend/memory/memoryBase.py +8 -4
- pyhw/backend/memory/windows.py +36 -0
- pyhw/backend/nic/nicBase.py +8 -4
- pyhw/backend/nic/windows.py +44 -0
- 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 +35 -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 +10 -3
- {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/METADATA +6 -3
- {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/RECORD +45 -31
- {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/LICENSE +0 -0
- {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/WHEEL +0 -0
- {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/entry_points.txt +0 -0
- {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/top_level.txt +0 -0
pyhw/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = '0.
|
1
|
+
__version__ = '0.8.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")
|
@@ -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")
|
@@ -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/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,29 @@
|
|
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
|
+
self.__kernelInfo.kernel = f"{version} ({display}) {machine}"
|
19
|
+
return self.__kernelInfo
|
20
|
+
|
21
|
+
@staticmethod
|
22
|
+
def __get_windows_version():
|
23
|
+
try:
|
24
|
+
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")
|
25
|
+
display_version, _ = winreg.QueryValueEx(key, "DisplayVersion")
|
26
|
+
winreg.CloseKey(key)
|
27
|
+
return str(display_version)
|
28
|
+
except:
|
29
|
+
raise BackendException("Unable to determine Windows kernel version.")
|
@@ -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/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/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 = ""
|
@@ -0,0 +1,35 @@
|
|
1
|
+
from .osInfo import OSInfo
|
2
|
+
from ...pyhwException import BackendException
|
3
|
+
import platform
|
4
|
+
import winreg
|
5
|
+
|
6
|
+
|
7
|
+
class OSDetectWindows:
|
8
|
+
def __init__(self):
|
9
|
+
self._osInfo = OSInfo()
|
10
|
+
|
11
|
+
def getOSInfo(self):
|
12
|
+
system = platform.system()
|
13
|
+
release = platform.release()
|
14
|
+
edition = platform.win32_edition()
|
15
|
+
machine = platform.machine()
|
16
|
+
display = self.__get_windows_version()
|
17
|
+
self._osInfo.prettyName = f"{system} {release} {display} ({edition}) {machine}"
|
18
|
+
if release == "10":
|
19
|
+
self._osInfo.id = "windows_10"
|
20
|
+
elif release == "11":
|
21
|
+
self._osInfo.id = "windows_11"
|
22
|
+
else:
|
23
|
+
self._osInfo.id = "windows_old"
|
24
|
+
return self._osInfo
|
25
|
+
|
26
|
+
@staticmethod
|
27
|
+
def __get_windows_version():
|
28
|
+
try:
|
29
|
+
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")
|
30
|
+
display_version, _ = winreg.QueryValueEx(key, "DisplayVersion")
|
31
|
+
winreg.CloseKey(key)
|
32
|
+
return str(display_version)
|
33
|
+
except:
|
34
|
+
raise BackendException("Unable to determine Windows kernel version.")
|
35
|
+
|
pyhw/backend/shell/shellBase.py
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
from .unix import ShellDetectUnix
|
2
1
|
from ...pyhwException import OSUnsupportedException
|
3
2
|
|
4
3
|
|
@@ -8,6 +7,10 @@ class ShellDetect:
|
|
8
7
|
|
9
8
|
def getShellInfo(self):
|
10
9
|
if self.OS in ["linux", "macos", "freebsd"]:
|
10
|
+
from .unix import ShellDetectUnix
|
11
11
|
return ShellDetectUnix().getShellInfo()
|
12
|
+
elif self.OS == "windows":
|
13
|
+
from .windows import ShellDetectWindows
|
14
|
+
return ShellDetectWindows().getShellInfo()
|
12
15
|
else:
|
13
16
|
raise OSUnsupportedException("Unsupported operating system")
|
pyhw/backend/shell/unix.py
CHANGED
@@ -2,22 +2,14 @@
|
|
2
2
|
In dev.
|
3
3
|
"""
|
4
4
|
from ...pyhwUtil import getDocker
|
5
|
-
from
|
5
|
+
from .shellInfo import ShellInfo
|
6
6
|
import os
|
7
7
|
import subprocess
|
8
8
|
|
9
9
|
|
10
|
-
@dataclass
|
11
|
-
class ShellInfoUnix:
|
12
|
-
shell = ""
|
13
|
-
version = ""
|
14
|
-
path = ""
|
15
|
-
info = ""
|
16
|
-
|
17
|
-
|
18
10
|
class ShellDetectUnix:
|
19
11
|
def __init__(self):
|
20
|
-
self.__shellInfo =
|
12
|
+
self.__shellInfo = ShellInfo()
|
21
13
|
|
22
14
|
def getShellInfo(self):
|
23
15
|
if getDocker():
|
@@ -0,0 +1,29 @@
|
|
1
|
+
"""
|
2
|
+
In dev.
|
3
|
+
"""
|
4
|
+
from ...pyhwException import BackendException
|
5
|
+
from .shellInfo import ShellInfo
|
6
|
+
import json
|
7
|
+
import subprocess
|
8
|
+
|
9
|
+
|
10
|
+
class ShellDetectWindows:
|
11
|
+
def __init__(self):
|
12
|
+
self.__shellInfo = ShellInfo()
|
13
|
+
|
14
|
+
def getShellInfo(self):
|
15
|
+
COMMAND = "$PSVersionTable.PSVersion | ConvertTo-JSON"
|
16
|
+
|
17
|
+
try:
|
18
|
+
result = subprocess.run(["powershell", "-NoProfile", "-Command", COMMAND], capture_output=True, text=True)
|
19
|
+
except subprocess.SubprocessError:
|
20
|
+
raise BackendException("Error running PowerShell command.")
|
21
|
+
|
22
|
+
res = json.loads(result.stdout)
|
23
|
+
major = res["Major"]
|
24
|
+
minor = res["Minor"]
|
25
|
+
|
26
|
+
self.__shellInfo.shell = "PowerShell"
|
27
|
+
self.__shellInfo.version = f"{major}.{minor}"
|
28
|
+
self.__shellInfo.info = f"PowerShell {major}.{minor}"
|
29
|
+
return self.__shellInfo
|
pyhw/backend/title/titleBase.py
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
from .unix import TitleDetectUnix
|
2
|
-
from .windows import TitleDetectWindows
|
3
1
|
from ...pyhwException import OSUnsupportedException
|
4
2
|
|
5
3
|
|
@@ -9,8 +7,10 @@ class TitleDetect:
|
|
9
7
|
|
10
8
|
def getTitle(self):
|
11
9
|
if self.OS in ["linux", "macos", "freebsd"]:
|
10
|
+
from .unix import TitleDetectUnix
|
12
11
|
return TitleDetectUnix().getTitle()
|
13
12
|
elif self.OS == "windows":
|
13
|
+
from .windows import TitleDetectWindows
|
14
14
|
return TitleDetectWindows().getTitle()
|
15
15
|
else:
|
16
16
|
raise OSUnsupportedException("Unsupported operating system")
|
pyhw/backend/title/unix.py
CHANGED
@@ -2,19 +2,12 @@
|
|
2
2
|
In dev.
|
3
3
|
"""
|
4
4
|
import subprocess
|
5
|
-
from
|
6
|
-
|
7
|
-
|
8
|
-
@dataclass
|
9
|
-
class TitleInfoUnix:
|
10
|
-
username = ""
|
11
|
-
hostname = ""
|
12
|
-
title = ""
|
5
|
+
from .titleInfo import TitleInfo
|
13
6
|
|
14
7
|
|
15
8
|
class TitleDetectUnix:
|
16
9
|
def __init__(self):
|
17
|
-
self.__titleInfo =
|
10
|
+
self.__titleInfo = TitleInfo()
|
18
11
|
|
19
12
|
def getTitle(self):
|
20
13
|
self.__getTitle()
|
pyhw/backend/title/windows.py
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
"""
|
2
2
|
In dev.
|
3
3
|
"""
|
4
|
+
from .titleInfo import TitleInfo
|
5
|
+
import getpass
|
6
|
+
import platform
|
4
7
|
|
5
8
|
|
6
9
|
class TitleDetectWindows:
|
10
|
+
def __init__(self):
|
11
|
+
self.__titleInfo = TitleInfo()
|
12
|
+
|
7
13
|
def getTitle(self):
|
8
|
-
|
14
|
+
self.__titleInfo.username = getpass.getuser()
|
15
|
+
self.__titleInfo.hostname = platform.node()
|
16
|
+
self.__titleInfo.title = f"{self.__titleInfo.username}@{self.__titleInfo.hostname}"
|
17
|
+
return self.__titleInfo
|
pyhw/backend/uptime/linux.py
CHANGED
@@ -24,8 +24,8 @@ class UptimeDetectLinux:
|
|
24
24
|
seconds = int(seconds)
|
25
25
|
if days == 0:
|
26
26
|
if hours == 0:
|
27
|
-
self.__uptimeInfo.uptime = f"{minutes}
|
27
|
+
self.__uptimeInfo.uptime = f"{minutes} mins {seconds} secs"
|
28
28
|
else:
|
29
|
-
self.__uptimeInfo.uptime = f"{hours} hours {minutes}
|
29
|
+
self.__uptimeInfo.uptime = f"{hours} hours {minutes} mins {seconds} secs"
|
30
30
|
else:
|
31
|
-
self.__uptimeInfo.uptime = f"{days} days {hours} hours {minutes}
|
31
|
+
self.__uptimeInfo.uptime = f"{days} days {hours} hours {minutes} mins {seconds} secs"
|
pyhw/backend/uptime/macos.py
CHANGED
@@ -22,11 +22,11 @@ class UptimeDetectMacOS:
|
|
22
22
|
seconds = int(seconds)
|
23
23
|
if days == 0:
|
24
24
|
if hours == 0:
|
25
|
-
self._uptimeInfo.uptime = f"{minutes}
|
25
|
+
self._uptimeInfo.uptime = f"{minutes} mins {seconds} secs"
|
26
26
|
else:
|
27
|
-
self._uptimeInfo.uptime = f"{hours} hours {minutes}
|
27
|
+
self._uptimeInfo.uptime = f"{hours} hours {minutes} mins {seconds} secs"
|
28
28
|
else:
|
29
|
-
self._uptimeInfo.uptime = f"{days} days {hours} hours {minutes}
|
29
|
+
self._uptimeInfo.uptime = f"{days} days {hours} hours {minutes} mins {seconds} secs"
|
30
30
|
return self._uptimeInfo
|
31
31
|
|
32
32
|
def _getUptime(self):
|
@@ -1,6 +1,3 @@
|
|
1
|
-
from .linux import UptimeDetectLinux
|
2
|
-
from .macos import UptimeDetectMacOS
|
3
|
-
from .bsd import UptimeDetectBSD
|
4
1
|
from ...pyhwException import OSUnsupportedException
|
5
2
|
|
6
3
|
|
@@ -17,10 +14,16 @@ class UptimeDetect:
|
|
17
14
|
:return: dataclass UptimeInfo, direct attr: uptime
|
18
15
|
"""
|
19
16
|
if self.OS == "linux":
|
17
|
+
from .linux import UptimeDetectLinux
|
20
18
|
return UptimeDetectLinux().getUptimeInfo()
|
21
19
|
elif self.OS == "macos":
|
20
|
+
from .macos import UptimeDetectMacOS
|
22
21
|
return UptimeDetectMacOS().getUptimeInfo()
|
23
22
|
elif self.OS == "freebsd":
|
23
|
+
from .bsd import UptimeDetectBSD
|
24
24
|
return UptimeDetectBSD().getUptimeInfo()
|
25
|
+
elif self.OS == "windows":
|
26
|
+
from .windows import UptimeDetectWindows
|
27
|
+
return UptimeDetectWindows().getUptimeInfo()
|
25
28
|
else:
|
26
29
|
raise OSUnsupportedException("Unsupported operating system")
|
@@ -0,0 +1,49 @@
|
|
1
|
+
from ...pyhwException import BackendException
|
2
|
+
from .uptimeInfo import UptimeInfo
|
3
|
+
import subprocess
|
4
|
+
import json
|
5
|
+
import re
|
6
|
+
from datetime import datetime
|
7
|
+
|
8
|
+
|
9
|
+
class UptimeDetectWindows:
|
10
|
+
def __init__(self):
|
11
|
+
self.__uptimeInfo = UptimeInfo()
|
12
|
+
|
13
|
+
def getUptimeInfo(self):
|
14
|
+
self.__getUptime()
|
15
|
+
return self.__uptimeInfo
|
16
|
+
|
17
|
+
def __getUptime(self):
|
18
|
+
COMMAND = 'Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object LastBootUpTime | ConvertTo-JSON'
|
19
|
+
try:
|
20
|
+
result = subprocess.run(["powershell", "-NoProfile", "-Command", COMMAND], capture_output=True, text=True)
|
21
|
+
except subprocess.SubprocessError:
|
22
|
+
raise BackendException("Error while getting system uptime")
|
23
|
+
|
24
|
+
res = json.loads(result.stdout)
|
25
|
+
timestamp_str = res['LastBootUpTime']
|
26
|
+
match = re.search(r'\d+', timestamp_str)
|
27
|
+
|
28
|
+
if match:
|
29
|
+
timestamp_ms = int(match.group(0))
|
30
|
+
last_boot_time = datetime.utcfromtimestamp(timestamp_ms / 1000)
|
31
|
+
current_time = datetime.utcnow()
|
32
|
+
uptime = current_time - last_boot_time
|
33
|
+
days = uptime.days
|
34
|
+
seconds = uptime.seconds
|
35
|
+
hours = seconds // 3600
|
36
|
+
minutes = (seconds % 3600) // 60
|
37
|
+
secs = (seconds % 3600) % 60
|
38
|
+
|
39
|
+
if days == 0:
|
40
|
+
if hours == 0:
|
41
|
+
self.__uptimeInfo.uptime = f"{minutes} mins {secs} secs"
|
42
|
+
else:
|
43
|
+
self.__uptimeInfo.uptime = f"{hours} hours {minutes} mins {secs} secs"
|
44
|
+
else:
|
45
|
+
self.__uptimeInfo.uptime = f"{days} days {hours} hours {minutes} mins {secs} secs"
|
46
|
+
else:
|
47
|
+
raise BackendException("Error while getting system uptime")
|
48
|
+
|
49
|
+
|
@@ -33,6 +33,14 @@ class ColorConfigSet:
|
|
33
33
|
return ColorConfigSetC.centos
|
34
34
|
elif self.__os_name == "freebsd":
|
35
35
|
return ColorConfigSetF.freebsd
|
36
|
+
elif self.__os_name == "windows_old":
|
37
|
+
return ColorConfigSetW.windows_old
|
38
|
+
elif self.__os_name == "windows_10":
|
39
|
+
return ColorConfigSetW.windows_10
|
40
|
+
elif self.__os_name == "windows_11":
|
41
|
+
return ColorConfigSetW.windows_11
|
42
|
+
elif self.__os_name == "windows_2025":
|
43
|
+
return ColorConfigSetW.windows_2025
|
36
44
|
else:
|
37
45
|
return ColorConfigSetL.linux # default to Linux
|
38
46
|
|
@@ -176,3 +184,47 @@ class ColorConfigSetU:
|
|
176
184
|
"colorKeys": ColorSet.COLOR_FG_RED,
|
177
185
|
"colorTitle": ColorSet.COLOR_FG_RED
|
178
186
|
}
|
187
|
+
|
188
|
+
|
189
|
+
@dataclass
|
190
|
+
class ColorConfigSetW:
|
191
|
+
windows_old = {
|
192
|
+
"colors": [
|
193
|
+
ColorSet.COLOR_FG_RED,
|
194
|
+
ColorSet.COLOR_FG_GREEN,
|
195
|
+
ColorSet.COLOR_FG_BLUE,
|
196
|
+
ColorSet.COLOR_FG_YELLOW
|
197
|
+
],
|
198
|
+
"colorKeys": ColorSet.COLOR_FG_BLUE,
|
199
|
+
"colorTitle": ColorSet.COLOR_FG_GREEN
|
200
|
+
}
|
201
|
+
windows_10 = {
|
202
|
+
"colors": [
|
203
|
+
ColorSet.COLOR_FG_CYAN,
|
204
|
+
ColorSet.COLOR_FG_CYAN,
|
205
|
+
ColorSet.COLOR_FG_CYAN,
|
206
|
+
ColorSet.COLOR_FG_CYAN
|
207
|
+
],
|
208
|
+
"colorKeys": ColorSet.COLOR_FG_YELLOW,
|
209
|
+
"colorTitle": ColorSet.COLOR_FG_GREEN
|
210
|
+
}
|
211
|
+
windows_11 = {
|
212
|
+
"colors": [
|
213
|
+
ColorSet.COLOR_FG_BLUE,
|
214
|
+
ColorSet.COLOR_FG_BLUE,
|
215
|
+
ColorSet.COLOR_FG_BLUE,
|
216
|
+
ColorSet.COLOR_FG_BLUE
|
217
|
+
],
|
218
|
+
"colorKeys": ColorSet.COLOR_FG_YELLOW,
|
219
|
+
"colorTitle": ColorSet.COLOR_FG_CYAN
|
220
|
+
}
|
221
|
+
windows_2025 = {
|
222
|
+
"colors": [
|
223
|
+
ColorSet.COLOR_FG_BLUE,
|
224
|
+
ColorSet.COLOR_FG_BLUE,
|
225
|
+
ColorSet.COLOR_FG_BLUE,
|
226
|
+
ColorSet.COLOR_FG_BLUE
|
227
|
+
],
|
228
|
+
"colorKeys": ColorSet.COLOR_FG_YELLOW,
|
229
|
+
"colorTitle": ColorSet.COLOR_FG_CYAN
|
230
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
$2..,
|
2
|
+
....,,:;+ccllll
|
3
|
+
$1 ...,,+:; $2cllllllllllllllllll
|
4
|
+
$1,cclllllllllll $2lllllllllllllllllll
|
5
|
+
$1llllllllllllll $2lllllllllllllllllll
|
6
|
+
$1llllllllllllll $2lllllllllllllllllll
|
7
|
+
$1llllllllllllll $2lllllllllllllllllll
|
8
|
+
$1llllllllllllll $2lllllllllllllllllll
|
9
|
+
$1llllllllllllll $2lllllllllllllllllll
|
10
|
+
|
11
|
+
$3llllllllllllll $4lllllllllllllllllll
|
12
|
+
$3llllllllllllll $4lllllllllllllllllll
|
13
|
+
$3llllllllllllll $4lllllllllllllllllll
|
14
|
+
$3llllllllllllll $4lllllllllllllllllll
|
15
|
+
$3llllllllllllll $4lllllllllllllllllll
|
16
|
+
$3`'ccllllllllll $4lllllllllllllllllll
|
17
|
+
$3 `' \*:: $4:ccllllllllllllllll
|
18
|
+
````''*::cll
|
19
|
+
``
|
@@ -0,0 +1,17 @@
|
|
1
|
+
$1///////////////// $2/////////////////
|
2
|
+
$1///////////////// $2/////////////////
|
3
|
+
$1///////////////// $2/////////////////
|
4
|
+
$1///////////////// $2/////////////////
|
5
|
+
$1///////////////// $2/////////////////
|
6
|
+
$1///////////////// $2/////////////////
|
7
|
+
$1///////////////// $2/////////////////
|
8
|
+
$1///////////////// $2/////////////////
|
9
|
+
|
10
|
+
$3///////////////// $4/////////////////
|
11
|
+
$3///////////////// $4/////////////////
|
12
|
+
$3///////////////// $4/////////////////
|
13
|
+
$3///////////////// $4/////////////////
|
14
|
+
$3///////////////// $4/////////////////
|
15
|
+
$3///////////////// $4/////////////////
|
16
|
+
$3///////////////// $4/////////////////
|
17
|
+
$3///////////////// $4/////////////////
|
@@ -0,0 +1,17 @@
|
|
1
|
+
$1 ##%%%%%%%%% $2%%%%%%%%%##
|
2
|
+
$1 ###%%%%%%%%%% $2%%%%%%%%%%###
|
3
|
+
$1 ####%%%%%%%%%%% $2%%%%%%%%%%%####
|
4
|
+
$1 ##%%%%%%%%%%%%%% $2%%%%%%%%%%%%%%##
|
5
|
+
$1#%%%%%%%%%%%%%%%% $2%%%%%%%%%%%%%%%%#
|
6
|
+
$1%%%%%%%%%%%%%%%%% $2%%%%%%%%%%%%%%%%%
|
7
|
+
$1%%%%%%%%%%%%%%%%% $2%%%%%%%%%%%%%%%%%
|
8
|
+
$1%%%%%%%%%%%%%%%%% $2#%%%%%%%%%%%%%%%%
|
9
|
+
|
10
|
+
$3%%%%%%%%%%%%%%%%% $4#%%%%%%%%%%%%%%%%
|
11
|
+
$3%%%%%%%%%%%%%%%%% $4%%%%%%%%%%%%%%%%%
|
12
|
+
$3%%%%%%%%%%%%%%%%% $4%%%%%%%%%%%%%%%%%
|
13
|
+
$3%%%%%%%%%%%%%%%%% $4%%%%%%%%%%%%%%%%#
|
14
|
+
$3 ###%%%%%%%%%%%%% $4%%%%%%%%%%%%%%%##
|
15
|
+
$3 ####%%%%%%%%%%% $4%%%%%%%%%%%#%####
|
16
|
+
$3 ##%#%%%%%%%%% $4%%%%%%%%%%%######
|
17
|
+
$3 ##%%%%%%%%% $4%%%%%%%%%########
|
@@ -0,0 +1,16 @@
|
|
1
|
+
$1 ,.=:!!t3Z3z.,
|
2
|
+
:tt:::tt333EE3
|
3
|
+
$1 Et:::ztt33EEEL$2 @Ee., ..,
|
4
|
+
$1 ;tt:::tt333EE7$2 ;EEEEEEttttt33#
|
5
|
+
$1 :Et:::zt333EEQ.$2 $EEEEEttttt33QL
|
6
|
+
$1 it::::tt333EEF$2 @EEEEEEttttt33F
|
7
|
+
$1 ;3=*^```"*4EEV$2 :EEEEEEttttt33@.
|
8
|
+
$3 ,.=::::!t=., $1`$2 @EEEEEEtttz33QF
|
9
|
+
$3 ;::::::::zt33)$2 "4EEEtttji3P*
|
10
|
+
$3 :t::::::::tt33.$4:Z3z..$2 ``$4 ,..g.
|
11
|
+
$3 i::::::::zt33F$4 AEEEtttt::::ztF
|
12
|
+
$3 ;:::::::::t33V$4 ;EEEttttt::::t3
|
13
|
+
$3 E::::::::zt33L$4 @EEEtttt::::z3F
|
14
|
+
$3{3=*^```"*4E3)$4 ;EEEtttt:::::tZ`
|
15
|
+
$3 `$4 :EEEEtttt::::z7
|
16
|
+
"VEzjt:;;z>*`
|
pyhw/pyhwUtil/pyhwUtil.py
CHANGED
@@ -173,8 +173,10 @@ def createDataStringOld(data: Data):
|
|
173
173
|
|
174
174
|
@dataclass
|
175
175
|
class SupportedOS:
|
176
|
-
ColorConfig = ["armbian", "arch", "alpine", "centos", "debian", "fedora", "macOS", "raspbian", "ubuntu", "freebsd"
|
177
|
-
|
176
|
+
ColorConfig = ["armbian", "arch", "alpine", "centos", "debian", "fedora", "macOS", "raspbian", "ubuntu", "freebsd",
|
177
|
+
"windows_old", "windows_10", "windows_11", "windows_2025"]
|
178
|
+
AsciiLogo = ["armbian", "arch", "alpine", "centos", "debian", "fedora", "macOS", "raspbian", "ubuntu", "freebsd",
|
179
|
+
"windows_old", "windows_10", "windows_11", "windows_2025"]
|
178
180
|
|
179
181
|
|
180
182
|
def selectOSLogo(os_id: str):
|
@@ -183,8 +185,13 @@ def selectOSLogo(os_id: str):
|
|
183
185
|
:param os_id: str, os id.
|
184
186
|
:return: str, logo id.
|
185
187
|
"""
|
186
|
-
if getOS() == "macos":
|
188
|
+
if getOS() == "macos": # macOS does not have small logo
|
187
189
|
return os_id
|
190
|
+
if getOS() == "windows": # windows does not have small logo
|
191
|
+
if os_id in SupportedOS.ColorConfig and os_id in SupportedOS.AsciiLogo:
|
192
|
+
return os_id
|
193
|
+
else:
|
194
|
+
return "windows_11"
|
188
195
|
if os_id in SupportedOS.ColorConfig and os_id in SupportedOS.AsciiLogo:
|
189
196
|
pass
|
190
197
|
else:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: pyhw
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.8.0
|
4
4
|
Summary: PyHw, a neofetch-like command line tool for fetching system information but written mostly in python.
|
5
5
|
Author-email: Xiao Ran <xiaoran.007@icloud.com>
|
6
6
|
License: BSD-3-Clause
|
@@ -13,21 +13,23 @@ Classifier: Operating System :: OS Independent
|
|
13
13
|
Requires-Python: >=3.9
|
14
14
|
Description-Content-Type: text/markdown
|
15
15
|
License-File: LICENSE
|
16
|
-
Requires-Dist: pypci-ng>=0.
|
16
|
+
Requires-Dist: pypci-ng>=0.1.2
|
17
17
|
|
18
18
|
# PyHw
|
19
19
|
[](https://pepy.tech/project/pyhw)
|
20
20
|

|
21
|
+

|
21
22
|
|
22
23
|

|
23
24
|

|
24
25
|

|
26
|
+

|
25
27
|
|
26
28
|

|
27
29
|

|
28
30
|
|
29
31
|
|
30
|
-
PyHw, a neofetch-like command line tool for fetching system information but written mostly in Python. **Currently, this project is still in the initial stage, only Linux, macOS, and
|
32
|
+
PyHw, a neofetch-like command line tool for fetching system information but written mostly in Python. **Currently, this project is still in the initial stage, only Linux, macOS, FreeBSD and Windows are supported.**
|
31
33
|
|
32
34
|
This project is a Python reimplementation of [neofetch](https://github.com/dylanaraps/neofetch) and references the [fastfetch](https://github.com/fastfetch-cli/fastfetch) project for logo style settings. Since this project is implemented in Python, it will be easier to maintain and extend than bash and c implementation. Also, this project only relies on the Python standard library, so you can run it on any device that has a Python environment (I hope so 🤔).
|
33
35
|
|
@@ -96,6 +98,7 @@ This is due to the fact that system python is not supposed to be managed by pip.
|
|
96
98
|
* macOS arm64, x86_64
|
97
99
|
* Linux arm64, x86_64
|
98
100
|
* FreeBSD arm64
|
101
|
+
* Windows 10 X86_64
|
99
102
|
|
100
103
|
## Add Logo
|
101
104
|
1. Create a file named **\<os>.pyhw** in **logo/ascii** folder
|
@@ -1,73 +1,83 @@
|
|
1
|
-
pyhw/__init__.py,sha256=
|
2
|
-
pyhw/__main__.py,sha256=
|
1
|
+
pyhw/__init__.py,sha256=27YY3zFpeaDh6JoC40AqkjBrn68SqFlsWZzjZtw5jwU,22
|
2
|
+
pyhw/__main__.py,sha256=AYSSricHPScjYNF-LgFHfQUqKcxq8FruDW2a89FAXfA,1795
|
3
3
|
pyhw/backend/__init__.py,sha256=knn_3Yroow1h0dqdrozk3zyy3vz-kQyNBRjR6OLmVoY,50
|
4
4
|
pyhw/backend/backendBase.py,sha256=mloo8mPEbgbIdmyQ3I4vdEXMSSjxWi_wnwACmzvHbEo,506
|
5
5
|
pyhw/backend/cpu/__init__.py,sha256=5YfANJVRwNwTRodG0ENOgusrdN592aaSnfq5ok4dKTo,56
|
6
6
|
pyhw/backend/cpu/bsd.py,sha256=Ls97NAsvZGVJj3_fBUcYXjY2gsZvFKhXYtkTHxVVXSs,288
|
7
|
-
pyhw/backend/cpu/cpuBase.py,sha256=
|
7
|
+
pyhw/backend/cpu/cpuBase.py,sha256=2YAOz1K8VLKtLY7iYBxUV9Ikuf4I4d4YivocvZDrdUU,748
|
8
8
|
pyhw/backend/cpu/cpuInfo.py,sha256=A_nNGElq9W7oZ5DFJowLdFBE0ZvXKr5h29E6TGAvbRc,251
|
9
9
|
pyhw/backend/cpu/linux.py,sha256=zJ2cOwQHtolJrMMY1WXVbLLIRNPxeClUgzLAAkd7As4,3346
|
10
10
|
pyhw/backend/cpu/macos.py,sha256=pacU-yT7q-HKerkh2Q0BSdzSY6dKzHfSnRZBmimqqXk,2953
|
11
|
+
pyhw/backend/cpu/windows.py,sha256=A3oIvVUVMGPEqiM9QBiK0OwElcEf1LDhNi_23AimooQ,1723
|
11
12
|
pyhw/backend/gpu/__init__.py,sha256=EpMjPvUaXt0LTNMvGmB8WgXbUB9keCxuOhu8NT3Re6o,56
|
12
13
|
pyhw/backend/gpu/bsd.py,sha256=hNFiCek770CXOh3DK3I3-g272-a1S5D7LolGJBsLXaU,124
|
13
|
-
pyhw/backend/gpu/gpuBase.py,sha256=
|
14
|
+
pyhw/backend/gpu/gpuBase.py,sha256=ZPT9o7PhYpzlwign0GsCT519F9DGx-1UEMVVOM8MV_k,748
|
14
15
|
pyhw/backend/gpu/gpuInfo.py,sha256=d_z_z5DiZAg85wP0VOBQEU0QHdaK3qFqA2Tp9Eq8-Zs,133
|
15
16
|
pyhw/backend/gpu/linux.py,sha256=E-evoL-spQbHB8JvbZXSq5ypc2SeePVUPnhEQrSPQpg,1619
|
16
17
|
pyhw/backend/gpu/macos.py,sha256=SmTqqTrIMRW-GVPmDs8xAiOX7HsCjrGh9qkxLQCdvO8,3850
|
18
|
+
pyhw/backend/gpu/windows.py,sha256=Hv-vtWQGKv6_Nxc8raEBq7NNm5TR6xg6x6BK3Aa2uP4,1249
|
17
19
|
pyhw/backend/host/__init__.py,sha256=Efaj7-Oya7H8HdpZHQCLrwn-mcfPb-d6yfh4dzsE_7I,58
|
18
20
|
pyhw/backend/host/bsd.py,sha256=9gKnM6yysHBKwS3EQvb0pCeylh3dzHvoEuPe14zo9wQ,382
|
19
|
-
pyhw/backend/host/hostBase.py,sha256=
|
20
|
-
pyhw/backend/host/hostInfo.py,sha256=
|
21
|
+
pyhw/backend/host/hostBase.py,sha256=gM49SY6rEaxec_0bUOMk7QlEfR7vjfWp3BXEUqgdncc,762
|
22
|
+
pyhw/backend/host/hostInfo.py,sha256=grz15M2t3f_enqQvc7Qn6HlEfYwa66bu2NYvm8VpJ-g,452
|
21
23
|
pyhw/backend/host/linux.py,sha256=vGIl1b61vB-uilPk6awPOIWRaxnIsR43L20sNHeM5bI,2824
|
22
24
|
pyhw/backend/host/macos.py,sha256=KW-EJK9g1xHNrFsVxJv5GPLpc_ZevX0Zv1WjZUzRkzo,15369
|
23
|
-
pyhw/backend/host/windows.py,sha256=
|
25
|
+
pyhw/backend/host/windows.py,sha256=qn2QiTK2wIijyyw_QKdiSizY3teyS-9RNBu5RxEPRSw,1185
|
24
26
|
pyhw/backend/kernel/__init__.py,sha256=fGjwjpOhwA_PnsWbwoq102hwhTay2ufYKaTqxjSV2-I,65
|
25
|
-
pyhw/backend/kernel/kernelBase.py,sha256=
|
26
|
-
pyhw/backend/kernel/kernelInfo.py,sha256=
|
27
|
+
pyhw/backend/kernel/kernelBase.py,sha256=3ZmkRkvwoWk3R-by2cgBlZnMSQzVjTC8Owmv53Pm4II,539
|
28
|
+
pyhw/backend/kernel/kernelInfo.py,sha256=Nkumd0McbimCjc7yJrvz6bcwpWu1Tdo_LKomjZr7Jgk,341
|
27
29
|
pyhw/backend/kernel/unix.py,sha256=XDV2GIjamERcmlrQFaKFZY-OJO1xj76Im_7lmg2uFzo,1192
|
28
|
-
pyhw/backend/kernel/windows.py,sha256=
|
30
|
+
pyhw/backend/kernel/windows.py,sha256=RY0Cwwn_eJP4iP43gHLjcQzhwwdU4yc2NGLDajbmtvI,900
|
29
31
|
pyhw/backend/memory/__init__.py,sha256=zGBWxfPAAk8ivCBWPLJIpuD-lB7wUJT3x8u2jHiAoCY,65
|
30
32
|
pyhw/backend/memory/bsd.py,sha256=GKTCs6RocdoWj-5ZZRMB4xAWGWljor6leuwX-L-7bW0,251
|
31
33
|
pyhw/backend/memory/linux.py,sha256=kxP0LxXdTWYRtu9nDyKqZeIzZrQI84kVOPMeN1GwSOo,917
|
32
34
|
pyhw/backend/memory/macos.py,sha256=ur2HxmmmVkXmaxEcw_otphifVp_csfNMJdgt-idCq7M,2770
|
33
|
-
pyhw/backend/memory/memoryBase.py,sha256=
|
35
|
+
pyhw/backend/memory/memoryBase.py,sha256=trubcJ_7JD_FnrKefUycPFd4OZMFj3Rk75ih5YVsSXg,790
|
34
36
|
pyhw/backend/memory/memoryInfo.py,sha256=OQF165uEyuapAsi7cKacQYDRnKdrQHeldfyFwzS9N2g,186
|
37
|
+
pyhw/backend/memory/windows.py,sha256=T_yWJCu-joWvXXuaIgnMRGaDtsp-frQD_cx8IFVgdpA,1208
|
35
38
|
pyhw/backend/metal/t.py,sha256=52yv-JoXNfaIOfcxEEidIg0MoyFtzWvTRm550kQKPZA,391
|
36
39
|
pyhw/backend/nic/__init__.py,sha256=eP4eOYIvMF3LcTf954hJa6TnB8R4Qahss2g-UcgypKY,57
|
37
40
|
pyhw/backend/nic/bsd.py,sha256=lIXnPqzSA2qexUt0P9OHMmxoI5c5XBi2V80RY9S0wsM,135
|
38
41
|
pyhw/backend/nic/linux.py,sha256=3H91Nw87frzZA4P6Q5GbjHSaI7q4Q5-v6R8BgdvplgQ,1976
|
39
42
|
pyhw/backend/nic/macos.py,sha256=63gZjSmUGwGqfs41IWrEXmSz9O8eQy4G5oql3JLZmoo,855
|
40
|
-
pyhw/backend/nic/nicBase.py,sha256=
|
43
|
+
pyhw/backend/nic/nicBase.py,sha256=Kng5qoe7FHcnQaf6S-LUe_HyOaBJe0L1SVstdIQ_WJY,962
|
41
44
|
pyhw/backend/nic/nicInfo.py,sha256=wuBuL-aIzD441IUDPGz5e0xctcZ-opdpgqkVxgbvZLg,133
|
45
|
+
pyhw/backend/nic/windows.py,sha256=c67JwHARtPxNsZ-0_MVKUfc7DwpsRVn7kiHdx_NyDn8,1297
|
42
46
|
pyhw/backend/npu/__init__.py,sha256=PgLKbwpgT5vw9xpa294Zxb94McyxNXW46_vMbT2Iqyc,58
|
43
47
|
pyhw/backend/npu/bsd.py,sha256=eKkOWZ4MBybR_KOGGcsWUpzCGgghhvuBy5VNsnEE8cI,134
|
44
48
|
pyhw/backend/npu/linux.py,sha256=mXHSYRION3pghwk6_4vgHxjSkNxI68ksGLkFZstR0mc,1192
|
45
49
|
pyhw/backend/npu/macos.py,sha256=c-iSmGfBWYeoh7nXuCFmPlVH6bc6sil_yRsAlabl93k,2513
|
46
|
-
pyhw/backend/npu/npuBase.py,sha256=
|
50
|
+
pyhw/backend/npu/npuBase.py,sha256=1cVWRmr8g-mDXrJAx2cUO4qWZft2TtT7L2-HzRot2nI,748
|
47
51
|
pyhw/backend/npu/npuInfo.py,sha256=82dK6XvW_XKw4O5-RfR4-qQRR7Plh8qqJLj0YDzISmU,135
|
52
|
+
pyhw/backend/npu/windows.py,sha256=Z2v5CORSa1ap66k48G7uVLbon3zaoT4ug5sX2_rt6vM,1196
|
48
53
|
pyhw/backend/os/__init__.py,sha256=rPHQYdQK3qU6ZwwodqVoEWeqBnKffXlJyi4k3-8ViPY,53
|
49
54
|
pyhw/backend/os/bsd.py,sha256=5Q30mkFKdhuup1dRjTEVN58MEGcj7JzbUzh40ld6C14,131
|
50
55
|
pyhw/backend/os/linux.py,sha256=U7dIOKZaG5MSw0S65hAfDfFaBMvbwSCHFIHTwckU9iI,1957
|
51
56
|
pyhw/backend/os/macos.py,sha256=DwgpwRD1a2oTANR_XL3kkMzNawqrt23F79dqBw3ULK8,1906
|
52
|
-
pyhw/backend/os/osBase.py,sha256=
|
53
|
-
pyhw/backend/os/osInfo.py,sha256=
|
57
|
+
pyhw/backend/os/osBase.py,sha256=2zaOGhaXLrNJS9-9qR4hH9_uFTgA2Sv4ab7YZvNVFaE,744
|
58
|
+
pyhw/backend/os/osInfo.py,sha256=NEr76aicI9N3SFrwi1skcpUEjzsyCryTjdE9X1nBjBM,536
|
59
|
+
pyhw/backend/os/windows.py,sha256=WyUhkO9loIqwiZ_ezI6J2JHL4A2xzQAuTzkO1ZOStr4,1149
|
54
60
|
pyhw/backend/shell/__init__.py,sha256=SeQ7OLNSl_V1JCCWnJGjLilAWiSe9e5kgsMEt63TMS0,62
|
55
|
-
pyhw/backend/shell/shellBase.py,sha256=
|
56
|
-
pyhw/backend/shell/
|
61
|
+
pyhw/backend/shell/shellBase.py,sha256=829rchiqXfyA-oKT81mkGGoKBjZflM5NHIRs0_ZSwaY,531
|
62
|
+
pyhw/backend/shell/shellInfo.py,sha256=pU32_Akg0TDVFprTfPYaOKWcFkijJkm0FOowfILNRKk,184
|
63
|
+
pyhw/backend/shell/unix.py,sha256=qTP3Mk8prI2lnQmUJ41G1Fgu1l8nGn9PB3pyBoewtJg,2010
|
64
|
+
pyhw/backend/shell/windows.py,sha256=_Ou4QFkS-_K8xMjxw9X3N0t5duZCa3LnMhft_aiPuE0,854
|
57
65
|
pyhw/backend/title/__init__.py,sha256=l6_WqreSBeK7krapCrbrr4ndnydrXB1aZ50Ve-beV_w,62
|
58
|
-
pyhw/backend/title/titleBase.py,sha256=
|
59
|
-
pyhw/backend/title/
|
60
|
-
pyhw/backend/title/
|
66
|
+
pyhw/backend/title/titleBase.py,sha256=RVWwtTea8G1MutrN3Ttkjky9wwVtRxnHIsOJKpBbvF8,519
|
67
|
+
pyhw/backend/title/titleInfo.py,sha256=lUsbQNx80MLHuSCgMzWhc72mj0ykcRuWngn9wydYSos,166
|
68
|
+
pyhw/backend/title/unix.py,sha256=XEjPbnbygxs1qDv79kdaGHFGU_8elW7Q2kvpbYWo0P8,747
|
69
|
+
pyhw/backend/title/windows.py,sha256=XcW_M5a31zCo11FylOn0R-J0fQGnWZr8n75YJraJlZM,427
|
61
70
|
pyhw/backend/uptime/__init__.py,sha256=X8RVhHWmHpyey0C4gcmrt_u1cHKowhAQRDMAxY3i7p0,65
|
62
71
|
pyhw/backend/uptime/bsd.py,sha256=XdLIvivr78Pr8PqSwQG3eLvjjaM52nK5QcWrwtuNZlg,147
|
63
|
-
pyhw/backend/uptime/linux.py,sha256=
|
64
|
-
pyhw/backend/uptime/macos.py,sha256=
|
65
|
-
pyhw/backend/uptime/uptimeBase.py,sha256=
|
72
|
+
pyhw/backend/uptime/linux.py,sha256=m9NmnVeQV8ZwRbytQ0gsrkY6UqhuCoMkdc3QQX4v8nI,1033
|
73
|
+
pyhw/backend/uptime/macos.py,sha256=sVLmtLgOC7CDBVrfCBKCVApSUmbHEbd6BK3yRgzNzWQ,1299
|
74
|
+
pyhw/backend/uptime/uptimeBase.py,sha256=HVRFZHO-2F_UKH0ti9wR16iHCH7Q8dga0HfxFxUEUck,959
|
66
75
|
pyhw/backend/uptime/uptimeInfo.py,sha256=TobPEV3MBT3Fiv3W6TOzD3a4MNW-vz2Oi_Trlcihu7k,114
|
76
|
+
pyhw/backend/uptime/windows.py,sha256=fRj218K9gx2Ffg8_dEjWyaFrqFl-niiPHvJjwJhfGeM,1744
|
67
77
|
pyhw/frontend/__init__.py,sha256=xgv_iVv9w4cLXklbdtFWXu7J7KJxBCUw-ZcUQb_abFc,57
|
68
78
|
pyhw/frontend/frontendBase.py,sha256=rPAf7tE1u8uGgZ-mDTOw_O2S2-YsevEzGJsq34eJlXQ,4957
|
69
79
|
pyhw/frontend/color/__init__.py,sha256=xk511qWwdYWEVjk_zOaC4fs81HtwR4ELr3wi1tTL824,191
|
70
|
-
pyhw/frontend/color/colorConfig.py,sha256=
|
80
|
+
pyhw/frontend/color/colorConfig.py,sha256=hvpA9R4ajAbqZ0bVq5hOs0PXtTF00ViZ_qXLbBJ1DWU,6225
|
71
81
|
pyhw/frontend/color/colorSet.py,sha256=spH8PlRu7capouf-yUgDHgoPCnM5aJ_ncascISZfz2g,1421
|
72
82
|
pyhw/frontend/color/colorUtil.py,sha256=VhcPmAJmXGIiRBfVZE2jg_iy-SfbxqwOSvkRz-nbUOQ,94
|
73
83
|
pyhw/frontend/logo/__init__.py,sha256=mozEarHueBUgtDHKSd-RDaFysMLUiW3VQ8KcBtlKGCI,47
|
@@ -85,15 +95,19 @@ pyhw/frontend/logo/ascii/macOS.pyhw,sha256=HBGROtBb7wrNtRqAQ9ND7zxK0l17BRsmpgc2d
|
|
85
95
|
pyhw/frontend/logo/ascii/raspbian.pyhw,sha256=jEl6WMKF-FGx359ipQ1kzweUJS-NuauYQCFaYime4PQ,159
|
86
96
|
pyhw/frontend/logo/ascii/ubuntu.pyhw,sha256=l-Q0PfutxXYMwTojqeiM88063x4V0RBkZUHmi6YdsNc,833
|
87
97
|
pyhw/frontend/logo/ascii/ubuntu_small.pyhw,sha256=Xf8LSZdZUu9aEG3efhb1FUlUEuJ-3UztcIOJISpKhPw,229
|
98
|
+
pyhw/frontend/logo/ascii/windows_10.pyhw,sha256=jv5pzZs_CdOzpeTjyXfXJWcTQwK-J0LNlnyj_sJcuOI,706
|
99
|
+
pyhw/frontend/logo/ascii/windows_11.pyhw,sha256=VuQTzbBabaEQhm2JBVhy6Ja6lClUGacQsaiNUih9nhU,656
|
100
|
+
pyhw/frontend/logo/ascii/windows_2025.pyhw,sha256=o8eWsiyhNpDoEjiWFiBMfkd-8MdIslGc1Jpm85LU4P8,643
|
101
|
+
pyhw/frontend/logo/ascii/windows_old.pyhw,sha256=AMsvWAZ50HM8lweWEmzDWbRNDGkKFJo9qLY_VRKrciY,580
|
88
102
|
pyhw/library/lib/iokitGPULib.dylib,sha256=DcJ0GZY79gTFckLFYtZgeKn1T0NFvdO_k_ccCa7od5Y,154808
|
89
103
|
pyhw/pyhwException/__init__.py,sha256=8JsFvtF13g0Y5t4z9fRndDXtfCzuBM59jDf6PhWSFSk,220
|
90
104
|
pyhw/pyhwException/pyhwException.py,sha256=wxuzFQa9g7XB1q9TUKO_55lw7wMEJMpzG8w1GVTFVa0,197
|
91
105
|
pyhw/pyhwUtil/__init__.py,sha256=diIqlNUBfuHu-2VAOJk5nipGLafnWxR3chAAOmX8QRo,250
|
92
|
-
pyhw/pyhwUtil/pyhwUtil.py,sha256=
|
106
|
+
pyhw/pyhwUtil/pyhwUtil.py,sha256=h3XsZFGwzkW75kj853IWVlxwDz8R8A3UR-bxju95aeY,6703
|
93
107
|
pyhw/pyhwUtil/sysctlUtil.py,sha256=S-rUvqi7ZrMyMouIhxlyHEQ4agM7sCT1Y7uzs3Hu5-o,841
|
94
|
-
pyhw-0.
|
95
|
-
pyhw-0.
|
96
|
-
pyhw-0.
|
97
|
-
pyhw-0.
|
98
|
-
pyhw-0.
|
99
|
-
pyhw-0.
|
108
|
+
pyhw-0.8.0.dist-info/LICENSE,sha256=hJs6RBqSVCexbTsalkMLNFI5t06kekQEsSVaOt_-yLs,1497
|
109
|
+
pyhw-0.8.0.dist-info/METADATA,sha256=2jICwuL3kDvCFc1aJN67Hk3YFGHqQSOjpZkyAAYk5c0,5945
|
110
|
+
pyhw-0.8.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
111
|
+
pyhw-0.8.0.dist-info/entry_points.txt,sha256=q-AB8im_QahpmNrmy4aPTJRGi0LlbNlnI3kF7s6pKss,44
|
112
|
+
pyhw-0.8.0.dist-info/top_level.txt,sha256=7Inxvxt1TngEricKZEex9_WJZS3DbKYFUXDz4v5WHYU,5
|
113
|
+
pyhw-0.8.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|