summaryrefslogtreecommitdiffstats
path: root/modules-available/statistics/inc/hardwareinfo.inc.php
blob: 7e0bdba8c919718d991de247152ebdf17e3b9b26 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
<?php

class HardwareInfo
{

	// Never change these!
	const RAM_MODULE = 'RAM';
	const MAINBOARD = 'MAINBOARD';
	const DMI_SYSTEM = 'DMI_SYSTEM';
	const POWER_SUPPLY = 'POWER_SUPPLY';
	const SYSTEM_SLOT = 'SYSTEM_SLOT';
	const PCI_DEVICE = 'PCI_DEVICE';
	const HDD = 'HDD';
	const CPU = 'CPU';
	const SCREEN = 'SCREEN';

	/**
	 * Get a KCL modification string for the given machine, enabling GVT, PCI passthrough etc.
	 * You can provide a UUID and/or MAC, or nothing. If nothing is provided,
	 * the "uuid" and "mac" GET parameters will be used. If both are provided,
	 * the resulting machine that has the greatest "lastseen" value will be used.
	 * @param ?string $uuid UUID of machine
	 * @param ?string $mac MAC of machine
	 */
	public static function getKclModifications(?string $uuid = null, ?string $mac = null): string
	{
		if ($uuid === null && $mac === null) {
			$uuid = Request::get('uuid', '', 'string');
			$mac = Request::get('mac', '', 'string');
			$mac = str_replace(':', '-', $mac);
		}
		$res = Database::simpleQuery("SELECT machineuuid, lastseen, cpumodel, locationid FROM machine
				WHERE machineuuid = :uuid OR macaddr = :mac", ['uuid' => $uuid, 'mac' => $mac]);
		$best = null;
		foreach ($res as $row) {
			if ($best === null || $best['lastseen'] < $row['lastseen']) {
				$best = $row;
			}
		}
		if ($best === null || ((int)$best['locationid']) === 0)
			return '';
		$locations = Location::getLocationRootChain($best['locationid']);
		if (empty($locations))
			return '';
		$hw = new HardwareQuery(self::PCI_DEVICE, $best['machineuuid'], true);
		// TODO: Get list of enabled pass through groups for this client's location
		$hw->addForeignJoin(true, '@PASSTHROUGH', 'passthrough_group_x_location', 'groupid',
				'locationid', $locations);
		$hw->addGlobalColumn('vendor');
		$hw->addGlobalColumn('device');
		$hw->addLocalColumn('slot');
		$res = $hw->query(['vendor', 'device']);
		$passthrough = [];
		$slots = [];
		$gvt = false;
		foreach ($res as $row) {
			if ($row['@PASSTHROUGH'] === 'GVT') {
				$gvt = true;
			} else {
				$passthrough[$row['vendor'] . ':' . $row['device']] = 1;
				$slots[preg_replace('/\.[0-9]+$/', '', $row['slot'])] = 1;
			}
		}
		$kcl = '';
		if ($gvt || !empty($passthrough)) {
			if (strpos($best['cpumodel'], 'Intel') !== false) {
				$kcl = '-iommu -intel_iommu iommu=pt intel_iommu=on';
			} elseif (strpos($best['cpumodel'], 'AMD') !== false) {
				$kcl = '-iommu -amd_iommu iommu=pt amd_iommu=on';
			} else {
				error_log("Cannot determine CPU manufacturer from " . $best['cpumodel']);
				$kcl = '-iommu -intel_iommu iommu=pt intel_iommu=on -amd_iommu amd_iommu=on';
			}
		}
		if (!empty($passthrough)) {
			foreach (array_keys($slots) as $slot) {
				//error_log('Querying slot ' . $slot);
				$hw = new HardwareQuery(self::PCI_DEVICE, $best['machineuuid'], true);
				$hw->addLocalColumn('slot')->addCondition('LIKE', $slot . '.%');
				$hw->addGlobalColumn('vendor');
				$hw->addGlobalColumn('device');
				foreach ($hw->query() as $row) {
					$passthrough[$row['vendor'] . ':' . $row['device']] = 1;
					//error_log('Extra PT: ' . $row['vendor'] . ':' . $row['device']);
				}
			}
			$kcl .= ' vfio-pci.ids=' . implode(',', array_keys($passthrough));
		}
		if ($gvt) {
			$kcl .= ' i915.enable_gvt=1';
		}
		return $kcl;
	}

	// For lookup (from https://en.wikipedia.org/wiki/GUID_Partition_Table)
	const GPT = [
		'00000000-0000-0000-0000-000000000000' => 'Unused entry',
		'024DEE41-33E7-11D3-9D69-0008C781F39F' => 'MBR partition scheme',
		'C12A7328-F81F-11D2-BA4B-00A0C93EC93B' => 'EFI System partition',
		'21686148-6449-6E6F-744E-656564454649' => 'BIOS boot partition',
		'D3BFE2DE-3DAF-11DF-BA40-E3A556D89593' => 'Intel Fast Flash (iFFS) partition (for Intel Rapid Start technology)',
		'F4019732-066E-4E12-8273-346C5641494F' => 'Sony boot partition',
		'BFBFAFE7-A34F-448A-9A5B-6213EB736C22' => 'Lenovo boot partition',
		'E3C9E316-0B5C-4DB8-817D-F92DF00215AE' => 'Microsoft Reserved Partition (MSR)',
		'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7' => 'Microsoft Basic data partition',
		'5808C8AA-7E8F-42E0-85D2-E1E90434CFB3' => 'Microsoft Logical Disk Manager (LDM) metadata partition',
		'AF9B60A0-1431-4F62-BC68-3311714A69AD' => 'Microsoft Logical Disk Manager data partition',
		'DE94BBA4-06D1-4D40-A16A-BFD50179D6AC' => 'Windows Recovery Environment',
		'37AFFC90-EF7D-4E96-91C3-2D7AE055B174' => 'IBM General Parallel File System (GPFS) partition',
		'E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D' => 'Storage Spaces partition',
		'558D43C5-A1AC-43C0-AAC8-D1472B2923D1' => 'Storage Replica partition',
		'75894C1E-3AEB-11D3-B7C1-7B03A0000000' => 'HPUX Data partition',
		'E2A1E728-32E3-11D6-A682-7B03A0000000' => 'HPUX Service partition',
		'0FC63DAF-8483-4772-8E79-3D69D8477DE4' => 'Linux filesystem data',
		'A19D880F-05FC-4D3B-A006-743F0F84911E' => 'Linux RAID partition',
		'44479540-F297-41B2-9AF7-D131D5F0458A' => 'Linux Root partition (x86)',
		'4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709' => 'Linux Root partition (x86-64)',
		'69DAD710-2CE4-4E3C-B16C-21A1D49ABED3' => 'Linux Root partition (32-bit ARM)',
		'B921B045-1DF0-41C3-AF44-4C6F280D3FAE' => 'Linux Root partition (64-bit ARM/AArch64)',
		'BC13C2FF-59E6-4262-A352-B275FD6F7172' => 'Linux /boot partition',
		'0657FD6D-A4AB-43C4-84E5-0933C84B4F4F' => 'Linux Swap partition',
		'E6D6D379-F507-44C2-A23C-238F2A3DF928' => 'Logical Volume Manager (LVM) partition',
		'933AC7E1-2EB4-4F13-B844-0E14E2AEF915' => 'Linux /home partition',
		'3B8F8425-20E0-4F3B-907F-1A25A76F98E8' => 'Linux /srv (server data) partition',
		'7FFEC5C9-2D00-49B7-8941-3EA10A5586B7' => 'Linux Plain dm-crypt partition',
		'CA7D7CCB-63ED-4C53-861C-1742536059CC' => 'LUKS partition',
		'8DA63339-0007-60C0-C436-083AC8230908' => 'Linux Reserved',
		'83BD6B9D-7F41-11DC-BE0B-001560B84F0F' => 'FreeBSD Boot partition',
		'516E7CB4-6ECF-11D6-8FF8-00022D09712B' => 'FreeBSD disklabel partition',
		'516E7CB5-6ECF-11D6-8FF8-00022D09712B' => 'FreeBSD Swap partition',
		'516E7CB6-6ECF-11D6-8FF8-00022D09712B' => 'FreeBSD Unix File System (UFS) partition',
		'516E7CB8-6ECF-11D6-8FF8-00022D09712B' => 'FreeBSD Vinum volume manager partition',
		'516E7CBA-6ECF-11D6-8FF8-00022D09712B' => 'FreeBSD ZFS partition',
		'74BA7DD9-A689-11E1-BD04-00E081286ACF' => 'FreeBSD nandfs partition',
		'48465300-0000-11AA-AA11-00306543ECAC' => 'Hierarchical File System Plus (HFS+) partition',
		'7C3457EF-0000-11AA-AA11-00306543ECAC' => 'APFS FileVault volume container',
		'55465300-0000-11AA-AA11-00306543ECAC' => 'Apple UFS container',
		'52414944-0000-11AA-AA11-00306543ECAC' => 'Apple RAID partition',
		'52414944-5F4F-11AA-AA11-00306543ECAC' => 'Apple RAID partition, offline',
		'426F6F74-0000-11AA-AA11-00306543ECAC' => 'Apple Boot partition (Recovery HD)',
		'4C616265-6C00-11AA-AA11-00306543ECAC' => 'Apple Label',
		'5265636F-7665-11AA-AA11-00306543ECAC' => 'Apple TV Recovery partition',
		'53746F72-6167-11AA-AA11-00306543ECAC' => 'HFS+ FileVault volume container',
		'69646961-6700-11AA-AA11-00306543ECAC' => 'Apple APFS Preboot partition',
		'52637672-7900-11AA-AA11-00306543ECAC' => 'Apple APFS Recovery partition',
		'6A82CB45-1DD2-11B2-99A6-080020736631' => 'Solaris Boot partition',
		'6A85CF4D-1DD2-11B2-99A6-080020736631' => 'Solaris Root partition',
		'6A87C46F-1DD2-11B2-99A6-080020736631' => 'Solaris Swap partition',
		'6A8B642B-1DD2-11B2-99A6-080020736631' => 'Solaris Backup partition',
		'6A898CC3-1DD2-11B2-99A6-080020736631' => 'Solaris /usr partition',
		'6A8EF2E9-1DD2-11B2-99A6-080020736631' => 'Solaris /var partition',
		'6A90BA39-1DD2-11B2-99A6-080020736631' => 'Solaris /home partition',
		'6A9283A5-1DD2-11B2-99A6-080020736631' => 'Solaris Alternate sector',
		'6A945A3B-1DD2-11B2-99A6-080020736631' => 'Solaris Reserved partition',
		'49F48D32-B10E-11DC-B99B-0019D1879648' => 'NetBSD Swap partition',
		'49F48D5A-B10E-11DC-B99B-0019D1879648' => 'NetBSD FFS partition',
		'49F48D82-B10E-11DC-B99B-0019D1879648' => 'NetBSD LFS partition',
		'49F48DAA-B10E-11DC-B99B-0019D1879648' => 'NetBSD RAID partition',
		'2DB519C4-B10F-11DC-B99B-0019D1879648' => 'NetBSD Concatenated partition',
		'2DB519EC-B10F-11DC-B99B-0019D1879648' => 'NetBSD Encrypted partition',
		'FE3A2A5D-4F32-41A7-B725-ACCC3285A309' => 'Chrome OS kernel',
		'3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC' => 'Chrome OS rootfs',
		'CAB6E88E-ABF3-4102-A07A-D4BB9BE3C1D3' => 'Chrome OS firmware',
		'2E0A753D-9E48-43B0-8337-B15192CB1B5E' => 'Chrome OS future use',
		'09845860-705F-4BB5-B16C-8A8A099CAF52' => 'Chrome OS miniOS',
		'3F0F8318-F146-4E6B-8222-C28C8F02E0D5' => 'Chrome OS hibernate',
		'5DFBF5F4-2848-4BAC-AA5E-0D9A20B745A6' => '/usr partition (coreos-usr)',
		'3884DD41-8582-4404-B9A8-E9B84F2DF50E' => 'Resizable rootfs (coreos-resize)',
		'C95DC21A-DF0E-4340-8D7B-26CBFA9A03E0' => 'OEM customizations (coreos-reserved)',
		'BE9067B9-EA49-4F15-B4F6-F36F8C9E1818' => 'Root filesystem on RAID (coreos-root-raid)',
		'42465331-3BA3-10F1-802A-4861696B7521' => 'Haiku BFS',
		'85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7' => 'MidnightBSD Boot partition',
		'85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7' => 'MidnightBSD Data partition',
		'85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7' => 'MidnightBSD Swap partition',
		'0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7' => 'MidnightBSD Unix File System (UFS) partition',
		'85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7' => 'MidnightBSD Vinum volume manager partition',
		'85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7' => 'MidnightBSD ZFS partition',
		'45B0969E-9B03-4F30-B4C6-B4B80CEFF106' => 'Cepth Journal',
		'45B0969E-9B03-4F30-B4C6-5EC00CEFF106' => 'Cepth dm-crypt journal',
		'4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D' => 'Cepth OSD',
		'4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D' => 'Cepth dm-crypt OSD',
		'89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE' => 'Cepth Disk in creation',
		'89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE' => 'Cepth dm-crypt disk in creation',
		'CAFECAFE-9B03-4F30-B4C6-B4B80CEFF106' => 'Cepth Block',
		'30CD0809-C2B2-499C-8879-2D6B78529876' => 'Cepth Block DB',
		'5CE17FCE-4087-4169-B7FF-056CC58473F9' => 'Cepth Block write-ahead log',
		'FB3AABF9-D25F-47CC-BF5E-721D1816496B' => 'Cepth Lockbox for dm-crypt keys',
		'4FBD7E29-8AE0-4982-BF9D-5A8D867AF560' => 'Cepth Multipath OSD',
		'45B0969E-8AE0-4982-BF9D-5A8D867AF560' => 'Cepth Multipath journal',
		'CAFECAFE-8AE0-4982-BF9D-5A8D867AF560' => 'Cepth Multipath block',
		'7F4A666A-16F3-47A2-8445-152EF4D03F6C' => 'Cepth Multipath block',
		'EC6D6385-E346-45DC-BE91-DA2A7C8B3261' => 'Cepth Multipath block DB',
		'01B41E1B-002A-453C-9F17-88793989FF8F' => 'Cepth Multipath block write-ahead log',
		'CAFECAFE-9B03-4F30-B4C6-5EC00CEFF106' => 'Cepth dm-crypt block',
		'93B0052D-02D9-4D8A-A43B-33A3EE4DFBC3' => 'Cepth dm-crypt block DB',
		'306E8683-4FE2-4330-B7C0-00A917C16966' => 'Cepth dm-crypt block write-ahead log',
		'45B0969E-9B03-4F30-B4C6-35865CEFF106' => 'Cepth dm-crypt LUKS journal',
		'CAFECAFE-9B03-4F30-B4C6-35865CEFF106' => 'Cepth dm-crypt LUKS block',
		'166418DA-C469-4022-ADF4-B30AFD37F176' => 'Cepth dm-crypt LUKS block DB',
		'86A32090-3647-40B9-BBBD-38D8C573AA86' => 'Cepth dm-crypt LUKS block write-ahead log',
		'4FBD7E29-9D25-41B8-AFD0-35865CEFF05D' => 'Cepth dm-crypt LUKS OSD',
		'824CC7A0-36A8-11E3-890A-952519AD3F61' => 'OpenBSD Data partition',
		'CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1' => 'Power-safe (QNX6) file system',
		'C91818F9-8025-47AF-89D2-F030D7000C2C' => 'Plan 9 partition',
		'9D275380-40AD-11DB-BF97-000C2911D1B8' => 'vmkcore (coredump partition)',
		'AA31E02A-400F-11DB-9590-000C2911D1B8' => 'VMFS filesystem partition',
		'9198EFFC-31C0-11DB-8F78-000C2911D1B8' => 'VMware Reserved',
		'2568845D-2332-4675-BC39-8FA5A4748D15' => 'Android-x86 Bootloader',
		'114EAFFE-1552-4022-B26E-9B053604CF84' => 'Android-x86 Bootloader2',
		'49A4D17F-93A3-45C1-A0DE-F50B2EBE2599' => 'Android-x86 Boot',
		'4177C722-9E92-4AAB-8644-43502BFD5506' => 'Android-x86 Recovery',
		'EF32A33B-A409-486C-9141-9FFB711F6266' => 'Android-x86 Misc',
		'20AC26BE-20B7-11E3-84C5-6CFDB94711E9' => 'Android-x86 Metadata',
		'38F428E6-D326-425D-9140-6E0EA133647C' => 'Android-x86 System',
		'A893EF21-E428-470A-9E55-0668FD91A2D9' => 'Android-x86 Cache',
		'DC76DDA9-5AC1-491C-AF42-A82591580C0D' => 'Android-x86 Data',
		'EBC597D0-2053-4B15-8B64-E0AAC75F4DB1' => 'Android-x86 Persistent',
		'C5A0AEEC-13EA-11E5-A1B1-001E67CA0C3C' => 'Android-x86 Vendor',
		'BD59408B-4514-490D-BF12-9878D963F378' => 'Android-x86 Config',
		'8F68CC74-C5E5-48DA-BE91-A0C8C15E9C80' => 'Android-x86 Factory',
		'9FDAA6EF-4B3F-40D2-BA8D-BFF16BFB887B' => 'Android-x86 Factory (alt)',
		'767941D0-2085-11E3-AD3B-6CFDB94711E9' => 'Android-x86 Fastboot / Tertiary',
		'AC6D7924-EB71-4DF8-B48D-E267B27148FF' => 'Android-x86 OEM',
		'19A710A2-B3CA-11E4-B026-10604B889DCF' => 'Android Meta',
		'193D1EA4-B3CA-11E4-B075-10604B889DCF' => 'Android EXT',
		'7412F7D5-A156-4B13-81DC-867174929325' => 'ONIE Boot',
		'D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149' => 'ONIE Config',
		'9E1A2D38-C612-4316-AA26-8B49521E5A8B' => 'PReP boot',
		'734E5AFE-F61A-11E6-BC64-92361F002671' => 'Atari TOS Basic data partition (GEM, BGM, F32)',
		'8C8F8EFF-AC95-4770-814A-21994F2DBC8F' => 'VeraCrypt Encrypted data',
		'90B6FF38-B98F-4358-A21F-48F35B4A8AD3' => 'ArcaOS Type 1',
		'7C5222BD-8F5D-4087-9C00-BF9843C7B58C' => 'SPDK block device',
		'4778ED65-BF42-45FA-9C5B-287A1DC4AAB1' => 'barebox-state',
		'3DE21764-95BD-54BD-A5C3-4ABE786F38A8' => 'U-Boot environment',
		'B6FA30DA-92D2-4A9A-96F1-871EC6486200' => 'SoftRAID_Status',
		'2E313465-19B9-463F-8126-8A7993773801' => 'SoftRAID_Scratch',
		'FA709C7E-65B1-4593-BFD5-E71D61DE9B02' => 'SoftRAID_Volume',
		'BBBA6DF5-F46F-4A89-8F59-8765B2727503' => 'SoftRAID_Cache',
		'FE8A2634-5E2E-46BA-99E3-3A192091A350' => 'Fuchsia Bootloader (slot A/B/R)',
		'D9FD4535-106C-4CEC-8D37-DFC020CA87CB' => 'Fuchsia Durable mutable encrypted system data',
		'A409E16B-78AA-4ACC-995C-302352621A41' => 'Fuchsia Durable mutable bootloader data (including A/B/R metadata)',
		'F95D940E-CABA-4578-9B93-BB6C90F29D3E' => 'Fuchsia Factory-provisioned read-only system data',
		'10B8DBAA-D2BF-42A9-98C6-A7C5DB3701E7' => 'Fuchsia Factory-provisioned read-only bootloader data',
		'49FD7CB8-DF15-4E73-B9D9-992070127F0F' => 'Fuchsia Volume Manager',
		'421A8BFC-85D9-4D85-ACDA-B64EEC0133E9' => 'Fuchsia Verified boot metadata (slot A/B/R)',
		'9B37FFF6-2E58-466A-983A-F7926D0B04E0' => 'Fuchsia Zircon boot image (slot A/B/R)',
	];

}