summaryrefslogtreecommitdiffstats
path: root/modules-available/serversetup-bwlp-ipxe/inc/ipxebuilder.inc.php
blob: a2b25f55b21c41295398c322da32706afa10605b (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
<?php

class IPxeBuilder
{

	const PROP_IPXE_BUILDSTRING = 'ipxe.compile-time';
	const PROP_IPXE_HASH = 'ipxe.commit-hash';
	const PROP_IPXE_COMPILE_TASKID = 'ipxe-task-id';
	const VERSION_LIST_TASK = 'ipxe-version-list-id';
	const PROP_VERSION_SELECT_TASKID = 'ipxe-version-select-id';

	/**
	 * Checkout given commit/ref of ipxe repo. Returns the according task-id, or null on error
	 *
	 * @param string $version version ref (commit, tag, ...)
	 * @param ?string $parent parent task id, if any
	 */
	public static function setIpxeVersion(string $version, ?string $parent = null): ?string
	{
		$task = Taskmanager::submit('IpxeVersion', [
			'action' => 'CHECKOUT',
			'ref' => $version,
			'parentTask' => $parent,
		]);
		if (!Taskmanager::isTask($task))
			return null;
		TaskmanagerCallback::addCallback($task, 'ipxeVersionSet');
		Property::set(IPxeBuilder::PROP_VERSION_SELECT_TASKID, $task['id'], 2);
		return $task['id'];
	}

	public static function getVersionTaskResult(): ?array
	{
		$task = Taskmanager::status(IPxeBuilder::VERSION_LIST_TASK);
		if (!Taskmanager::isTask($task) || Taskmanager::isFailed($task)) {
			$task = Taskmanager::submit('IpxeVersion',
				['id' => IPxeBuilder::VERSION_LIST_TASK, 'action' => 'LIST']);
		}
		$task = Taskmanager::waitComplete($task);
		if (Taskmanager::isFinished($task) && !Taskmanager::isFailed($task)) {
			return $task['data'];
		}
		return null;
	}

	/**
	 * Callback when compile Taskmanager job finished
	 */
	public static function compileCompleteCallback(array $task): void
	{
		if (!Taskmanager::isFinished($task) || Taskmanager::isFailed($task))
			return;
		$version = 'Unknown';
		if (isset($task['data']['hash'])) {
			$hash = $task['data']['hash'];
			Property::set(IPxeBuilder::PROP_IPXE_HASH, $hash);
			$version = $hash;
			$list = IPxeBuilder::getVersionTaskResult();
			if (isset($list['versions'])) {
				foreach ($list['versions'] as $v) {
					if ($v['hash'] === $version) {
						// Do NOT change (see below)
						$version = date('Y-m-d H:i', $v['date']) . ' (' . substr($version, 0, 7) . ')';
						break;
					}
				}
			}
		}
		// Do NOT change the format of this string -- we depend on it in ScriptBuilderIpxe::output()
		$buildString = date('d.m.Y H:i') . ', Version: ' . $version;
		Property::set(IPxeBuilder::PROP_IPXE_BUILDSTRING, $buildString);
	}

	public static function setIPxeVersionCallback(array $task): void
	{
		if (!Taskmanager::isFinished($task) || Taskmanager::isFailed($task) || empty($task['data']['ref']))
			return;
		Property::set(IPxeBuilder::PROP_IPXE_HASH, $task['data']['ref']);
	}
}