<?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. global $config; // Load global vars require_once ("include/config.php"); require_once ("include/functions_agents.php"); require_once ("include/functions_reporting.php"); require_once ('include/functions_modules.php'); require_once ('include/functions_users.php'); check_login(); if (!check_acl ($config['id_user'], 0, "RR")) { require ("general/noaccess.php"); return; } ui_require_javascript_file ('calendar'); // Header ui_print_page_header (__("Export data"), "images/server_export_mc.png"); $group = get_parameter_post ('group', 0); $agentName = get_parameter_post ('agent', 0); switch ($config["dbtype"]) { case "mysql": $agents = agents_get_agents( array('nombre LIKE "' . $agentName . '"'), array ('id_agente')); break; case "postgresql": $agents = agents_get_agents( array('nombre LIKE \'' . $agentName . '\''), array ('id_agente')); break; case "oracle": $agents = agents_get_agents( array('nombre LIKE \'%' . $agentName . '%\''), array ('id_agente')); break; } $agent = $agents[0]['id_agente']; $module = (array) get_parameter_post ('module_arr', array ()); $start_date = get_parameter_post ('start_date', 0); $end_date = get_parameter_post ('end_date', 0); $start_time = get_parameter_post ('start_time', 0); $end_time = get_parameter_post ('end_time', 0); $export_type = get_parameter_post ('export_type', 'data'); $export_btn = get_parameter ('export_btn', 0); $show_form = false; if (!empty ($export_btn) && !empty ($module)) { // Disable SQL cache global $sql_cache; $sql_cache = array ('saved' => array()); // Convert start time and end time to unix timestamps. // The date/time will have the user's timezone, // so we need to change it to the system's timezone. $fixed_offset = get_fixed_offset(); $start = strtotime ($start_date . " " . $start_time) - $fixed_offset; $end = strtotime ($end_date . " " . $end_time) - $fixed_offset; $period = $end - $start; $data = array (); // If time is negative or zero, don't process - it's invalid if ($start < 1 || $end < 1) { ui_print_error_message (__('Invalid time specified')); return; } //****************************************************************** // Starts, ends and dividers //****************************************************************** switch ($export_type) { case "data": case "avg": default: //HTML output - don't style or use XHTML just in case somebody needs to copy/paste it. (Office doesn't handle <thead> and <tbody>) $datastart = '<table style="width:100%;" class="databox data">' . '<tr>' . '<th>' . __('Agent') . '</th>' . '<th>' . __('Module') . '</th>' . '<th>' . __('Data') . '</th>' . '<th>' .__('Timestamp') . '</th>' . '</tr>'; $rowstart = '<tr><td>'; $divider = '</td><td>'; $rowend = '</td></tr>'; $dataend = '</table>'; break; } //****************************************************************** // Data processing //****************************************************************** $data = array (); switch ($export_type) { case "data": case "avg": // Show header echo $datastart; foreach ($module as $selected) { $output = ""; $work_period = SECONDS_1DAY; if ($work_period > $period) { $work_period = $period; } $work_end = $end - $period + $work_period; $work_start = $work_end - $work_period; //Buffer to get data, anyway this will report a memory exhaustin $flag_last_time_slice = false; while ($work_end <= $end) { $data = array (); // Reinitialize array for each module chunk if ($export_type == "avg") { $arr = array (); $arr["data"] = reporting_get_agentmodule_data_average( $selected, $work_period, $work_end); if ($arr["data"] === false) { $work_end = $work_end + $work_period; continue; } $arr["module_name"] = modules_get_agentmodule_name ($selected); $arr["agent_name"] = modules_get_agentmodule_agent_name ($selected); $arr["agent_id"] = modules_get_agentmodule_agent ($selected); $arr["utimestamp"] = $end; array_push ($data, $arr); } else { $data_single = modules_get_agentmodule_data( $selected, $work_period, $work_end); if (!empty ($data_single)) { $data = array_merge ($data, $data_single); } } foreach ($data as $key => $module) { $output .= $rowstart; $alias = db_get_value ("alias","tagente","id_agente",$module['agent_id']); $output .= io_safe_output($alias); $output .= $divider; $output .= io_safe_output($module['module_name']); $output .= $divider; $output .= $module['data']; $output .= $divider; switch($export_type) { case "data": // Change from the system's timezone to the user's timezone $output .= date("Y-m-d G:i:s", $module['utimestamp'] + $fixed_offset); break; case "avg": // Change from the system's timezone to the user's timezone $output .= date ("Y-m-d G:i:s", $work_start + $fixed_offset) . ' - ' . date ("Y-m-d G:i:s", $work_end + $fixed_offset); break; } $output .= $rowend; } switch ($export_type) { default: case "data": case "avg": echo $output; break; } unset($output); $output = ""; unset($data); unset($data_single); // The last time slice is executed now exit of // while loop if ($flag_last_time_slice) breaK; if (($work_end + $work_period) > $end || $work_period == 0) { // Get the last timelapse $work_period = $end - $work_end; $work_end = $end; $flag_last_time_slice = true; } else { $work_end = $work_end + $work_period; } $work_start = $work_end - $work_period; } unset ($output); $output = ""; } // main foreach echo $dataend; break; } } elseif (!empty ($export_btn) && empty ($module)) { ui_print_error_message (__('No modules specified')); $show_form = true; } if (empty($export_btn) || $show_form) { echo '<form method="post" action="index.php?sec=reporting&sec2=operation/agentes/exportdata" name="export_form" id="export_form">'; $table->width = '100%'; $table->border = 0; $table->cellspacing = 3; $table->cellpadding = 5; $table->class = "databox filters"; $table->style[0] = 'vertical-align: top;'; $table->data = array (); //Group selector $table->data[0][0] = '<b>' . __('Group') . '</b>'; $groups = users_get_groups ($config['id_user'], "RR", users_can_manage_group_all()); $table->data[0][1] = html_print_select_groups($config['id_user'], "RR", users_can_manage_group_all(), "group", $group, '', '', 0, true, false, true, '', false); //Agent selector $table->data[1][0] = '<b>'.__('Source agent').'</b>'; if ($group > 0) { $filter['id_grupo'] = (array) $group; } else { $filter['id_grupo'] = array_keys ($groups); } $agents = array (); $rows = agents_get_agents ($filter, false, 'RR'); if ($rows == null) $rows = array(); foreach ($rows as $row) { $agents[$row['id_agente']] = $row['nombre']; } //Src code of lightning image with skins $src_code = html_print_image ('images/lightning.png', true, false, true); $params = array(); $params['return'] = true; $params['show_helptip'] = true; $params['input_name'] = 'agent'; $params['selectbox_group'] = 'group'; $params['value'] = agents_get_name ($agent); $params['javascript_is_function_select'] = true; $params['add_none_module'] = false; $params['selectbox_id'] = 'module_arr'; $table->data[1][1] = ui_print_agent_autocomplete_input($params); //Module selector $table->data[2][0] = '<b>'.__('Modules').'</b>'; $table->data[2][0] .= ui_print_help_tip(__("No modules of type string. You can not calculate their average"),true); if ($agent > 0) { $modules = agents_get_modules ($agent); } else { $modules = array (); } if (!empty($modules)) { //remove modules of type string because you cant calculate their average. $i = 0; foreach ($modules as $key=>$module) { $id_module_type = modules_get_agentmodule_type ($key); switch ($id_module_type) { case 3: case 10: case 17: case 23: case 33: unset($modules[$i]); break; } $i++; } } $disabled_export_button = false; if (empty($modules)) { $disabled_export_button = true; } $table->data[2][1] = html_print_select ($modules, "module_arr[]", array_keys ($modules), '', '', 0, true, true, true, 'w155', false); //Start date selector $table->data[3][0] = '<b>'.__('Begin date').'</b>'; $table->data[3][1] = html_print_input_text ('start_date', date ("Y-m-d", get_system_time () - SECONDS_1DAY), false, 10, 10, true); $table->data[3][1] .= html_print_image ("images/calendar_view_day.png", true, array ("alt" => "calendar", "onclick" => "scwShow(scwID('text-start_date'),this);")); $table->data[3][1] .= html_print_input_text ('start_time', date ("H:i:s", get_system_time () - SECONDS_1DAY), false, 10, 9, true); //End date selector $table->data[4][0] = '<b>'.__('End date').'</b>'; $table->data[4][1] = html_print_input_text ('end_date', date ("Y-m-d", get_system_time ()), false, 10, 10, true); $table->data[4][1] .= html_print_image ("images/calendar_view_day.png", true, array ("alt" => "calendar", "onclick" => "scwShow(scwID('text-end_date'),this);")); $table->data[4][1] .= html_print_input_text ('end_time', date ("H:i:s", get_system_time ()), false, 10, 9, true); //Export type $table->data[5][0] = '<b>'.__('Export type').'</b>'; $export_types = array (); $export_types["data"] = __('Data table'); $export_types["csv"] = __('CSV'); $export_types["excel"] = __('MS Excel'); $export_types["avg"] = __('Average per hour/day'); $table->data[5][1] = html_print_select ($export_types, "export_type", $export_type, '', '', 0, true, false, true, 'w130', false); html_print_table ($table); // Submit button echo '<div class="action-buttons" style="width:100%;">'; html_print_button (__('Export'), 'export_btn', false, 'change_action()', 'class="sub wand"'); echo '</div></form>'; } ui_require_jquery_file ('pandora.controls'); ui_require_jquery_file ('ajaxqueue'); ui_require_jquery_file ('bgiframe'); ?> <script type="text/javascript"> /* <![CDATA[ */ function change_action() { type = $("#export_type").val(); var f = document.forms.export_form; switch (type) { case 'csv': f.action = "operation/agentes/exportdata.csv.php"; break; case 'excel': f.action = "operation/agentes/exportdata.excel.php"; break; case 'avg': case 'data': f.action = "index.php?sec=reporting&sec2=operation/agentes/exportdata&export_btn=1"; break; } $("#export_form").submit(); } /* ]]> */ </script>