icingaweb2-module-director/application/forms/IcingaHostSelfServiceForm.php

138 lines
4.0 KiB
PHP

<?php
namespace Icinga\Module\Director\Forms;
use Icinga\Exception\NotFoundError;
use Icinga\Module\Director\Db;
use Icinga\Module\Director\Objects\IcingaHost;
use Icinga\Module\Director\Web\Form\DirectorForm;
use Icinga\Security\SecurityException;
class IcingaHostSelfServiceForm extends DirectorForm
{
/** @var string */
private $hostApiKey;
/** @var IcingaHost */
private $template;
private $hostName;
public function setup()
{
if ($this->hostName === null) {
$this->addElement('text', 'object_name', array(
'label' => $this->translate('Host name'),
'required' => true,
'value' => $this->hostName,
));
}
$this->addElement('text', 'display_name', array(
'label' => $this->translate('Alias'),
));
$this->addElement('text', 'address', array(
'label' => $this->translate('Host address'),
'description' => $this->translate(
'Host address. Usually an IPv4 address, but may be any kind of address'
. ' your check plugin is able to deal with'
)
));
$this->addElement('text', 'address6', array(
'label' => $this->translate('IPv6 address'),
'description' => $this->translate('Usually your hosts main IPv6 address')
));
if ($this->template === null) {
$this->addElement('text', 'key', array(
'label' => $this->translate('API Key'),
'ignore' => true,
'required' => true,
));
}
$this->submitLabel = sprintf(
$this->translate('Register')
);
}
public function setHostName($name)
{
$this->hostName = $name;
$this->removeElement('object_name');
return $this;
}
public function loadTemplateWithApiKey($key)
{
$this->template = IcingaHost::loadWithApiKey($key, $this->getDb());
if (! $this->template->isTemplate()) {
throw new NotFoundError('Got invalid API key "%s"', $key);
}
if ($this->template->getResolvedProperty('has_agent') !== 'y') {
throw new NotFoundError(
'Got valid API key "%s", but template is not for Agents',
$key
);
}
$this->removeElement('key');
return $this->template;
}
public function onSuccess()
{
$db = $this->getDb();
if ($this->template === null) {
$this->loadTemplateWithApiKey($this->getValue('key'));
}
$name = $this->hostName ?: $this->getValue('object_name');
if (IcingaHost::exists($name, $db)) {
$host = IcingaHost::load($name, $db);
if ($host->isTemplate()) {
throw new SecurityException(
'You are not allowed to create "%s"',
$name
);
}
if (null !== $host->getProperty('api_key')) {
throw new SecurityException(
'The host "%s" has already been registered',
$name
);
}
$propertyNames = ['display_name', 'address', 'address6'];
foreach ($propertyNames as $property) {
$host->set($property, $this->getValue($property));
}
} else {
$host = IcingaHost::create(array_filter($this->getValues(), 'strlen'), $db);
$host->set('object_name', $name);
$host->set('object_type', 'object');
$host->set('imports', [$this->template]);
}
$key = $host->generateApiKey();
$host->store($db);
$this->hostApiKey = $key;
}
/**
* @return string|null
*/
public function getHostApiKey()
{
return $this->hostApiKey;
}
public static function create(Db $db)
{
return static::load()->setDb($db);
}
}