diff options
Diffstat (limited to 'application/controllers/GraphController.php')
-rw-r--r-- | application/controllers/GraphController.php | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/application/controllers/GraphController.php b/application/controllers/GraphController.php new file mode 100644 index 0000000..c8dc7db --- /dev/null +++ b/application/controllers/GraphController.php @@ -0,0 +1,172 @@ +<?php + +namespace Icinga\Module\Graphite\Controllers; + +use Icinga\Exception\Http\HttpBadRequestException; +use Icinga\Exception\Http\HttpNotFoundException; +use Icinga\Module\Graphite\Graphing\GraphingTrait; +use Icinga\Module\Graphite\Util\IcingadbUtils; +use Icinga\Module\Graphite\Web\Widget\Graphs; +use Icinga\Module\Icingadb\Model\Host; +use Icinga\Module\Icingadb\Model\Service; +use Icinga\Web\Controller; +use Icinga\Web\UrlParams; +use ipl\Orm\Model; +use ipl\Stdlib\Filter; + +class GraphController extends Controller +{ + use GraphingTrait; + + /** + * The URL parameters for the graph + * + * @var string[] + */ + protected $graphParamsNames = [ + 'start', 'end', + 'width', 'height', + 'legend', + 'template', 'default_template', + 'bgcolor', 'fgcolor', + 'majorGridLineColor', 'minorGridLineColor' + ]; + + /** + * The URL parameters for metrics filtering + * + * @var UrlParams + */ + protected $filterParams; + + /** + * The URL parameters for the graph + * + * @var string[] + */ + protected $graphParams = []; + + public function init() + { + parent::init(); + + $this->filterParams = clone $this->getRequest()->getUrl()->getParams(); + + foreach ($this->graphParamsNames as $paramName) { + $this->graphParams[$paramName] = $this->filterParams->shift($paramName); + } + } + + public function serviceAction() + { + $hostName = $this->filterParams->getRequired('host.name'); + $serviceName = $this->filterParams->getRequired('service.name'); + $icingadbUtils = IcingadbUtils::getInstance(); + $query = Service::on($icingadbUtils->getDb()) + ->with('state') + ->with('host'); + + $query->filter(Filter::all( + Filter::equal('service.name', $serviceName), + Filter::equal('service.host.name', $hostName) + )); + + $icingadbUtils->applyRestrictions($query); + + /** @var Service $service */ + $service = $query->first(); + + if ($service === null) { + throw new HttpNotFoundException($this->translate('No such service')); + } + + $checkCommandColumn = $service->vars[Graphs::getObscuredCheckCommandCustomVar()] ?? null; + + $this->supplyImage( + $service, + $service->checkcommand_name, + $checkCommandColumn + ); + } + + public function hostAction() + { + $hostName = $this->filterParams->getRequired('host.name'); + $icingadbUtils = IcingadbUtils::getInstance(); + $query = Host::on($icingadbUtils->getDb())->with('state'); + $query->filter(Filter::equal('host.name', $hostName)); + + $icingadbUtils->applyRestrictions($query); + + /** @var Host $host */ + $host = $query->first(); + + if ($host === null) { + throw new HttpNotFoundException($this->translate('No such host')); + } + + $checkCommandColumn = $host->vars[Graphs::getObscuredCheckCommandCustomVar()] ?? null; + + $this->supplyImage( + $host, + $host->checkcommand_name, + $checkCommandColumn + ); + } + + /** + * Do all monitored object type independent actions + * + * @param Model $object The object to render the graphs for + * @param string $checkCommand The check command of the object we supply an image for + * @param string|null $obscuredCheckCommand The "real" check command (if any) of the object we + * display graphs for + */ + protected function supplyImage($object, $checkCommand, $obscuredCheckCommand) + { + if (isset($this->graphParams['default_template'])) { + $urlParam = 'default_template'; + $templates = $this->getAllTemplates()->getDefaultTemplates(); + } else { + $urlParam = 'template'; + $templates = $this->getAllTemplates()->getTemplates( + $obscuredCheckCommand === null ? $checkCommand : $obscuredCheckCommand + ); + } + + if (! isset($templates[$this->graphParams[$urlParam]])) { + throw new HttpNotFoundException($this->translate('No such template')); + } + + $charts = $templates[$this->graphParams[$urlParam]]->getCharts( + static::getMetricsDataSource(), + $object, + array_map('rawurldecode', $this->filterParams->toArray(false)) + ); + + switch (count($charts)) { + case 0: + throw new HttpNotFoundException($this->translate('No such graph')); + + case 1: + $charts[0] + ->setFrom($this->graphParams['start']) + ->setUntil($this->graphParams['end']) + ->setWidth($this->graphParams['width']) + ->setHeight($this->graphParams['height']) + ->setBackgroundColor($this->graphParams['bgcolor']) + ->setForegroundColor($this->graphParams['fgcolor']) + ->setMajorGridLineColor($this->graphParams['majorGridLineColor']) + ->setMinorGridLineColor($this->graphParams['minorGridLineColor']) + ->setShowLegend((bool) $this->graphParams['legend']) + ->serveImage($this->getResponse()); + + // not falling through, serveImage exits + default: + throw new HttpBadRequestException('%s', $this->translate( + 'Graphite Web yields more than one metric for the given filter.' + . ' Please specify a more precise filter.' + )); + } + } +} |