summaryrefslogtreecommitdiffstats
path: root/modules-available/statistics/inc/hardwareinfo.inc.php
blob: 41033f55e18d6f2c227d9148d1c05d69f97e5ec2 (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
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
<?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 and initrd changes 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 getKclInitRdModifications(array &$initRds, ?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)
			return '';
		$kcl = '';
		if (((int)$best['locationid']) === 0) {
			$passthrough = [];
		} else {
			// Passthrough/GVT-g only settable for locations, don't bother if machine doesn't belong to one
			$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
			// We hard-code @PASSTHROUGH for now
			$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') {
					// Doesn't need more specific information regarding PCI ID, just one KCL option
					$gvt = true;
				} else {
					// Remember device id to passthrough later
					$passthrough[$row['vendor'] . ':' . $row['device']] = 1;
					// But also remember slot, as we want to pass through all related devices/functions in same slot
					$slots[preg_replace('/\.[0-9]+$/', '', $row['slot'])] = 1;
				}
			}
			if ($gvt || !empty($passthrough)) {
				// GVT-g or passthrough - enable iommu
				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)) {
				// Now iterate over all slots and pass through any additional related devices
				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[strtolower($row['vendor'] . ':' . $row['device'])] = 1;
						//error_log('Extra PT: ' . $row['vendor'] . ':' . $row['device']);
					}
				}
				// Add vfio option with all pciids to kcl
				$kcl .= ' vfio-pci.ids=' . implode(',', array_keys($passthrough));
			}
			if ($gvt) {
				// GVT-g is simple :-)
				$kcl .= ' i915.enable_gvt=1';
			}
		}
		// See if there's an addon in the initrd list. If so, check its condition via the helper function.
		// If the condition doesn't match, remove the initrd.
		foreach (array_keys($initRds) as $idx) {
			$name = $initRds[$idx];
			if (!preg_match('/^addon-[^_]*_(.*)$/', $name, $m))
				continue;
			$rules = explode('_', $m[1]);
			$keep = false;
			foreach ($rules as $rule) {
				// addon-nvidia_pci-v10de-dxxxx
				if (self::initrdRuleMatches($best['machineuuid'], $rule, $passthrough)) {
					$keep = true;
					break;
				}
			}
			if (!$keep) {
				unset($initRds[$idx]);
			}
		}
		return $kcl;
	}

	private static function initrdRuleMatches(string $uuid, string $rule, array $passthrough): bool
	{
		if (preg_match('/^pci-v([0-9a-fx]{4})-d([0-9a-fx]{4})$/', $rule, $out)) {
			// Rule matching a PCI-ID
			$hw = new HardwareQuery(self::PCI_DEVICE, $uuid, true);
			$col = $hw->addGlobalColumn('vendor');
			if ($out[1] !== 'xxxx') {
				$col->addCondition('LIKE', str_replace('x', '_', $out[1]));
			}
			$col = $hw->addGlobalColumn('device');
			if ($out[2] !== 'xxxx') {
				$col->addCondition('LIKE', str_replace('x', '_', $out[2]));
			}
			foreach ($hw->query() as $row) {
				$id = strtolower($row['vendor'] . ':' . $row['device']);
				if (isset($passthrough[$id]))
					continue;
				return true; // Got a match not passed through, done
			}
		}
		// Unsupported rule type? Remove!
		return false;
	}

	// 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)',
	];

}