mirror of
https://github.com/Icinga/icingadb-web.git
synced 2026-05-28 04:36:06 -04:00
This was easy because only README.md and doc/01-About.md were redacted manually, everything else via: git ls-files -z |xargs -0 perl -pi -e 's/Icinga GmbH \| GPLv2/Icinga GmbH | GPLv2+/' This is legal because we have only merged PRs with label:cla/signed or made by Icinga staff: https://github.com/Icinga/icingadb-web/pulls?page=1&q=is%3Apr+is%3Aclosed+-label%3Acla%2Fsigned+-author%3Anilmerg This has no risk for us in people distributing their own version under GPLv3 only. After all, we won't take their patches anyway, unless they sign our CLA. This is the cleanest solution for having e.g. these in one address space: * Icinga Web, GPLv2+ * K8s Web, AGPLv3 * Thirdparty, some LGPLv3 and Apache-2.0 Apropos, K8s Web is even v3-licensed on purpose, to have a stronger protection against cloud ops.
348 lines
11 KiB
PHP
348 lines
11 KiB
PHP
<?php
|
|
|
|
/* Icinga DB Web | (c) 2021 Icinga GmbH | GPLv2+ */
|
|
|
|
namespace Icinga\Module\Icingadb\Command\Renderer;
|
|
|
|
use Icinga\Module\Icingadb\Command\IcingaApiCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\GetObjectCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\ScheduleDowntimeCommand;
|
|
use Icinga\Module\Icingadb\Model\Host;
|
|
use Icinga\Module\Icingadb\Model\Service;
|
|
use Icinga\Module\Icingadb\Command\Instance\ToggleInstanceFeatureCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\AcknowledgeProblemCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\AddCommentCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\DeleteCommentCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\DeleteDowntimeCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\ProcessCheckResultCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\RemoveAcknowledgementCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\ScheduleCheckCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\SendCustomNotificationCommand;
|
|
use Icinga\Module\Icingadb\Command\Object\ToggleObjectFeatureCommand;
|
|
use Icinga\Module\Icingadb\Command\IcingaCommand;
|
|
use InvalidArgumentException;
|
|
use ipl\Orm\Model;
|
|
use LogicException;
|
|
use Traversable;
|
|
|
|
/**
|
|
* Icinga command renderer for the Icinga command file
|
|
*/
|
|
class IcingaApiCommandRenderer implements IcingaCommandRendererInterface
|
|
{
|
|
/**
|
|
* Name of the Icinga application object
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $app = 'app';
|
|
|
|
/**
|
|
* Get the name of the Icinga application object
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getApp(): string
|
|
{
|
|
return $this->app;
|
|
}
|
|
|
|
/**
|
|
* Set the name of the Icinga application object
|
|
*
|
|
* @param string $app
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setApp(string $app): self
|
|
{
|
|
$this->app = $app;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Apply filter to query data
|
|
*
|
|
* @param array $data
|
|
* @param Traversable<Model> $objects
|
|
*
|
|
* @return ?Model Any of the objects (useful for further type-dependent handling)
|
|
*/
|
|
protected function applyFilter(array &$data, Traversable $objects): ?Model
|
|
{
|
|
$object = null;
|
|
|
|
foreach ($objects as $object) {
|
|
if ($object instanceof Service) {
|
|
$data['services'][] = sprintf('%s!%s', $object->host->name, $object->name);
|
|
} else {
|
|
$data['hosts'][] = $object->name;
|
|
}
|
|
}
|
|
|
|
return $object;
|
|
}
|
|
|
|
/**
|
|
* Get the sub-route of the endpoint for an object
|
|
*
|
|
* @param Model $object
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function getObjectPluralType(Model $object): string
|
|
{
|
|
if ($object instanceof Host) {
|
|
return 'hosts';
|
|
}
|
|
|
|
if ($object instanceof Service) {
|
|
return 'services';
|
|
}
|
|
|
|
throw new LogicException(sprintf('Invalid object type %s provided', get_class($object)));
|
|
}
|
|
|
|
/**
|
|
* Render a command
|
|
*
|
|
* @param IcingaCommand $command
|
|
*
|
|
* @return IcingaApiCommand
|
|
*/
|
|
public function render(IcingaCommand $command): IcingaApiCommand
|
|
{
|
|
$renderMethod = 'render' . $command->getName();
|
|
if (! method_exists($this, $renderMethod)) {
|
|
throw new InvalidArgumentException(
|
|
sprintf('Can\'t render command. Method %s not found', $renderMethod)
|
|
);
|
|
}
|
|
|
|
return $this->$renderMethod($command);
|
|
}
|
|
|
|
public function renderGetObject(GetObjectCommand $command): IcingaApiCommand
|
|
{
|
|
$data = [
|
|
'all_joins' => 1,
|
|
'attrs' => $command->getAttributes()
|
|
];
|
|
|
|
$endpoint = 'objects/' . $this->getObjectPluralType($this->applyFilter($data, $command->getObjects()));
|
|
|
|
return IcingaApiCommand::create($endpoint, $data)->setMethod('GET');
|
|
}
|
|
|
|
public function renderAddComment(AddCommentCommand $command): IcingaApiCommand
|
|
{
|
|
$endpoint = 'actions/add-comment';
|
|
$data = [
|
|
'author' => $command->getAuthor(),
|
|
'comment' => $command->getComment()
|
|
];
|
|
|
|
if ($command->getExpireTime() !== null) {
|
|
$data['expiry'] = $command->getExpireTime();
|
|
}
|
|
|
|
$this->applyFilter($data, $command->getObjects());
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
|
|
public function renderSendCustomNotification(SendCustomNotificationCommand $command): IcingaApiCommand
|
|
{
|
|
$endpoint = 'actions/send-custom-notification';
|
|
$data = [
|
|
'author' => $command->getAuthor(),
|
|
'comment' => $command->getComment(),
|
|
'force' => $command->getForced()
|
|
];
|
|
|
|
$this->applyFilter($data, $command->getObjects());
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
|
|
public function renderProcessCheckResult(ProcessCheckResultCommand $command): IcingaApiCommand
|
|
{
|
|
$endpoint = 'actions/process-check-result';
|
|
$data = [
|
|
'exit_status' => $command->getStatus(),
|
|
'plugin_output' => $command->getOutput(),
|
|
'performance_data' => $command->getPerformanceData()
|
|
];
|
|
|
|
$this->applyFilter($data, $command->getObjects());
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
|
|
public function renderScheduleCheck(ScheduleCheckCommand $command): IcingaApiCommand
|
|
{
|
|
$endpoint = 'actions/reschedule-check';
|
|
$data = [
|
|
'next_check' => $command->getCheckTime(),
|
|
'force' => $command->getForced()
|
|
];
|
|
|
|
$this->applyFilter($data, $command->getObjects());
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
|
|
public function renderScheduleDowntime(ScheduleDowntimeCommand $command): IcingaApiCommand
|
|
{
|
|
$endpoint = 'actions/schedule-downtime';
|
|
$data = [
|
|
'author' => $command->getAuthor(),
|
|
'comment' => $command->getComment(),
|
|
'start_time' => $command->getStart(),
|
|
'end_time' => $command->getEnd(),
|
|
'duration' => $command->getDuration(),
|
|
'fixed' => $command->getFixed(),
|
|
'trigger_name' => $command->getTriggerId(),
|
|
'child_options' => $command->getChildOption()
|
|
];
|
|
|
|
if ($command->getForAllServices()) {
|
|
$data['all_services'] = true;
|
|
}
|
|
|
|
$this->applyFilter($data, $command->getObjects());
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
|
|
public function renderAcknowledgeProblem(AcknowledgeProblemCommand $command): IcingaApiCommand
|
|
{
|
|
$endpoint = 'actions/acknowledge-problem';
|
|
$data = [
|
|
'author' => $command->getAuthor(),
|
|
'comment' => $command->getComment(),
|
|
'sticky' => $command->getSticky(),
|
|
'notify' => $command->getNotify(),
|
|
'persistent' => $command->getPersistent()
|
|
];
|
|
|
|
if ($command->getExpireTime() !== null) {
|
|
$data['expiry'] = $command->getExpireTime();
|
|
}
|
|
|
|
$this->applyFilter($data, $command->getObjects());
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
|
|
public function renderToggleObjectFeature(ToggleObjectFeatureCommand $command): IcingaApiCommand
|
|
{
|
|
switch ($command->getFeature()) {
|
|
case ToggleObjectFeatureCommand::FEATURE_ACTIVE_CHECKS:
|
|
$attr = 'enable_active_checks';
|
|
break;
|
|
case ToggleObjectFeatureCommand::FEATURE_PASSIVE_CHECKS:
|
|
$attr = 'enable_passive_checks';
|
|
break;
|
|
case ToggleObjectFeatureCommand::FEATURE_NOTIFICATIONS:
|
|
$attr = 'enable_notifications';
|
|
break;
|
|
case ToggleObjectFeatureCommand::FEATURE_EVENT_HANDLER:
|
|
$attr = 'enable_event_handler';
|
|
break;
|
|
case ToggleObjectFeatureCommand::FEATURE_FLAP_DETECTION:
|
|
$attr = 'enable_flapping';
|
|
break;
|
|
default:
|
|
throw new InvalidArgumentException($command->getFeature());
|
|
}
|
|
|
|
$endpoint = 'objects/';
|
|
$objects = $command->getObjects();
|
|
|
|
$data = [
|
|
'attrs' => [
|
|
$attr => $command->getEnabled()
|
|
]
|
|
];
|
|
|
|
|
|
$endpoint .= $this->getObjectPluralType($this->applyFilter($data, $objects));
|
|
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
|
|
public function renderDeleteComment(DeleteCommentCommand $command): IcingaApiCommand
|
|
{
|
|
$comments = [];
|
|
|
|
foreach ($command->getObjects() as $object) {
|
|
$comments[] = $object->name;
|
|
}
|
|
|
|
$endpoint = 'actions/remove-comment';
|
|
$data = [
|
|
'author' => $command->getAuthor(),
|
|
'comments' => $comments
|
|
];
|
|
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
|
|
public function renderDeleteDowntime(DeleteDowntimeCommand $command): IcingaApiCommand
|
|
{
|
|
$downtimes = [];
|
|
|
|
foreach ($command->getObjects() as $object) {
|
|
$downtimes[] = $object->name;
|
|
}
|
|
|
|
$endpoint = 'actions/remove-downtime';
|
|
$data = [
|
|
'author' => $command->getAuthor(),
|
|
'downtimes' => $downtimes
|
|
];
|
|
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
|
|
public function renderRemoveAcknowledgement(RemoveAcknowledgementCommand $command): IcingaApiCommand
|
|
{
|
|
$endpoint = 'actions/remove-acknowledgement';
|
|
$data = ['author' => $command->getAuthor()];
|
|
|
|
$this->applyFilter($data, $command->getObjects());
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
|
|
public function renderToggleInstanceFeature(ToggleInstanceFeatureCommand $command): IcingaApiCommand
|
|
{
|
|
$endpoint = 'objects/icingaapplications/' . $this->getApp();
|
|
|
|
switch ($command->getFeature()) {
|
|
case ToggleInstanceFeatureCommand::FEATURE_ACTIVE_HOST_CHECKS:
|
|
$attr = 'enable_host_checks';
|
|
break;
|
|
case ToggleInstanceFeatureCommand::FEATURE_ACTIVE_SERVICE_CHECKS:
|
|
$attr = 'enable_service_checks';
|
|
break;
|
|
case ToggleInstanceFeatureCommand::FEATURE_EVENT_HANDLERS:
|
|
$attr = 'enable_event_handlers';
|
|
break;
|
|
case ToggleInstanceFeatureCommand::FEATURE_FLAP_DETECTION:
|
|
$attr = 'enable_flapping';
|
|
break;
|
|
case ToggleInstanceFeatureCommand::FEATURE_NOTIFICATIONS:
|
|
$attr = 'enable_notifications';
|
|
break;
|
|
case ToggleInstanceFeatureCommand::FEATURE_PERFORMANCE_DATA:
|
|
$attr = 'enable_perfdata';
|
|
break;
|
|
default:
|
|
throw new InvalidArgumentException($command->getFeature());
|
|
}
|
|
|
|
$data = [
|
|
'attrs' => [
|
|
$attr => $command->getEnabled()
|
|
]
|
|
];
|
|
|
|
return IcingaApiCommand::create($endpoint, $data);
|
|
}
|
|
}
|