|
28 | 28 | import json |
29 | 29 | import errno |
30 | 30 | import psutil |
31 | | -import subprocess |
32 | 31 | import threading |
33 | 32 | import platform |
34 | 33 | from queue import Queue |
@@ -103,36 +102,41 @@ def is_generic_cpu_model(value): |
103 | 102 | v = normalize_cpu_model(value).lower().replace('-', '').replace('_', '').replace(' ', '') |
104 | 103 | return v in ('', 'unknown', 'x8664', 'amd64', 'i386', 'i686', 'aarch64', 'arm64') or v.startswith('armv') |
105 | 104 |
|
| 105 | +def get_platform_cpu_vendor(): |
| 106 | + values = [ |
| 107 | + platform.processor(), |
| 108 | + getattr(platform.uname(), 'processor', ''), |
| 109 | + platform.machine(), |
| 110 | + getattr(platform.uname(), 'machine', ''), |
| 111 | + platform.platform(), |
| 112 | + ] |
| 113 | + text = " ".join(normalize_cpu_model(v).lower() for v in values) |
| 114 | + if 'genuineintel' in text: |
| 115 | + return 'GenuineIntel' |
| 116 | + if 'authenticamd' in text: |
| 117 | + return 'AuthenticAMD' |
| 118 | + if 'intel' in text: |
| 119 | + return 'Intel' |
| 120 | + if 'amd' in text: |
| 121 | + return 'AMD' |
| 122 | + if sys.platform.startswith('darwin') and platform.machine().lower() in ('arm64', 'aarch64'): |
| 123 | + return 'Apple' |
| 124 | + if any(token in text for token in ('aarch64', 'arm64', 'armv7', 'armv8', ' arm ')): |
| 125 | + return 'ARM' |
| 126 | + return '' |
| 127 | + |
| 128 | +def get_platform_cpu_arch(): |
| 129 | + return normalize_cpu_model(platform.machine() or platform.processor() or platform.architecture()[0]) |
| 130 | + |
106 | 131 | def get_cpu_model(): |
107 | | - try: |
108 | | - fallback = "" |
109 | | - with open('/proc/cpuinfo') as f: |
110 | | - for line in f: |
111 | | - if ':' not in line: |
112 | | - continue |
113 | | - key, value = line.split(':', 1) |
114 | | - key = key.strip().lower() |
115 | | - value = normalize_cpu_model(value) |
116 | | - if not value: |
117 | | - continue |
118 | | - if key == 'model name': |
119 | | - return value |
120 | | - if key in ('hardware', 'processor') and not value.isdigit() and not fallback: |
121 | | - fallback = value |
122 | | - if fallback: |
123 | | - return fallback |
124 | | - except Exception: |
125 | | - pass |
126 | | - for cmd in ('sysctl -n machdep.cpu.brand_string', 'sysctl -n hw.model'): |
127 | | - try: |
128 | | - value = subprocess.check_output(cmd, shell=True, stderr=subprocess.DEVNULL, timeout=2).decode().strip() |
129 | | - value = normalize_cpu_model(value) |
130 | | - if value: |
131 | | - return value |
132 | | - except Exception: |
133 | | - pass |
134 | | - value = normalize_cpu_model(platform.processor()) |
135 | | - return "" if is_generic_cpu_model(value) else value |
| 132 | + for value in (platform.processor(), getattr(platform.uname(), 'processor', '')): |
| 133 | + value = normalize_cpu_model(value) |
| 134 | + if value and not is_generic_cpu_model(value): |
| 135 | + return value |
| 136 | + vendor = normalize_cpu_model(get_platform_cpu_vendor()) |
| 137 | + if vendor: |
| 138 | + return vendor |
| 139 | + return get_platform_cpu_arch() |
136 | 140 |
|
137 | 141 | def liuliang(): |
138 | 142 | NET_IN = 0 |
|
0 commit comments