$value) { switch ($var) { case "group": case "group_id": $values = get_group_entities($value); $sql .= generate_query_values_and($values, 'counters.counter_id'); break; case 'device_group_id': case 'device_group': $values = get_group_entities($value, 'device'); $sql .= generate_query_values_and($values, 'counters.device_id'); break; case "device": case "device_id": $sql .= generate_query_values_and($value, 'counters.device_id'); break; case "id": case "counter_id": $sql .= generate_query_values_and($value, 'counters.counter_id'); break; case "entity_id": $sql .= generate_query_values_and($value, 'counters.measured_entity'); break; case "entity_type": $sql .= generate_query_values_and($value, 'counters.measured_class'); break; case 'entity_state': case "measured_state": $sql .= build_entity_measured_where('counter', [ 'measured_state' => $value ]); break; case 'class': case "counter_class": $sql .= generate_query_values_and($value, 'counter_class'); break; case "descr": case "counter_descr": $sql .= generate_query_values_and($value, 'counters.counter_descr', '%LIKE%'); break; case "event": case "counter_event": $sql .= generate_query_values_and($value, 'counter_event'); break; } } // $sql .= $GLOBALS['cache']['where']['devices_permitted']; $sql .= generate_query_permitted(array('device', 'counter')); // If need count, just return sql without sorting if ($query_count) { return $sql; } switch ($vars['sort_order']) { case 'desc': $sort_order = 'DESC'; $sort_neg = 'ASC'; break; case 'reset': unset($vars['sort'], $vars['sort_order']); // no break here default: $sort_order = 'ASC'; $sort_neg = 'DESC'; } switch($vars['sort']) { case 'device': $sql .= ' ORDER BY `hostname` '.$sort_order; break; case 'descr': case 'event': $sql .= ' ORDER BY `counter_'.$vars['sort'].'` '.$sort_order; break; case 'value': case 'rate': case 'rate_hour': case 'last_change': $sql .= ' ORDER BY `counter_'.$vars['sort'].'` '.$sort_order; break; default: // $sql .= ' ORDER BY `hostname` '.$sort_order.', `counter_descr` '.$sort_order; } if (isset($vars['pageno'])) { $start = $vars['pagesize'] * ($vars['pageno'] - 1); $sql .= ' LIMIT '.$start.','.$vars['pagesize']; } return $sql; } function print_counter_table($vars) { pagination($vars, 0, TRUE); // Get default pagesize/pageno $sql = build_counter_query($vars); //r($vars); //r($sql); $counters = array(); //foreach(dbFetchRows($sql, NULL, TRUE) as $counter) foreach(dbFetchRows($sql) as $counter) { //if (isset($GLOBALS['cache']['devices']['id'][$counter['device_id']])) //{ $counter['hostname'] = $GLOBALS['cache']['devices']['id'][$counter['device_id']]['hostname']; $counters[] = $counter; //} } //$counters_count = count($counters); // This is count incorrect, when pagination used! //$counters_count = dbFetchCell(build_counter_query($vars, TRUE), NULL, TRUE); $counters_count = dbFetchCell(build_counter_query($vars, TRUE)); // Pagination $pagination_html = pagination($vars, $counters_count); echo $pagination_html; echo generate_box_open(); print_counter_table_header($vars); foreach($counters as $counter) { print_counter_row($counter, $vars); } echo(""); echo generate_box_close(); echo $pagination_html; } function print_counter_table_header($vars) { if ($vars['view'] == "graphs" || $vars['graph'] || isset($vars['id'])) { $stripe_class = "table-striped-two"; } else { $stripe_class = "table-striped"; } echo('' . PHP_EOL); $cols = []; $cols[] = array(NULL, 'class="state-marker"'); $cols['device'] = array('Device', 'style="width: 250px;"'); //$cols[] = array(NULL, 'class="no-width"'); // Measure entity link $cols['descr'] = array('Description'); $cols['class'] = array('Class', 'style="width: 100px;"'); $cols['mib'] = array('MIB::Object'); //$cols[] = array('Thresholds', 'style="width: 100px;"'); $cols[] = array('History', 'style="text-align: right;"'); $cols['last_change'] = array('Last changed', 'style="width: 80px;"'); $cols['event'] = array('Event', 'style="width: 60px; text-align: right;"'); $cols['rate'] = array('Rate', 'style="width: 80px; text-align: right;"'); $cols['value'] = array('Value', 'style="width: 70px; text-align: right;"'); if ($vars['page'] == "device") { unset($cols['device']); } if ($vars['page'] != "device" || $vars['tab'] == "overview") { unset($cols['mib']); unset($cols['object']); } if (!$vars['show_class']) { unset($cols['class']); } if ($vars['tab'] == "overview") { unset($cols[2]); } // Thresholds echo(get_table_header($cols, $vars)); echo('' . PHP_EOL); } function print_counter_row($counter, $vars) { echo generate_counter_row($counter, $vars); } function generate_counter_row($counter, $vars) { global $config; humanize_counter($counter); $table_cols = 4; if ($counter['counter_event'] && is_numeric($counter['counter_value'])) { $graph_array = array(); $graph_array['to'] = $config['time']['now']; $graph_array['id'] = $counter['counter_id']; $graph_array['type'] = "counter_graph"; $graph_array['width'] = 80; $graph_array['height'] = 20; $graph_array['bg'] = 'ffffff00'; $graph_array['from'] = $config['time']['day']; $mini_graph = generate_graph_tag($graph_array); $graph_array = array(); $graph_array['to'] = $config['time']['now']; $graph_array['id'] = $counter['counter_id']; $graph_array['type'] = "counter_rate"; $graph_array['width'] = 80; $graph_array['height'] = 20; $graph_array['bg'] = 'ffffff00'; $graph_array['from'] = $config['time']['day']; $mini_graph .= generate_graph_tag($graph_array); } else { // Do not show "Draw Error" minigraph $mini_graph = ''; } $row = ' '; if ($vars['page'] != "device" && $vars['popup'] != TRUE) { $row .= ' ' . PHP_EOL; $table_cols++; } // Measured link & icon /* Disabled because it breaks the overview table layout if ($vars['entity_icon']) // this used for entity popup { $row .= get_icon($config['counter_types'][$counter['counter_class']]['icon']); } elseif ($counter['measured_entity'] && (!isset($vars['measured_icon']) || $vars['measured_icon'])) // hide measured icon if not required { //$row .= generate_entity_link($counter['measured_class'], $counter['measured_entity'], get_icon($counter['measured_class'])); $row .= generate_entity_icon_link($counter['measured_class'], $counter['measured_entity']); } $row .= ''; $table_cols++; */ $row .= ' '; $table_cols++; if ($vars['show_class']) { $row .= ' ' . PHP_EOL; $table_cols++; } // FIXME -- Generify this. It's not just for counters. if ($vars['page'] === "device" && $vars['tab'] !== "overview") { $row .= ' ' . PHP_EOL; $table_cols++; } // Disable show thresholds // if ($vars['tab'] != 'overview') // { // $row .= ' ' . PHP_EOL; // $table_cols++; // } $row .= ' '; if ($vars['tab'] != 'overview') { $row .= ' '; $table_cols++; $row .= ' '; $table_cols++; } $counter_tooltip = $counter['event_descr']; // Append value in alternative units to tooltip if (isset($config['counter_types'][$counter['counter_class']]['alt_units'])) { foreach (value_to_units($counter['counter_value'], $config['counter_types'][$counter['counter_class']]['symbol'], $counter['counter_class'], $config['counter_types'][$counter['counter_class']]['alt_units']) as $unit => $unit_value) { if (is_numeric($unit_value)) { $counter_tooltip .= "
{$unit_value}{$unit}"; } } } // Set to TRUE if this counter in time based format (ie lifetime) $format_time = isset($config['counter_types'][$counter['counter_class']]['format']) && str_contains_array($config['counter_types'][$counter['counter_class']]['format'], 'time'); $rates = []; // FIXME. Probably do not show rates for time based counters?.. (it's always around 1s/5m/1h) if (!$format_time) { $rate_text = $format_time ? $counter['human_rate'] : $counter['human_rate'] . ' /s'; if ($counter['counter_limit_by'] == 'sec' && $counter['counter_event'] != 'ok') { $rates[] = ['event' => $counter['event_class'], 'text' => $rate_text]; } else { $rates[] = ['event' => 'success', 'text' => $rate_text]; } $rate_text = $format_time ? $counter['human_rate_5min'] : $counter['human_rate_5min'] . ' /5min'; if ($counter['counter_limit_by'] == '5min' && $counter['counter_event'] != 'ok') { $rates[] = ['event' => $counter['event_class'], 'text' => $rate_text]; } else { $rates[] = ['event' => 'info', 'text' => $rate_text]; } $rate_text = $format_time ? $counter['human_rate_hour'] : $counter['human_rate_hour'] . ' /h'; if ($counter['counter_limit_by'] == 'hour' && $counter['counter_event'] != 'ok') { $rates[] = ['event' => $counter['event_class'], 'text' => $rate_text]; } else { $rates[] = ['event' => 'primary', 'text' => $rate_text]; } } $row .= ' '; $row .= ' '; $row .= ' ' . PHP_EOL; if ($vars['view'] == "graphs" || $vars['id'] == $counter['counter_id']) { $vars['graph'] = "graph"; } if ($vars['graph']) { $row .= ' '; } # endif graphs return $row; } function print_counter_form($vars, $single_device = FALSE) { global $config; $form = array('type' => 'rows', 'space' => '10px', 'submit_by_key' => TRUE, 'url' => generate_url($vars)); $form_items = array(); if ($single_device) { // Single device, just hidden field $form['row'][0]['device_id'] = array( 'type' => 'hidden', 'name' => 'Device', 'value' => $vars['device_id'], 'grid' => 2, 'width' => '100%'); } else { $form_items['devices'] = generate_form_values('device', dbFetchColumn('SELECT DISTINCT `device_id` FROM `counters`')); $form['row'][0]['device_id'] = array( 'type' => 'multiselect', 'name' => 'Device', 'value' => $vars['device_id'], 'grid' => 2, 'width' => '100%', //'180px', 'values' => $form_items['devices']); } $counter_permitted = generate_query_permitted(array('device', 'counter')); foreach ([ 'counter_class' => 'Counter Class', 'counter_event' => 'Counter Event' ] as $param => $param_name) { $sql = 'SELECT DISTINCT `'.$param.'` FROM `counters` WHERE `counter_deleted` = ?' . $counter_permitted; if ($entries = dbFetchColumn($sql, [ 0 ])) { asort($entries); } foreach ($entries as $entry) { if (safe_empty($entry)) { $entry = OBS_VAR_UNSET; } if ($param === 'counter_class') { $name = nicecase($entry); if (isset($config['counter_types'][$entry]['icon'])) { $name = ['name' => $name, 'icon' => $config['counter_types'][$entry]['icon']]; } else { $name = ['name' => $name, 'icon' => $config['icon']['counter']]; } } else { $name = $entry; } $form_items[$param][$entry] = $name; } // Alternative param name, ie event $short_param = str_replace('counter_', '', $param); if (!isset($vars[$param]) && isset($vars[$short_param])) { $vars[$param] = $vars[$short_param]; } $form['row'][0][$param] = array( 'type' => 'multiselect', 'name' => $param_name, 'width' => '100%', //'180px', 'grid' => 2, 'value' => $vars[$param], 'values' => $form_items[$param]); } // Currently unused, just dumb space $form['row'][0]['counter_value'] = array( 'type' => 'hidden', 'name' => 'Value', 'width' => '100%', //'180px', 'grid' => 0, 'value' => $vars['counter_value']); // Measured entities $form['row'][0]['measured_state'] = array( 'type' => 'multiselect', 'name' => 'Measured State', 'width' => '100%', //'180px', 'grid' => 2, 'value' => $vars['measured_state'], 'values' => ['none' => ['name' => 'Without Measure', 'icon' => $config['icon']['filter']], 'up' => ['name' => 'Measured UP', 'icon' => $config['icon']['up']], 'down' => ['name' => 'Measured DOWN', 'icon' => $config['icon']['down']], 'shutdown' => ['name' => 'Measured SHUTDOWN', 'icon' => $config['icon']['shutdown']]]); $form['row'][1]['counter_descr'] = array( 'type' => 'text', 'placeholder' => 'Counter description', 'width' => '100%', //'180px', 'grid' => 6, 'value' => $vars['counter_descr']); // $form['row'][1]['counter_type'] = array( // 'type' => 'text', // 'placeholder' => 'Counter type', // 'width' => '100%', //'180px', // 'grid' => 4, // 'value' => $vars['status_descr']); // Groups foreach (get_type_groups('counter') as $entry) { $form_items['group'][$entry['group_id']] = $entry['group_name']; } $form['row'][1]['group'] = array( 'community' => FALSE, 'type' => 'multiselect', 'name' => 'Select Groups', 'width' => '100%', //'180px', 'grid' => 2, 'value' => $vars['group'], 'values' => $form_items['group']); $form['row'][1]['search'] = array( 'type' => 'submit', 'grid' => 4, //'name' => 'Search', //'icon' => 'icon-search', 'right' => TRUE); // Show search form echo ''; // Custom panel form $panel_form = array('type' => 'rows', 'title' => 'Search Counters', 'space' => '10px', //'brand' => NULL, //'class' => '', 'submit_by_key' => TRUE, 'url' => generate_url($vars)); // Clean grids foreach ($form['row'] as $row => $rows) { foreach (array_keys($rows) as $param) { if (isset($form['row'][$row][$param]['grid'])) { unset($form['row'][$row][$param]['grid']); } } } // Copy forms $panel_form['row'][0]['device_id'] = $form['row'][0]['device_id']; $panel_form['row'][0]['counter_class'] = $form['row'][0]['counter_class']; $panel_form['row'][1]['counter_event'] = $form['row'][0]['counter_event']; $panel_form['row'][1]['counter_value'] = $form['row'][0]['counter_value']; $panel_form['row'][2]['measured_state'] = $form['row'][0]['measured_state']; $panel_form['row'][2]['group'] = $form['row'][1]['group']; //$panel_form['row'][3]['counter_type'] = $form['row'][1]['counter_type']; $panel_form['row'][4]['counter_descr'] = $form['row'][1]['counter_descr']; //$panel_form['row'][5]['sort'] = $form['row'][0]['sort']; $panel_form['row'][5]['search'] = $form['row'][1]['search']; // Register custom panel register_html_panel(generate_form($panel_form)); } // EOF
' . generate_device_link($counter) . '' . generate_entity_link("counter", $counter) . '' . nicecase($counter['counter_class']). '' . (!safe_empty($counter['counter_mib']) ? '' . nicecase($counter['counter_mib']) .'' : '') . ( ( !safe_empty($counter['counter_mib']) && !safe_empty($counter['counter_object'])) ? '::' : '') . (!safe_empty($counter['counter_mib']) ? '' . $counter['counter_object'] .'' : '') . '.'.$counter['counter_index'].'' . $counter['counter_thresholds'] . '' . generate_entity_link('counter', $counter, $mini_graph, NULL, FALSE) . '' . ($counter['counter_last_change'] == '0' ? 'Never' : generate_tooltip_link(NULL, format_uptime(($config['time']['now'] - $counter['counter_last_change']), 'short-2') . ' ago', format_unixtime($counter['counter_last_change']))) . '' . generate_tooltip_link('', $counter['counter_event'], $counter['event_descr'], $counter['event_class']) . '' . get_label_group($rates) . '' . generate_tooltip_link('', $counter['human_value'] . $counter['counter_symbol'], $counter_tooltip, $counter['event_class']) . '
'; $graph_array = array(); $graph_array['to'] = $config['time']['now']; $graph_array['id'] = $counter['counter_id']; $graph_array['type'] = 'counter_'.$vars['graph']; $row .= generate_graph_row($graph_array, TRUE); $graph_array = array(); $graph_array['to'] = $config['time']['now']; $graph_array['id'] = $counter['counter_id']; $graph_array['type'] = 'counter_rate'; $row .= generate_graph_row($graph_array, TRUE); $row .= '