pandorafms/pandora_console/mobile/operation/module_graph.php

392 lines
11 KiB
PHP

<?php
// Pandora FMS - http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2010 Artica Soluciones Tecnologicas
// Please see http://pandorafms.org for full contribution list
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation for version 2.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
class ModuleGraph {
private $correct_acl = false;
private $acl = "AR";
private $id = 0;
private $id_agent = 0;
private $graph_type = "sparse";
private $period = SECONDS_1DAY;
private $draw_events = 0;
private $width = 0;
private $height = 0;
private $draw_alerts = 0;
private $start_date = 0;
private $time_compare_separated = 0;
private $time_compare_overlapped = 0;
private $unknown_graph = 1;
private $zoom = 1;
private $baseline = 0;
private $module = null;
function __construct() {
$system = System::getInstance();
$this->start_date = date("Y-m-d");
if ($system->checkACL($this->acl)) {
$this->correct_acl = true;
}
else {
$this->correct_acl = false;
}
}
private function getFilters() {
$system = System::getInstance();
$this->id = (int)$system->getRequest('id', 0);
$this->id_agent = (int)$system->getRequest('id_agent', 0);
$this->module = modules_get_agentmodule($this->id);
$this->graph_type = return_graphtype($this->module["id_tipo_modulo"]);
$period_hours = $system->getRequest('period_hours', false);
if ($period_hours == false) {
$this->period = SECONDS_1DAY;
}
else {
$this->period = $period_hours * SECONDS_1HOUR;
}
$this->draw_events = (int)$system->getRequest('draw_events', 0);
$this->draw_alerts = (int)$system->getRequest('draw_alerts', 0);
$this->start_date = $system->getRequest('start_date', false);
if ($this->start_date === false) {
$this->start_date = date("Y-m-d");
}
else {
$this->start_date = date("Y-m-d", strtotime($this->start_date));
}
$this->time_compare_separated = (int)$system->getRequest('time_compare_separated', 0);
$this->time_compare_overlapped = (int)$system->getRequest('time_compare_overlapped', 0);
$this->unknown_graph = (int)$system->getRequest('unknown_graph', 0);
$this->zoom = (int)$system->getRequest('zoom', 1);
$this->baseline = (int)$system->getRequest('baseline', 0);
$this->width = (int)$system->getRequest('width', 0);
$this->width -= 20; //Correct the width
$this->height = (int)$system->getRequest('height', 0);
//Sancho says "put the height to 1/2 for to make more beautyful"
$this->height = $this->height / 1.5;
$this->height -= 80; //Correct the height
//For to avoid fucking IPHONES when they are in horizontal.
if ($this->height < 140) {
$this->height = 140;
}
}
public function ajax($parameter2 = false) {
global $config;
$system = System::getInstance();
if (!$this->correct_acl) {
return;
}
else {
switch ($parameter2) {
case 'get_graph':
$this->getFilters();
$correct = 0;
$graph = '';
$correct = 1;
$label = $this->module["nombre"];
$unit = db_get_value('unit', 'tagente_modulo',
'id_agente_modulo', $this->id);
$utime = get_system_time ();
$current = date("Y-m-d", $utime);
if ($this->start_date != $current)
$date = strtotime($this->start_date);
else
$date = $utime;
$urlImage = ui_get_full_url(false);
$time_compare = false;
if ($this->time_compare_separated) {
$time_compare = 'separated';
}
else if ($this->time_compare_overlapped) {
$time_compare = 'overlapped';
}
ob_start();
switch ($this->graph_type) {
case 'boolean':
case 'sparse':
case 'string':
$params =array(
'agent_module_id' => $this->id,
'period' => $this->period,
'show_events' => $this->draw_events,
'width' => $this->width,
'height' => $this->height,
'show_alerts' => $this->draw_alerts,
'date' => $date,
'unit' => $unit,
'baseline' => $this->baseline,
'homeurl' => $urlImage,
'adapt_key' => 'adapter_' . $this->graph_type,
'compare' => $time_compare,
'show_unknown' => $this->unknown_graph,
'menu' => false,
'type_graph' => $config['type_module_charts'],
'vconsole' => true
);
$graph = grafico_modulo_sparse($params);
if ($this->draw_events) {
$graph .= '<br>';
$graph .= graphic_module_events($this->id,
$this->width, $this->height,
$this->period, $config['homeurl'],
$this->zoom, 'adapted_'.$this->graph_type, $date);
}
break;
default:
$graph .= fs_error_image ('../images');
break;
}
$graph = ob_get_clean() . $graph;
echo json_encode(array('correct' => $correct, 'graph' => $graph));
break;
}
}
}
public function show() {
if (!$this->correct_acl) {
$this->show_fail_acl();
}
else {
$this->getFilters();
$this->showModuleGraph();
}
}
private function show_fail_acl() {
$error['type'] = 'onStart';
$error['title_text'] = __('You don\'t have access to this page');
$error['content_text'] = System::getDefaultACLFailText();
if (class_exists("HomeEnterprise"))
$home = new HomeEnterprise();
else
$home = new Home();
$home->show($error);
}
private function javascript_code() {
ob_start();
global $config;
echo include_javascript_dependencies_flot_graph(true);
ui_require_javascript_file('pandora', 'include/javascript/',true);
?>
<script type="text/javascript">
$(document).ready(function() {
function load_graph() {
$("#loading_graph").show();
var heigth = $(document).height()
- $(".ui-header").height()
- $(".ui-collapsible").height()
- 55;
var width = $(document).width() - 25;
ajax_get_graph($("#id_module").val(), heigth, width);
}
load_graph();
// Detect orientation change to refresh dinamic content
window.addEventListener("resize", function() {
// Reload dinamic content
load_graph();
});
});
function ajax_get_graph(id, heigth_graph, width_graph) {
postvars = {};
postvars["action"] = "ajax";
postvars["parameter1"] = "module_graph";
postvars["parameter2"] = "get_graph";
postvars["width"] = width_graph;
postvars["height"] = heigth_graph;
postvars["draw_alerts"] = ($("input[name = 'draw_alerts']").is(":checked"))?1:0;
postvars["draw_events"] = ($("input[name = 'draw_events']").is(":checked"))?1:0;
postvars["time_compare_separated"] = ($("input[name = 'time_compare_separated']").is(":checked"))?1:0;
postvars["time_compare_overlapped"] = ($("input[name = 'time_compare_overlapped']").is(":checked"))?1:0;
postvars["unknown_graph"] = ($("input[name = 'unknown_graph']").is(":checked"))?1:0;;
postvars["period_hours"] = $("input[name = 'period_hours']").val();
postvars["zoom"] = $("input[name = 'zoom']").val();
postvars["start_date"] = $("input[name = 'start_date']").val();
postvars["id"] = id;
$.ajax ({
type: "POST",
url: "index.php",
dataType: "json",
data: postvars,
success:
function (data) {
$("#loading_graph").hide();
if (data.correct) {
$("#graph_content").show();
$("#graph_content").html(data.graph);
}
else {
$("#error_graph").show();
}
},
error:
function (jqXHR, textStatus, errorThrown) {
$("#loading_graph").hide();
$("#error_graph").show();
}
});
}
</script>
<?php
$javascript_code = ob_get_clean();
return $javascript_code;
}
private function showModuleGraph() {
$agent_alias = agents_get_alias($this->module['id_agente']);
$ui = Ui::getInstance();
$ui->createPage();
if ($this->id_agent) {
$ui->createDefaultHeader(
sprintf(__("%s: %s"), get_product_name(), $this->module["nombre"]),
$ui->createHeaderButton(
array('icon' => 'back',
'pos' => 'left',
'text' => __('Back'),
'href' => 'index.php?page=agent&id=' . $this->id_agent)));
}
else {
$ui->createDefaultHeader(
sprintf(__("%s: %s"), get_product_name(), $this->module["nombre"]),
$ui->createHeaderButton(
array('icon' => 'back',
'pos' => 'left',
'text' => __('Back'),
'href' => 'index.php?page=modules')));
}
$ui->showFooter(false);
$ui->beginContent();
$ui->contentAddHtml($ui->getInput(array(
'id' => 'id_module',
'value' => $this->id,
'type' => 'hidden'
)));
$title = sprintf(__('Options for %s : %s'), $agent_alias, $this->module["nombre"]);
$ui->contentBeginCollapsible($title);
$ui->beginForm("index.php?page=module_graph&id=" . $this->id);
$options = array(
'name' => 'draw_alerts',
'value' => 1,
'checked' => (bool)$this->draw_alerts,
'label' => __('Show Alerts')
);
$ui->formAddCheckbox($options);
$options = array(
'name' => 'draw_events',
'value' => 1,
'checked' => (bool)$this->draw_events,
'label' => __('Show Events')
);
$ui->formAddCheckbox($options);
$options = array(
'name' => 'time_compare_separated',
'value' => 1,
'checked' => (bool)$this->time_compare_separated,
'label' => __('Time compare (Separated)')
);
$ui->formAddCheckbox($options);
$options = array(
'name' => 'time_compare_overlapped',
'value' => 1,
'checked' => (bool)$this->time_compare_overlapped,
'label' => __('Time compare (Overlapped)')
);
$ui->formAddCheckbox($options);
$options = array(
'name' => 'unknown_graph',
'value' => 1,
'checked' => (bool)$this->unknown_graph,
'label' => __('Show unknown graph')
);
$ui->formAddCheckbox($options);
$options = array(
'label' => __('Time range (hours)'),
'name' => 'period_hours',
'value' => ($this->period / SECONDS_1HOUR),
'min' => 0,
'max' => 24 * 30,
'step' => 4
);
$ui->formAddSlider($options);
$options = array(
'name' => 'start_date',
'value' => $this->start_date,
'label' => __('Begin date')
);
$ui->formAddInpuDate($options);
$options = array(
'icon' => 'refresh',
'icon_pos' => 'right',
'text' => __('Update graph')
);
$ui->formAddSubmitButton($options);
$html = $ui->getEndForm();
$ui->contentCollapsibleAddItem($html);
$ui->contentEndCollapsible();
$ui->contentAddHtml('<div id="graph_content" style="display: none; width: 100%; height: 100%; text-align: center;"></div>
<div id="loading_graph" style="width: 100%; text-align: center;">' . __('Loading...') . '<br /><img src="images/ajax-loader.gif" /></div>
<div id="error_graph" style="display: none; color: red; width: 100%; text-align: center;">' . __('Error get the graph') . '</div>');
$ui->contentAddHtml($this->javascript_code());
$ui->endContent();
$ui->showPage();
}
/*
*/
}