diff --git a/pandora_console/images/widgets/AvgSumMaxMinModule.png b/pandora_console/images/widgets/AvgSumMaxMinModule.png new file mode 100644 index 0000000000..19e980f38d Binary files /dev/null and b/pandora_console/images/widgets/AvgSumMaxMinModule.png differ diff --git a/pandora_console/include/lib/Dashboard/Widget.php b/pandora_console/include/lib/Dashboard/Widget.php index bb082de0c7..51600d5df4 100644 --- a/pandora_console/include/lib/Dashboard/Widget.php +++ b/pandora_console/include/lib/Dashboard/Widget.php @@ -421,6 +421,7 @@ class Widget case 'BlockHistogram': case 'DataMatrix': case 'EventCardboard': + case 'AvgSumMaxMinModule': $className .= '\\'.$name; break; diff --git a/pandora_console/include/lib/Dashboard/Widgets/AvgSumMaxMinModule.php b/pandora_console/include/lib/Dashboard/Widgets/AvgSumMaxMinModule.php new file mode 100644 index 0000000000..c1ea70eaba --- /dev/null +++ b/pandora_console/include/lib/Dashboard/Widgets/AvgSumMaxMinModule.php @@ -0,0 +1,701 @@ +width = $width; + + // Height. + $this->height = $height; + + // Grid Width. + $this->gridWidth = $gridWidth; + + // Cell Id. + $this->cellId = $cellId; + + // Options. + $this->values = $this->decoders($this->getOptionsWidget()); + + // Positions. + $this->position = $this->getPositionWidget(); + + // Page. + $this->page = basename(__FILE__); + + // ClassName. + $class = new \ReflectionClass($this); + $this->className = $class->getShortName(); + + // Title. + $this->title = __('Avg|Sum|Max|Min Module Data'); + + // Name. + if (empty($this->name) === true) { + $this->name = 'AvgSumMaxMinModule'; + } + + // This forces at least a first configuration. + $this->configurationRequired = false; + if (empty($this->values['moduleId']) === true) { + $this->configurationRequired = true; + } else { + try { + if (is_metaconsole() === true + && $this->values['metaconsoleId'] > 0 + ) { + $node = new Node($this->values['metaconsoleId']); + $node->connect(); + } + + $check_exist = db_get_sql( + sprintf( + 'SELECT id_agente_modulo + FROM tagente_modulo + WHERE id_agente_modulo = %s + AND delete_pending = 0', + $this->values['moduleId'] + ) + ); + } catch (\Exception $e) { + // Unexistent agent. + if (is_metaconsole() === true + && $this->values['metaconsoleId'] > 0 + ) { + $node->disconnect(); + } + + $check_exist = false; + } finally { + if (is_metaconsole() === true + && $this->values['metaconsoleId'] > 0 + ) { + $node->disconnect(); + } + } + + if ($check_exist === false) { + $this->loadError = true; + } + } + + $this->overflow_scrollbars = false; + } + + + /** + * Decoders hack for retrocompability. + * + * @param array $decoder Values. + * + * @return array Returns the values ​​with the correct key. + */ + public function decoders(array $decoder): array + { + $values = []; + // Retrieve global - common inputs. + $values = parent::decoders($decoder); + + if (isset($decoder['label_'.$this->cellId]) === true) { + $values['label'] = $decoder['label_'.$this->cellId]; + } + + if (isset($decoder['label']) === true) { + $values['label'] = $decoder['label']; + } + + if (isset($decoder['id_agent_'.$this->cellId]) === true) { + $values['agentId'] = $decoder['id_agent_'.$this->cellId]; + } + + if (isset($decoder['type_'.$this->cellId]) === true) { + $values['type'] = $decoder['type_'.$this->cellId]; + } + + if (isset($decoder['type']) === true) { + $values['type'] = $decoder['type']; + } + + if (isset($decoder['period_'.$this->cellId]) === true) { + $values['period'] = $decoder['period_'.$this->cellId]; + } + + if (isset($decoder['period']) === true) { + $values['period'] = $decoder['period']; + } + + if (isset($decoder['agentId']) === true) { + $values['agentId'] = $decoder['agentId']; + } + + if (isset($decoder['metaconsoleId']) === true) { + $values['metaconsoleId'] = $decoder['metaconsoleId']; + } + + if (isset($decoder['id_module_'.$this->cellId]) === true) { + $values['moduleId'] = $decoder['id_module_'.$this->cellId]; + } + + if (isset($decoder['moduleId']) === true) { + $values['moduleId'] = $decoder['moduleId']; + } + + if (isset($decoder['size_value_'.$this->cellId]) === true) { + $values['sizeValue'] = $decoder['size_value_'.$this->cellId]; + } + + if (isset($decoder['sizeValue']) === true) { + $values['sizeValue'] = $decoder['sizeValue']; + } + + if (isset($decoder['size_label_'.$this->cellId]) === true) { + $values['sizeLabel'] = $decoder['size_label_'.$this->cellId]; + } + + if (isset($decoder['sizeLabel']) === true) { + $values['sizeLabel'] = $decoder['sizeLabel']; + } + + if (isset($decoder['text_color_'.$this->cellId]) === true) { + $values['text_color'] = $decoder['text_color_'.$this->cellId]; + } + + if (isset($decoder['text_color']) === true) { + $values['text_color'] = $decoder['text_color']; + } + + if (isset($decoder['unit_'.$this->cellId]) === true) { + $values['unit'] = $decoder['unit_'.$this->cellId]; + } + + if (isset($decoder['unit']) === true) { + $values['unit'] = $decoder['unit']; + } + + return $values; + } + + + /** + * Generates inputs for form (specific). + * + * @return array Of inputs. + * + * @throws Exception On error. + */ + public function getFormInputs(): array + { + global $config; + + $values = $this->values; + + // Default values. + if (isset($values['sizeLabel']) === false) { + $values['sizeLabel'] = 20; + } + + if (isset($values['sizeValue']) === false) { + $values['sizeValue'] = 20; + } + + // Retrieve global - common inputs. + $inputs = parent::getFormInputs(); + + // Label. + $inputs[] = [ + 'label' => __('Label'), + 'arguments' => [ + 'name' => 'label', + 'type' => 'text', + 'value' => $values['label'], + 'return' => true, + 'size' => 0, + ], + ]; + + // Type. + $type_fields = []; + $type_fields[0] = 'AVG'; + $type_fields[1] = 'SUM'; + $type_fields[2] = 'MAX'; + $type_fields[3] = 'MIN'; + $type_selected = explode(',', $values['type']); + + (isset($values['type']) === false) ? $type_selected = 0 : ''; + + $inputs[] = [ + 'label' => __('Type'), + 'arguments' => [ + 'name' => 'type', + 'type' => 'select', + 'fields' => $type_fields, + 'selected' => $type_selected, + 'return' => true, + 'required' => true, + 'select2_enable' => false, + 'sort' => false, + ], + ]; + + // Period. + $period_fields = []; + $period_fields[0] = __('Last 30 days'); + $period_fields[1] = __('This month'); + $period_fields[2] = __('Last 7 days'); + $period_fields[3] = __('This week'); + $period_fields[4] = __('Last 24 hrs'); + $period_fields[5] = __('Today'); + $period_selected = explode(',', $values['period']); + + (isset($values['period']) === false) ? $period_selected = 0 : ''; + + $inputs[] = [ + 'label' => __('Time period'), + 'arguments' => [ + 'name' => 'period', + 'type' => 'select', + 'fields' => $period_fields, + 'selected' => $period_selected, + 'return' => true, + 'required' => true, + 'select2_enable' => false, + 'sort' => false, + ], + ]; + + // Autocomplete agents. + $inputs[] = [ + 'label' => __('Agent'), + 'arguments' => [ + 'type' => 'autocomplete_agent', + 'name' => 'agentAlias', + 'id_agent_hidden' => $values['agentId'], + 'name_agent_hidden' => 'agentId', + 'server_id_hidden' => $values['metaconsoleId'], + 'name_server_hidden' => 'metaconsoleId', + 'return' => true, + 'module_input' => true, + 'module_name' => 'moduleId', + 'module_none' => false, + 'size' => 0, + ], + ]; + + // Autocomplete module. + $inputs[] = [ + 'label' => __('Module'), + 'arguments' => [ + 'type' => 'autocomplete_module', + 'name' => 'moduleId', + 'selected' => $values['moduleId'], + 'return' => true, + 'sort' => false, + 'agent_id' => $values['agentId'], + 'metaconsole_id' => $values['metaconsoleId'], + 'style' => 'width: inherit;', + 'filter_modules' => (users_access_to_agent($values['agentId']) === false) ? [$values['moduleId']] : [], + 'nothing' => __('None'), + 'nothing_value' => 0, + ], + ]; + + // Text size of value in px. + $inputs[] = [ + 'label' => __('Text size of value in px'), + 'arguments' => [ + 'name' => 'sizeValue', + 'type' => 'number', + 'value' => $values['sizeValue'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Text size of label in px. + $inputs[] = [ + 'label' => __('Text size of label in px'), + 'arguments' => [ + 'name' => 'sizeLabel', + 'type' => 'number', + 'value' => $values['sizeLabel'], + 'return' => true, + 'min' => 0, + ], + ]; + + // Text color. + if (empty($values['text_color']) === true) { + $values['text_color'] = '#000000'; + + if ($config['style'] === 'pandora_black' + && is_metaconsole() === false + ) { + $values['text_color'] = '#eeeeee'; + } + } + + $inputs[] = [ + 'label' => __('Text color'), + 'arguments' => [ + 'wrapper' => 'div', + 'name' => 'text_color', + 'type' => 'color', + 'value' => $values['text_color'], + 'return' => true, + ], + ]; + + // Unit. + $inputs[] = [ + 'label' => __('Unit'), + 'arguments' => [ + 'wrapper' => 'div', + 'name' => 'unit', + 'type' => 'switch', + 'value' => $values['unit'], + 'return' => true, + ], + ]; + + return $inputs; + } + + + /** + * Get Post for widget. + * + * @return array + */ + public function getPost():array + { + // Retrieve global - common inputs. + $values = parent::getPost(); + + $values['label'] = \get_parameter('label', ''); + $values['type'] = \get_parameter('type', 0); + $values['period'] = \get_parameter('period', 0); + $values['agentId'] = \get_parameter('agentId', 0); + $values['metaconsoleId'] = \get_parameter('metaconsoleId', 0); + $values['moduleId'] = \get_parameter('moduleId', 0); + $values['sizeValue'] = \get_parameter('sizeValue', 0); + $values['sizeLabel'] = \get_parameter_switch('sizeLabel'); + $values['text_color'] = \get_parameter('text_color', 0); + $values['unit'] = \get_parameter_switch('unit'); + + return $values; + } + + + /** + * Draw widget. + * + * @return string; + */ + public function load() + { + global $config; + + $output = ''; + $text_color = 'color:'.$this->values['text_color'].' !important;'; + + $id_module = $this->values['moduleId']; + + $to = 0; + $now = time(); + + switch ((int) $this->values['period']) { + case 0: + $to = strtotime('-30 days'); + break; + + case 1: + $to = strtotime(date('Y-m-01 00:00:00')); + break; + + case 2: + $to = strtotime('-7 days'); + break; + + case 3: + $to = strtotime('last Monday'); + break; + + case 4: + $to = strtotime('-1 days'); + break; + + case 5: + $to = strtotime(date('Y-m-d 00:00:00')); + break; + + default: + $to = 0; + break; + } + + $data = 0; + switch ((int) $this->values['type']) { + case 0: + $rows = modules_get_raw_data($id_module, $to, $now); + $count = (int) count($rows); + $sum = 0; + foreach ($rows as $row) { + $sum += (int) $row['datos']; + } + + $data = ($sum / $count); + break; + + case 1: + $rows = modules_get_raw_data($id_module, $to, $now); + $sum = 0; + foreach ($rows as $row) { + $sum += (int) $row['datos']; + } + + $data = $sum; + break; + + case 2: + $rows = modules_get_min_max_data($id_module, $to); + + $data = $rows[0]['max']; + break; + + case 3: + $rows = modules_get_min_max_data($id_module, $to); + + $data = $rows[0]['min']; + break; + + default: + $data = 0; + break; + } + + $label = $this->values['label']; + $sizeLabel = (isset($this->values['sizeLabel']) === true) ? $this->values['sizeLabel'] : 40; + $sizeValue = (isset($this->values['sizeValue']) === true) ? $this->values['sizeValue'] : 40; + + $output .= '
'; + // General div. + $output .= '
'; + // Div value. + $output .= '
'; + + if (is_numeric($data) === true) { + $dataDatos = remove_right_zeros( + number_format( + $data, + $config['graph_precision'], + $config['decimal_separator'], + $config['thousand_separator'] + ) + ); + } else { + $dataDatos = trim($data); + } + + $unit = ''; + if (empty($this->values['unit']) === false) { + $unit = modules_get_unit($id_module); + } + + $output .= $dataDatos.' '.$unit; + + $output .= '
'; + + if (empty($label) === false) { + // Div Label. + $output .= '
'.$label.'
'; + } + + $output .= '
'; + $output .= '
'; + return $output; + } + + + /** + * Get description. + * + * @return string. + */ + public static function getDescription() + { + return __('Avg|Sum|Max|Min Module Data'); + } + + + /** + * Get Name. + * + * @return string. + */ + public static function getName() + { + return 'AvgSumMaxMinModule'; + } + + + /** + * Get size Modal Configuration. + * + * @return array + */ + public function getSizeModalConfiguration(): array + { + $size = [ + 'width' => 550, + 'height' => 710, + ]; + + return $size; + } + + +}