pyhw 0.1.3b0__py3-none-any.whl → 0.2.1b0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyhw/__main__.py +16 -14
- pyhw/backend/cpu/cpuBase.py +3 -0
- pyhw/backend/cpu/cpuInfo.py +13 -0
- pyhw/backend/cpu/linux.py +5 -11
- pyhw/backend/cpu/macos.py +69 -0
- pyhw/backend/gpu/gpuBase.py +3 -0
- pyhw/backend/gpu/gpuInfo.py +8 -0
- pyhw/backend/gpu/linux.py +3 -9
- pyhw/backend/gpu/macos.py +63 -0
- pyhw/backend/host/hostBase.py +1 -1
- pyhw/backend/host/hostInfo.py +13 -0
- pyhw/backend/host/linux.py +20 -19
- pyhw/backend/host/macos.py +265 -1
- pyhw/backend/kernel/kernelBase.py +4 -4
- pyhw/backend/kernel/kernelInfo.py +10 -0
- pyhw/backend/kernel/{linux.py → unix.py} +3 -14
- pyhw/backend/memory/linux.py +2 -10
- pyhw/backend/memory/macos.py +56 -0
- pyhw/backend/memory/memoryBase.py +3 -0
- pyhw/backend/memory/memoryInfo.py +10 -0
- pyhw/backend/os/linux.py +2 -17
- pyhw/backend/os/macos.py +36 -0
- pyhw/backend/os/osBase.py +3 -0
- pyhw/backend/os/osInfo.py +17 -0
- pyhw/backend/uptime/linux.py +5 -10
- pyhw/backend/uptime/macos.py +40 -0
- pyhw/backend/uptime/uptimeBase.py +3 -0
- pyhw/backend/uptime/uptimeInfo.py +7 -0
- pyhw/frontend/frontendBase.py +1 -1
- pyhw/pyhwUtil/__init__.py +2 -1
- pyhw/pyhwUtil/pyhwUtil.py +22 -14
- pyhw/pyhwUtil/sysctlUtil.py +37 -0
- {pyhw-0.1.3b0.dist-info → pyhw-0.2.1b0.dist-info}/METADATA +22 -3
- {pyhw-0.1.3b0.dist-info → pyhw-0.2.1b0.dist-info}/RECORD +38 -26
- {pyhw-0.1.3b0.dist-info → pyhw-0.2.1b0.dist-info}/WHEEL +1 -1
- pyhw/backend/kernel/macos.py +0 -7
- {pyhw-0.1.3b0.dist-info → pyhw-0.2.1b0.dist-info}/LICENSE +0 -0
- {pyhw-0.1.3b0.dist-info → pyhw-0.2.1b0.dist-info}/entry_points.txt +0 -0
- {pyhw-0.1.3b0.dist-info → pyhw-0.2.1b0.dist-info}/top_level.txt +0 -0
pyhw/__main__.py
CHANGED
@@ -14,23 +14,25 @@ from .pyhwUtil import getOS, selectOSLogo
|
|
14
14
|
|
15
15
|
|
16
16
|
def main():
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
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
21
|
return
|
21
22
|
data = Data()
|
22
|
-
data.title = TitleDetect(os=
|
23
|
-
data.Host = HostDetect(os=
|
24
|
-
data.Kernel = KernelDetect(os=
|
25
|
-
data.Shell = ShellDetect(os=
|
26
|
-
data.Uptime = UptimeDetect(os=
|
27
|
-
data.OS = OSDetect(os=
|
28
|
-
data.CPU = CPUDetect(os=
|
29
|
-
|
30
|
-
|
31
|
-
|
23
|
+
data.title = TitleDetect(os=current_os).getTitle().title
|
24
|
+
data.Host = HostDetect(os=current_os).getHostInfo().model
|
25
|
+
data.Kernel = KernelDetect(os=current_os).getKernelInfo().kernel
|
26
|
+
data.Shell = ShellDetect(os=current_os).getShellInfo().info
|
27
|
+
data.Uptime = UptimeDetect(os=current_os).getUptime().uptime
|
28
|
+
data.OS = OSDetect(os=current_os).getOSInfo().prettyName
|
29
|
+
data.CPU = CPUDetect(os=current_os).getCPUInfo().cpu
|
30
|
+
gpu_info = GPUDetect(os=current_os).getGPUInfo()
|
31
|
+
if gpu_info.number > 0:
|
32
|
+
data.GPU = gpu_info.gpus
|
33
|
+
data.Memory = MemoryDetect(os=current_os).getMemoryInfo().memory
|
32
34
|
|
33
|
-
Printer(logo_os=selectOSLogo(OSDetect(os=
|
35
|
+
Printer(logo_os=selectOSLogo(OSDetect(os=current_os).getOSInfo().id), data=createDataString(data)).cPrint()
|
34
36
|
|
35
37
|
|
36
38
|
if __name__ == "__main__":
|
pyhw/backend/cpu/cpuBase.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
from .linux import CPUDetectLinux
|
2
|
+
from .macos import CPUDetectMacOS
|
2
3
|
from ...pyhwException import OSUnsupportedException
|
3
4
|
|
4
5
|
|
@@ -9,5 +10,7 @@ class CPUDetect:
|
|
9
10
|
def getCPUInfo(self):
|
10
11
|
if self.OS == "linux":
|
11
12
|
return CPUDetectLinux().getCPUInfo()
|
13
|
+
elif self.OS == "macos":
|
14
|
+
return CPUDetectMacOS().getCPUInfo()
|
12
15
|
else:
|
13
16
|
raise OSUnsupportedException("Unsupported operating system")
|
pyhw/backend/cpu/linux.py
CHANGED
@@ -1,23 +1,17 @@
|
|
1
|
-
from dataclasses import dataclass
|
2
1
|
import re
|
3
2
|
import os
|
4
|
-
|
5
|
-
|
6
|
-
@dataclass
|
7
|
-
class CPUInfoLinux:
|
8
|
-
cpu = ""
|
9
|
-
model = ""
|
10
|
-
cores = ""
|
11
|
-
frequency = ""
|
3
|
+
from .cpuInfo import CPUInfo
|
12
4
|
|
13
5
|
|
14
6
|
class CPUDetectLinux:
|
15
7
|
def __init__(self):
|
16
|
-
self.__cpuInfo =
|
8
|
+
self.__cpuInfo = CPUInfo()
|
17
9
|
|
18
10
|
def getCPUInfo(self):
|
19
11
|
self.__getCPUInfo()
|
20
12
|
self.__modelClean()
|
13
|
+
if self.__cpuInfo.model == "":
|
14
|
+
self.__cpuInfo.model = "Unknown"
|
21
15
|
if self.__cpuInfo.model != "":
|
22
16
|
self.__cpuInfo.cpu = self.__cpuInfo.model
|
23
17
|
if self.__cpuInfo.cores != "":
|
@@ -53,7 +47,7 @@ class CPUDetectLinux:
|
|
53
47
|
else:
|
54
48
|
for line in cpu_info.split("\n"):
|
55
49
|
if line.startswith("cpu MHz") or line.startswith("clock"):
|
56
|
-
self.__cpuInfo.frequency = float(line.split(
|
50
|
+
self.__cpuInfo.frequency = f"{round(float(line.split(':')[1].strip()) / 1000, 2)} Ghz" # Ghz
|
57
51
|
break
|
58
52
|
|
59
53
|
def __modelClean(self):
|
@@ -0,0 +1,69 @@
|
|
1
|
+
from .cpuInfo import CPUInfo
|
2
|
+
from ...pyhwUtil import sysctlGetString, sysctlGetInt, getArch
|
3
|
+
|
4
|
+
|
5
|
+
class CPUDetectMacOS:
|
6
|
+
def __init__(self):
|
7
|
+
self.__cpuInfo = CPUInfo()
|
8
|
+
self.__arch = getArch()
|
9
|
+
self.__pCore = 0
|
10
|
+
self.__eCore = 0
|
11
|
+
|
12
|
+
def getCPUInfo(self):
|
13
|
+
if self.__arch == "aarch64":
|
14
|
+
self.__getCPUModel()
|
15
|
+
self.__AppleSiliconBaseFrequency()
|
16
|
+
self.__handleAppleSilicon()
|
17
|
+
self.__cpuInfo.cpu = f"{self.__cpuInfo.model} ({self.__pCore}P, {self.__eCore}E) @ {self.__cpuInfo.frequency}"
|
18
|
+
else:
|
19
|
+
self.__getCPUModel()
|
20
|
+
self.__getCPUCores()
|
21
|
+
self.__getCPUFrequency()
|
22
|
+
# need test on Intel Macs.
|
23
|
+
self.__cpuInfo.cpu = f"{self.__cpuInfo.model.replace('CPU', f'({self.__cpuInfo.cores})')}"
|
24
|
+
return self.__cpuInfo
|
25
|
+
|
26
|
+
def __getCPUModel(self):
|
27
|
+
model = sysctlGetString("machdep.cpu.brand_string")
|
28
|
+
model = model.replace("(R)", "")
|
29
|
+
model = model.replace("(TM)", "")
|
30
|
+
self.__cpuInfo.model = model
|
31
|
+
|
32
|
+
def __getCPUCores(self):
|
33
|
+
cores = sysctlGetString("hw.logicalcpu_max")
|
34
|
+
self.__cpuInfo.cores = cores
|
35
|
+
|
36
|
+
def __getCPUFrequency(self):
|
37
|
+
# sysctl doesn't provide the exact CPU frequency on Apple Silicon Macs, there are some indirect methods
|
38
|
+
# to get the CPU frequency, but can not integrate with Python directly.
|
39
|
+
# C-Based helper module will be added later.
|
40
|
+
# See https://github.com/fastfetch-cli/fastfetch/blob/dev/src/detection/cpu/cpu_apple.c for more details.
|
41
|
+
freq = sysctlGetString("hw.cpufrequency")
|
42
|
+
self.__cpuInfo.frequency = freq
|
43
|
+
|
44
|
+
def __handleAppleSilicon(self):
|
45
|
+
nlevels = sysctlGetInt("hw.nperflevels")
|
46
|
+
if nlevels is not None and nlevels == 2: # currently, Apple Silicon chip only has 2 performance levels.
|
47
|
+
pcore = sysctlGetInt("hw.perflevel0.logicalcpu_max") # level 0 is P-core
|
48
|
+
ecore = sysctlGetInt("hw.perflevel1.logicalcpu_max") # level 1 is E-core
|
49
|
+
if pcore is not None and ecore is not None:
|
50
|
+
self.__pCore = pcore
|
51
|
+
self.__eCore = ecore
|
52
|
+
|
53
|
+
def __AppleSiliconBaseFrequency(self):
|
54
|
+
# see https://en.wikipedia.org/wiki/Apple_silicon#M_series for more details.
|
55
|
+
freq = {
|
56
|
+
"Apple M1": "2.30 GHz",
|
57
|
+
"Apple M1 Pro": "2.32 GHz",
|
58
|
+
"Apple M1 Max": "2.32 GHz",
|
59
|
+
"Apple M1 Ultra": "2.32 GHz",
|
60
|
+
"Apple M2": "3.50 GHz",
|
61
|
+
"Apple M2 Pro": "3.50 GHz",
|
62
|
+
"Apple M2 Max": "3.69 GHz",
|
63
|
+
"Apple M2 Ultra": "3.70 Ghz",
|
64
|
+
"Apple M3": "4.05 GHz",
|
65
|
+
"Apple M3 Pro": "4.05 GHz",
|
66
|
+
"Apple M3 Max": "4.05 GHz",
|
67
|
+
"Apple M4": "4.40 GHz"
|
68
|
+
}
|
69
|
+
self.__cpuInfo.frequency = freq.get(self.__cpuInfo.model, "Unknown")
|
pyhw/backend/gpu/gpuBase.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
from .linux import GPUDetectLinux
|
2
|
+
from .macos import GPUDetectMacOS
|
2
3
|
|
3
4
|
|
4
5
|
class GPUDetect:
|
@@ -8,5 +9,7 @@ class GPUDetect:
|
|
8
9
|
def getGPUInfo(self):
|
9
10
|
if self.OS == "linux":
|
10
11
|
return GPUDetectLinux().getGPUInfo()
|
12
|
+
elif self.OS == "macos":
|
13
|
+
return GPUDetectMacOS().getGPUInfo()
|
11
14
|
else:
|
12
15
|
raise NotImplementedError("Unsupported operating system")
|
pyhw/backend/gpu/linux.py
CHANGED
@@ -1,18 +1,12 @@
|
|
1
1
|
import subprocess
|
2
|
-
from
|
2
|
+
from .gpuInfo import GPUInfo
|
3
3
|
from ..cpu import CPUDetect
|
4
4
|
from ...pyhwUtil import getArch
|
5
5
|
|
6
6
|
|
7
|
-
@dataclass
|
8
|
-
class GPUInfoLinux:
|
9
|
-
number = 0
|
10
|
-
gpus = []
|
11
|
-
|
12
|
-
|
13
7
|
class GPUDetectLinux:
|
14
8
|
def __init__(self):
|
15
|
-
self.__gpuInfo =
|
9
|
+
self.__gpuInfo = GPUInfo()
|
16
10
|
|
17
11
|
def getGPUInfo(self):
|
18
12
|
self.__getGPUInfo()
|
@@ -37,7 +31,7 @@ class GPUDetectLinux:
|
|
37
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.
|
38
32
|
if getArch() == "aarch64" or getArch() == "arm32":
|
39
33
|
self.__gpuInfo.number = 1
|
40
|
-
self.__gpuInfo.gpus.append(f"{CPUDetect(os='linux').getCPUInfo().model}
|
34
|
+
self.__gpuInfo.gpus.append(f"{CPUDetect(os='linux').getCPUInfo().model} [SOC Integrated]")
|
41
35
|
else:
|
42
36
|
self.__gpuInfo.number = 1
|
43
37
|
self.__gpuInfo.gpus.append("Not found")
|
@@ -0,0 +1,63 @@
|
|
1
|
+
from .gpuInfo import GPUInfo
|
2
|
+
from ...pyhwUtil import getArch
|
3
|
+
import json
|
4
|
+
import subprocess
|
5
|
+
|
6
|
+
|
7
|
+
class GPUDetectMacOS:
|
8
|
+
def __init__(self):
|
9
|
+
self.__gpuInfo = GPUInfo()
|
10
|
+
self.__arch = getArch()
|
11
|
+
|
12
|
+
def getGPUInfo(self):
|
13
|
+
if self.__arch == "aarch64":
|
14
|
+
self.__getGPUAppleSilicon()
|
15
|
+
else: # Does not consider powerPC based Macs.
|
16
|
+
self.__getGPUIntel()
|
17
|
+
return self.__gpuInfo
|
18
|
+
|
19
|
+
def __getGPUAppleSilicon(self):
|
20
|
+
gpus = list()
|
21
|
+
try:
|
22
|
+
gpu_info_dict = json.loads(subprocess.check_output(["system_profiler", "SPDisplaysDataType", "-json"]))
|
23
|
+
if 'SPDisplaysDataType' in gpu_info_dict:
|
24
|
+
gpus = gpu_info_dict['SPDisplaysDataType']
|
25
|
+
self.__gpuInfo.number = len(gpus)
|
26
|
+
else:
|
27
|
+
pass
|
28
|
+
except Exception:
|
29
|
+
return
|
30
|
+
|
31
|
+
for gpu in gpus:
|
32
|
+
self.__gpuInfo.gpus.append(f'{gpu.get("sppci_model")} ({gpu.get("sppci_cores")} cores) [SOC Integrated]')
|
33
|
+
|
34
|
+
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
|
45
|
+
|
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
|
53
|
+
|
54
|
+
@staticmethod
|
55
|
+
def __handleVendor(vendor):
|
56
|
+
if vendor == "sppci_vendor_Apple":
|
57
|
+
return "Apple"
|
58
|
+
elif vendor == "sppci_vendor_intel":
|
59
|
+
return "Intel"
|
60
|
+
elif vendor == "sppci_vendor_amd":
|
61
|
+
return "AMD"
|
62
|
+
else:
|
63
|
+
return vendor
|
pyhw/backend/host/hostBase.py
CHANGED
pyhw/backend/host/linux.py
CHANGED
@@ -2,24 +2,13 @@
|
|
2
2
|
In dev.
|
3
3
|
"""
|
4
4
|
from ...pyhwUtil import getArch
|
5
|
-
from
|
6
|
-
|
7
|
-
|
8
|
-
@dataclass
|
9
|
-
class HostInfoLinux:
|
10
|
-
model = ""
|
11
|
-
family = ""
|
12
|
-
name = ""
|
13
|
-
version = ""
|
14
|
-
sku = ""
|
15
|
-
serial = ""
|
16
|
-
uuid = ""
|
17
|
-
vendor = ""
|
5
|
+
from .hostInfo import HostInfo
|
6
|
+
import os
|
18
7
|
|
19
8
|
|
20
9
|
class HostDetectLinux:
|
21
10
|
def __init__(self):
|
22
|
-
self.__hostInfo =
|
11
|
+
self.__hostInfo = HostInfo()
|
23
12
|
self.__arch = getArch()
|
24
13
|
|
25
14
|
def getHostInfo(self):
|
@@ -37,11 +26,23 @@ class HostDetectLinux:
|
|
37
26
|
except FileNotFoundError:
|
38
27
|
pass
|
39
28
|
elif self.__arch in ["aarch64", "arm32"]:
|
40
|
-
try
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
29
|
+
# try to find dmi folder since some arm based desktops and servers may have same structure as x86_64 machines.
|
30
|
+
if os.path.exists("/sys/devices/virtual/dmi/id"):
|
31
|
+
try:
|
32
|
+
with open("/sys/devices/virtual/dmi/id/product_name", "r") as f:
|
33
|
+
self.__hostInfo.name = f.read().strip()
|
34
|
+
with open("/sys/devices/virtual/dmi/id/product_version", "r") as f:
|
35
|
+
self.__hostInfo.version = f.read().strip()
|
36
|
+
self.__hostInfo.model = self.__hostInfo.name + " " + self.__hostInfo.version
|
37
|
+
except FileNotFoundError:
|
38
|
+
pass
|
39
|
+
else:
|
40
|
+
# some single board computers may not have dmi folder, try to find model name in device tree.
|
41
|
+
try:
|
42
|
+
with open("/sys/firmware/devicetree/base/model", "r") as f:
|
43
|
+
self.__hostInfo.model = f.read().strip()
|
44
|
+
except FileNotFoundError:
|
45
|
+
pass
|
45
46
|
|
46
47
|
def __getHostFamily(self):
|
47
48
|
pass
|
pyhw/backend/host/macos.py
CHANGED
@@ -1,5 +1,269 @@
|
|
1
1
|
"""
|
2
2
|
In dev.
|
3
3
|
"""
|
4
|
+
from .hostInfo import HostInfo
|
5
|
+
from ...pyhwUtil import sysctlGetString
|
6
|
+
|
7
|
+
|
4
8
|
class HostDetectMacOS:
|
5
|
-
|
9
|
+
def __init__(self):
|
10
|
+
self.__hostInfo = HostInfo()
|
11
|
+
self.__HWModel = ""
|
12
|
+
|
13
|
+
def getHostInfo(self):
|
14
|
+
self.__getHWModel()
|
15
|
+
self.__hostInfo.model = self.__handleMacName(self.__HWModel)
|
16
|
+
return self.__hostInfo
|
17
|
+
|
18
|
+
def __getHWModel(self):
|
19
|
+
self.__HWModel = sysctlGetString("hw.model")
|
20
|
+
|
21
|
+
def __handleMacName(self, hw_model: str):
|
22
|
+
# This part of the code is directly re-implemented from the fastfetch project. It seems that there is no
|
23
|
+
# more elegant way to get the product name of the Mac.
|
24
|
+
# See https://github.com/fastfetch-cli/fastfetch/blob/dev/src/detection/host/host_apple.c for more details.
|
25
|
+
if hw_model.startswith("MacBookPro"):
|
26
|
+
version = hw_model[len("MacBookPro"):]
|
27
|
+
if self.__hwModelCheck(version, "18,3") or self.__hwModelCheck(version, "18,4"):
|
28
|
+
return "MacBook Pro (14-inch, 2021)"
|
29
|
+
if self.__hwModelCheck(version, "18,1") or self.__hwModelCheck(version, "18,2"):
|
30
|
+
return "MacBook Pro (16-inch, 2021)"
|
31
|
+
if self.__hwModelCheck(version, "17,1"):
|
32
|
+
return "MacBook Pro (13-inch, M1, 2020)"
|
33
|
+
if self.__hwModelCheck(version, "16,3"):
|
34
|
+
return "MacBook Pro (13-inch, 2020, Two Thunderbolt 3 ports)"
|
35
|
+
if self.__hwModelCheck(version, "16,2"):
|
36
|
+
return "MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)"
|
37
|
+
if self.__hwModelCheck(version, "16,4") or self.__hwModelCheck(version, "16,1"):
|
38
|
+
return "MacBook Pro (16-inch, 2019)"
|
39
|
+
if self.__hwModelCheck(version, "15,4"):
|
40
|
+
return "MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)"
|
41
|
+
if self.__hwModelCheck(version, "15,3"):
|
42
|
+
return "MacBook Pro (15-inch, 2019)"
|
43
|
+
if self.__hwModelCheck(version, "15,2"):
|
44
|
+
return "MacBook Pro (13-inch, 2018/2019, Four Thunderbolt 3 ports)"
|
45
|
+
if self.__hwModelCheck(version, "15,1"):
|
46
|
+
return "MacBook Pro (15-inch, 2018/2019)"
|
47
|
+
if self.__hwModelCheck(version, "14,3"):
|
48
|
+
return "MacBook Pro (15-inch, 2017)"
|
49
|
+
if self.__hwModelCheck(version, "14,2"):
|
50
|
+
return "MacBook Pro (13-inch, 2017, Four Thunderbolt 3 ports)"
|
51
|
+
if self.__hwModelCheck(version, "14,1"):
|
52
|
+
return "MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)"
|
53
|
+
if self.__hwModelCheck(version, "13,3"):
|
54
|
+
return "MacBook Pro (15-inch, 2016)"
|
55
|
+
if self.__hwModelCheck(version, "13,2"):
|
56
|
+
return "MacBook Pro (13-inch, 2016, Four Thunderbolt 3 ports)"
|
57
|
+
if self.__hwModelCheck(version, "13,1"):
|
58
|
+
return "MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports)"
|
59
|
+
if self.__hwModelCheck(version, "12,1"):
|
60
|
+
return "MacBook Pro (Retina, 13-inch, Early 2015)"
|
61
|
+
if self.__hwModelCheck(version, "11,4") or self.__hwModelCheck(version, "11,5"):
|
62
|
+
return "MacBook Pro (Retina, 15-inch, Mid 2015)"
|
63
|
+
if self.__hwModelCheck(version, "11,2") or self.__hwModelCheck(version, "11,3"):
|
64
|
+
return "MacBook Pro (Retina, 15-inch, Late 2013/Mid 2014)"
|
65
|
+
if self.__hwModelCheck(version, "11,1"):
|
66
|
+
return "MacBook Pro (Retina, 13-inch, Late 2013/Mid 2014)"
|
67
|
+
if self.__hwModelCheck(version, "10,2"):
|
68
|
+
return "MacBook Pro (Retina, 13-inch, Late 2012/Early 2013)"
|
69
|
+
if self.__hwModelCheck(version, "10,1"):
|
70
|
+
return "MacBook Pro (Retina, 15-inch, Mid 2012/Early 2013)"
|
71
|
+
if self.__hwModelCheck(version, "9,2"):
|
72
|
+
return "MacBook Pro (13-inch, Mid 2012)"
|
73
|
+
if self.__hwModelCheck(version, "9,1"):
|
74
|
+
return "MacBook Pro (15-inch, Mid 2012)"
|
75
|
+
if self.__hwModelCheck(version, "8,3"):
|
76
|
+
return "MacBook Pro (17-inch, 2011)"
|
77
|
+
if self.__hwModelCheck(version, "8,2"):
|
78
|
+
return "MacBook Pro (15-inch, 2011)"
|
79
|
+
if self.__hwModelCheck(version, "8,1"):
|
80
|
+
return "MacBook Pro (13-inch, 2011)"
|
81
|
+
if self.__hwModelCheck(version, "7,1"):
|
82
|
+
return "MacBook Pro (13-inch, Mid 2010)"
|
83
|
+
if self.__hwModelCheck(version, "6,2"):
|
84
|
+
return "MacBook Pro (15-inch, Mid 2010)"
|
85
|
+
if self.__hwModelCheck(version, "6,1"):
|
86
|
+
return "MacBook Pro (17-inch, Mid 2010)"
|
87
|
+
if self.__hwModelCheck(version, "5,5"):
|
88
|
+
return "MacBook Pro (13-inch, Mid 2009)"
|
89
|
+
if self.__hwModelCheck(version, "5,3"):
|
90
|
+
return "MacBook Pro (15-inch, Mid 2009)"
|
91
|
+
if self.__hwModelCheck(version, "5,2"):
|
92
|
+
return "MacBook Pro (17-inch, Mid/Early 2009)"
|
93
|
+
if self.__hwModelCheck(version, "5,1"):
|
94
|
+
return "MacBook Pro (15-inch, Late 2008)"
|
95
|
+
if self.__hwModelCheck(version, "4,1"):
|
96
|
+
return "MacBook Pro (17/15-inch, Early 2008)"
|
97
|
+
elif hw_model.startswith("MacBookAir"):
|
98
|
+
version = hw_model[len("MacBookAir"):]
|
99
|
+
if self.__hwModelCheck(version, "10,1"):
|
100
|
+
return "MacBook Air (M1, 2020)"
|
101
|
+
if self.__hwModelCheck(version, "9,1"):
|
102
|
+
return "MacBook Air (Retina, 13-inch, 2020)"
|
103
|
+
if self.__hwModelCheck(version, "8,2"):
|
104
|
+
return "MacBook Air (Retina, 13-inch, 2019)"
|
105
|
+
if self.__hwModelCheck(version, "8,1"):
|
106
|
+
return "MacBook Air (Retina, 13-inch, 2018)"
|
107
|
+
if self.__hwModelCheck(version, "7,2"):
|
108
|
+
return "MacBook Air (13-inch, Early 2015/2017)"
|
109
|
+
if self.__hwModelCheck(version, "7,1"):
|
110
|
+
return "MacBook Air (11-inch, Early 2015)"
|
111
|
+
if self.__hwModelCheck(version, "6,2"):
|
112
|
+
return "MacBook Air (13-inch, Mid 2013/Early 2014)"
|
113
|
+
if self.__hwModelCheck(version, "6,1"):
|
114
|
+
return "MacBook Air (11-inch, Mid 2013/Early 2014)"
|
115
|
+
if self.__hwModelCheck(version, "5,2"):
|
116
|
+
return "MacBook Air (13-inch, Mid 2012)"
|
117
|
+
if self.__hwModelCheck(version, "5,1"):
|
118
|
+
return "MacBook Air (11-inch, Mid 2012)"
|
119
|
+
if self.__hwModelCheck(version, "4,2"):
|
120
|
+
return "MacBook Air (13-inch, Mid 2011)"
|
121
|
+
if self.__hwModelCheck(version, "4,1"):
|
122
|
+
return "MacBook Air (11-inch, Mid 2011)"
|
123
|
+
if self.__hwModelCheck(version, "3,2"):
|
124
|
+
return "MacBook Air (13-inch, Late 2010)"
|
125
|
+
if self.__hwModelCheck(version, "3,1"):
|
126
|
+
return "MacBook Air (11-inch, Late 2010)"
|
127
|
+
if self.__hwModelCheck(version, "2,1"):
|
128
|
+
return "MacBook Air (Mid 2009)"
|
129
|
+
|
130
|
+
elif hw_model.startswith("Macmini"):
|
131
|
+
version = hw_model[len("Macmini"):]
|
132
|
+
if self.__hwModelCheck(version, "9,1"):
|
133
|
+
return "Mac mini (M1, 2020)"
|
134
|
+
if self.__hwModelCheck(version, "8,1"):
|
135
|
+
return "Mac mini (2018)"
|
136
|
+
if self.__hwModelCheck(version, "7,1"):
|
137
|
+
return "Mac mini (Mid 2014)"
|
138
|
+
if self.__hwModelCheck(version, "6,1") or self.__hwModelCheck(version, "6,2"):
|
139
|
+
return "Mac mini (Late 2012)"
|
140
|
+
if self.__hwModelCheck(version, "5,1") or self.__hwModelCheck(version, "5,2"):
|
141
|
+
return "Mac mini (Mid 2011)"
|
142
|
+
if self.__hwModelCheck(version, "4,1"):
|
143
|
+
return "Mac mini (Mid 2010)"
|
144
|
+
if self.__hwModelCheck(version, "3,1"):
|
145
|
+
return "Mac mini (Early/Late 2009)"
|
146
|
+
|
147
|
+
elif hw_model.startswith("MacBook"):
|
148
|
+
version = hw_model[len("MacBook"):]
|
149
|
+
if self.__hwModelCheck(version, "10,1"):
|
150
|
+
return "MacBook (Retina, 12-inch, 2017)"
|
151
|
+
if self.__hwModelCheck(version, "9,1"):
|
152
|
+
return "MacBook (Retina, 12-inch, Early 2016)"
|
153
|
+
if self.__hwModelCheck(version, "8,1"):
|
154
|
+
return "MacBook (Retina, 12-inch, Early 2015)"
|
155
|
+
if self.__hwModelCheck(version, "7,1"):
|
156
|
+
return "MacBook (13-inch, Mid 2010)"
|
157
|
+
if self.__hwModelCheck(version, "6,1"):
|
158
|
+
return "MacBook (13-inch, Late 2009)"
|
159
|
+
if self.__hwModelCheck(version, "5,2"):
|
160
|
+
return "MacBook (13-inch, Early/Mid 2009)"
|
161
|
+
|
162
|
+
elif hw_model.startswith("MacPro"):
|
163
|
+
version = hw_model[len("MacPro"):]
|
164
|
+
if self.__hwModelCheck(version, "7,1"):
|
165
|
+
return "Mac Pro (2019)"
|
166
|
+
if self.__hwModelCheck(version, "6,1"):
|
167
|
+
return "Mac Pro (Late 2013)"
|
168
|
+
if self.__hwModelCheck(version, "5,1"):
|
169
|
+
return "Mac Pro (Mid 2010 - Mid 2012)"
|
170
|
+
if self.__hwModelCheck(version, "4,1"):
|
171
|
+
return "Mac Pro (Early 2009)"
|
172
|
+
|
173
|
+
elif hw_model.startswith("Mac"):
|
174
|
+
version = hw_model[len("Mac"):]
|
175
|
+
if self.__hwModelCheck(version, "15,13"):
|
176
|
+
return "MacBook Air (15-inch, M3, 2024)"
|
177
|
+
if self.__hwModelCheck(version, "15,2"):
|
178
|
+
return "MacBook Air (13-inch, M3, 2024)"
|
179
|
+
if self.__hwModelCheck(version, "15,3"):
|
180
|
+
return "MacBook Pro (14-inch, Nov 2023, Two Thunderbolt / USB 4 ports)"
|
181
|
+
if self.__hwModelCheck(version, "15,4"):
|
182
|
+
return "iMac (24-inch, 2023, Two Thunderbolt / USB 4 ports)"
|
183
|
+
if self.__hwModelCheck(version, "15,5"):
|
184
|
+
return "iMac (24-inch, 2023, Two Thunderbolt / USB 4 ports, Two USB 3 ports)"
|
185
|
+
if self.__hwModelCheck(version, "15,6") or self.__hwModelCheck(version, "15,8") or self.__hwModelCheck(version, "15,10"):
|
186
|
+
return "MacBook Pro (14-inch, Nov 2023, Three Thunderbolt 4 ports)"
|
187
|
+
if self.__hwModelCheck(version, "15,7") or self.__hwModelCheck(version, "15,9") or self.__hwModelCheck(version, "15,11"):
|
188
|
+
return "MacBook Pro (16-inch, Nov 2023, Three Thunderbolt 4 ports)"
|
189
|
+
if self.__hwModelCheck(version, "14,15"):
|
190
|
+
return "MacBook Air (15-inch, M2, 2023)"
|
191
|
+
if self.__hwModelCheck(version, "14,14"):
|
192
|
+
return "Mac Studio (M2 Ultra, 2023, Two Thunderbolt 4 front ports)"
|
193
|
+
if self.__hwModelCheck(version, "14,13"):
|
194
|
+
return "Mac Studio (M2 Max, 2023, Two USB-C front ports)"
|
195
|
+
if self.__hwModelCheck(version, "14,8"):
|
196
|
+
return "Mac Pro (2023)"
|
197
|
+
if self.__hwModelCheck(version, "14,6") or self.__hwModelCheck(version, "14,10"):
|
198
|
+
return "MacBook Pro (16-inch, 2023)"
|
199
|
+
if self.__hwModelCheck(version, "14,5") or self.__hwModelCheck(version, "14,9"):
|
200
|
+
return "MacBook Pro (14-inch, 2023)"
|
201
|
+
if self.__hwModelCheck(version, "14,3"):
|
202
|
+
return "Mac mini (M2, 2023, Two Thunderbolt 4 ports)"
|
203
|
+
if self.__hwModelCheck(version, "14,12"):
|
204
|
+
return "Mac mini (M2, 2023, Four Thunderbolt 4 ports)"
|
205
|
+
if self.__hwModelCheck(version, "14,7"):
|
206
|
+
return "MacBook Pro (13-inch, M2, 2022)"
|
207
|
+
if self.__hwModelCheck(version, "14,2"):
|
208
|
+
return "MacBook Air (M2, 2022)"
|
209
|
+
if self.__hwModelCheck(version, "13,1"):
|
210
|
+
return "Mac Studio (M1 Max, 2022, Two USB-C front ports)"
|
211
|
+
if self.__hwModelCheck(version, "13,2"):
|
212
|
+
return "Mac Studio (M1 Ultra, 2022, Two Thunderbolt 4 front ports)"
|
213
|
+
|
214
|
+
elif hw_model.startswith("iMac"):
|
215
|
+
version = hw_model[len("iMac"):]
|
216
|
+
if self.__hwModelCheck(version, "21,1"):
|
217
|
+
return "iMac (24-inch, M1, 2021, Two Thunderbolt / USB 4 ports, Two USB 3 ports)"
|
218
|
+
if self.__hwModelCheck(version, "21,2"):
|
219
|
+
return "iMac (24-inch, M1, 2021, Two Thunderbolt / USB 4 ports)"
|
220
|
+
if self.__hwModelCheck(version, "20,1") or self.__hwModelCheck(version, "20,2"):
|
221
|
+
return "iMac (Retina 5K, 27-inch, 2020)"
|
222
|
+
if self.__hwModelCheck(version, "19,1"):
|
223
|
+
return "iMac (Retina 5K, 27-inch, 2019)"
|
224
|
+
if self.__hwModelCheck(version, "19,2"):
|
225
|
+
return "iMac (Retina 4K, 21.5-inch, 2019)"
|
226
|
+
if self.__hwModelCheck(version, "Pro1,1"):
|
227
|
+
return "iMac Pro (2017)"
|
228
|
+
if self.__hwModelCheck(version, "18,3"):
|
229
|
+
return "iMac (Retina 5K, 27-inch, 2017)"
|
230
|
+
if self.__hwModelCheck(version, "18,2"):
|
231
|
+
return "iMac (Retina 4K, 21.5-inch, 2017)"
|
232
|
+
if self.__hwModelCheck(version, "18,1"):
|
233
|
+
return "iMac (21.5-inch, 2017)"
|
234
|
+
if self.__hwModelCheck(version, "17,1"):
|
235
|
+
return "iMac (Retina 5K, 27-inch, Late 2015)"
|
236
|
+
if self.__hwModelCheck(version, "16,2"):
|
237
|
+
return "iMac (Retina 4K, 21.5-inch, Late 2015)"
|
238
|
+
if self.__hwModelCheck(version, "16,1"):
|
239
|
+
return "iMac (21.5-inch, Late 2015)"
|
240
|
+
if self.__hwModelCheck(version, "15,1"):
|
241
|
+
return "iMac (Retina 5K, 27-inch, Late 2014 - Mid 2015)"
|
242
|
+
if self.__hwModelCheck(version, "14,4"):
|
243
|
+
return "iMac (21.5-inch, Mid 2014)"
|
244
|
+
if self.__hwModelCheck(version, "14,2"):
|
245
|
+
return "iMac (27-inch, Late 2013)"
|
246
|
+
if self.__hwModelCheck(version, "14,1"):
|
247
|
+
return "iMac (21.5-inch, Late 2013)"
|
248
|
+
if self.__hwModelCheck(version, "13,2"):
|
249
|
+
return "iMac (27-inch, Late 2012)"
|
250
|
+
if self.__hwModelCheck(version, "13,1"):
|
251
|
+
return "iMac (21.5-inch, Late 2012)"
|
252
|
+
if self.__hwModelCheck(version, "12,2"):
|
253
|
+
return "iMac (27-inch, Mid 2011)"
|
254
|
+
if self.__hwModelCheck(version, "12,1"):
|
255
|
+
return "iMac (21.5-inch, Mid 2011)"
|
256
|
+
if self.__hwModelCheck(version, "11,3"):
|
257
|
+
return "iMac (27-inch, Mid 2010)"
|
258
|
+
if self.__hwModelCheck(version, "11,2"):
|
259
|
+
return "iMac (21.5-inch, Mid 2010)"
|
260
|
+
if self.__hwModelCheck(version, "10,1"):
|
261
|
+
return "iMac (27/21.5-inch, Late 2009)"
|
262
|
+
if self.__hwModelCheck(version, "9,1"):
|
263
|
+
return "iMac (24/20-inch, Early 2009)"
|
264
|
+
|
265
|
+
return "Unknown Mac Model"
|
266
|
+
|
267
|
+
@staticmethod
|
268
|
+
def __hwModelCheck(version: str, target: str):
|
269
|
+
return version == target
|