diff --git a/pandora_console/extensions/grafana/.htaccess b/pandora_console/extensions/grafana/.htaccess new file mode 100644 index 0000000000..7b8e46129e --- /dev/null +++ b/pandora_console/extensions/grafana/.htaccess @@ -0,0 +1,7 @@ +# /etc/httpd/conf/httpd.conf -> AllowOverride All -> service httpd restart + +RewriteEngine on + +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}\.php -f +RewriteRule ^(.*)$ $1.php \ No newline at end of file diff --git a/pandora_console/extensions/grafana/index.php b/pandora_console/extensions/grafana/index.php new file mode 100644 index 0000000000..e925e56233 --- /dev/null +++ b/pandora_console/extensions/grafana/index.php @@ -0,0 +1,66 @@ + 200, + 'message' => 'Access granted', + ]; + } else { + $result_array = [ + 'code' => 403, + 'message' => 'Access forbidden', + ]; + } + } else { + $result_array = [ + 'code' => 401, + 'message' => 'Unauthorized', + ]; + } +} else { + // OPTIONS request automatically works + if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { + $result_array = [ + 'code' => 200, + 'message' => 'Options request accepted', + ]; + } else { + $result_array = [ + 'code' => 401, + 'message' => 'Unauthorized', + ]; + } +} + +// Numeric data in array must be numeric data in json (not text) +$result = json_encode($result_array, JSON_NUMERIC_CHECK); + +echo $result; diff --git a/pandora_console/extensions/grafana/query.php b/pandora_console/extensions/grafana/query.php new file mode 100644 index 0000000000..c5812a32c9 --- /dev/null +++ b/pandora_console/extensions/grafana/query.php @@ -0,0 +1,139 @@ + $target_data['module'], + 'period' => (strtotime($payload['range']['to']) - strtotime($payload['range']['from'])), + 'date' => strtotime($payload['range']['to']), + 'return_data' => 1, + 'show_unknown' => true, + 'fullscale' => (bool) $target_data['tip'], + 'time_interval' => $target_data['interval'], + ]; + + // Get all data. + $data = grafico_modulo_sparse($params); + + $unknown_timestamps = []; + + // Set unknown data as null. + foreach ($data['unknown1']['data'] as $d) { + if (($d[1] == 1 && !$params['fullscale']) || ($d[1] == 0 && $params['fullscale'])) { + $result_data[] = [ + null, + $d[0], + ]; + } + + $unknown_timestamps[] = $d[0]; + } + + // Get each data if not in unknown timestamps + foreach ($data['sum1']['data'] as $d) { + if ($d[1] != false && !in_array($d[0], $unknown_timestamps)) { + $result_data[] = [ + $d[1], + $d[0], + ]; + } + } + + // Sort all data by utimestamp (Grafana needs it). + usort( + $result_data, + function ($a, $b) { + return $a[1] > $b[1] ? 1 : -1; + } + ); + + $rows = []; + + foreach ($result_data as $k => $v) { + if (($result_data[$k][0] !== $result_data[($k - 1)][0] + || $result_data[$k][0] !== $result_data[($k + 1)][0]) + || ($result_data[($k - 1)][0] === null + && $result_data[$k][0] !== null + && $result_data[$k][1] != (strtotime($payload['range']['to']) * 1000)) + || ($result_data[($k - 1)][0] === $result_data[$k][0] && $result_data[$k][1] == (strtotime($payload['range']['to']) * 1000)) + ) { + $rows[] = $result_data[$k]; + } + } + + if (!$params['fullscale']) { + $target_data['target'] .= ' (avg)'; + } + + // Set all target info and data + $result_array[] = [ + 'type' => 'table', + 'target' => $target_data['target'], + 'refId' => $target_data['target'], + 'columns' => [ + [ + 'text' => $target_data['target'], + ], + [ + 'text' => 'Time', + 'type' => 'time', + ], + ], + 'datapoints' => array_values($rows), + ]; + } + } + } + } +} + +// Numeric data in array must be numeric data in json (not text). +$result = json_encode($result_array, JSON_NUMERIC_CHECK); + +echo $result; diff --git a/pandora_console/extensions/grafana/search.php b/pandora_console/extensions/grafana/search.php new file mode 100644 index 0000000000..48a4f819a9 --- /dev/null +++ b/pandora_console/extensions/grafana/search.php @@ -0,0 +1,87 @@ + 0, + 'text' => 'All', + ]; + + // Get groups that match the search + $sql = 'SELECT nombre, id_grupo id FROM tgrupo WHERE LOWER(nombre) LIKE LOWER("%'.io_safe_input($payload['search']).'%")'; + + // If search is for agents + } else if ($payload['type'] == 'agent') { + // Get agents that match the search + $sql = 'SELECT a.alias nombre, a.id_agente id FROM tagente a, tgrupo g WHERE a.disabled = 0 AND a.id_grupo = g.id_grupo AND LOWER(a.alias) LIKE LOWER("%'.io_safe_input($payload['search']).'%")'; + + // If search group is not all, add extra filter + if ($payload['extra'] != 0) { + $sql .= ' AND g.id_grupo = "'.io_safe_input($payload['extra']).'"'; + } + + // If search is for modules + } else if ($payload['type'] == 'module') { + // Get modules that match the search (not string) + $sql = 'SELECT m.nombre nombre, m.id_agente_modulo id FROM tagente_modulo m, tagente a, ttipo_modulo t WHERE m.disabled = 0 AND m.id_agente = a.id_agente AND t.id_tipo = m.id_tipo_modulo AND a.id_agente = "'.io_safe_input($payload['extra']).'" AND LOWER(m.nombre) LIKE LOWER("%'.io_safe_input($payload['search']).'%") AND t.nombre NOT LIKE "%string"'; + } + + // Run query + $sql_results = db_get_all_rows_sql($sql); + + foreach ($sql_results as $sql_result) { + // If search is for groups, only add those with permissions + if ($payload['type'] == 'group') { + if (check_acl($user_in_db, $sql_result['id'], 'AR')) { + $result_array[] = [ + 'value' => $sql_result['id'], + 'text' => io_safe_output($sql_result['nombre']), + ]; + } + } else { + $result_array[] = [ + 'value' => $sql_result['id'], + 'text' => io_safe_output($sql_result['nombre']), + ]; + } + } + } + } +} + +$result = json_encode($result_array, JSON_UNESCAPED_UNICODE); + +echo $result;