274 lines
9.5 KiB
PHP

<?php
/**
* Observium
*
* This file is part of Observium.
*
* @package observium
* @subpackage poller
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2021 Observium Limited
*
*/
print_cli_data_field("MIBs", 2);
// Init db
foreach (dbFetchRows("SELECT * FROM `wifi_radios` WHERE `device_id` = ?", [ $device['device_id'] ]) as $radio) {
$GLOBALS['cache']['wifi_radios'][$radio['radio_ap']][$radio['radio_number']] = $radio;
}
foreach (dbFetchRows("SELECT * FROM `wifi_wlans` WHERE `device_id` = ?", [ $device['device_id'] ]) as $wlan) {
$GLOBALS['cache']['wifi_wlans'][$wlan['wlan_index']] = $wlan;
}
$aps_db = [];
foreach (dbFetchRows("SELECT * FROM `wifi_aps` WHERE `device_id` = ?", [ $device['device_id'] ]) as $aps) {
if (isset($aps_db[$aps['ap_index']])) {
// Duplicate entry
print_debug_vars($aps);
dbDelete('wifi_aps', '`wifi_ap_id` = ?', [ $aps['wifi_ap_id'] ]);
dbDelete('wifi_aps_members', '`wifi_ap_id` = ?', [ $aps['wifi_ap_id'] ]);
continue;
}
$aps_db[$aps['ap_index']] = $aps;
}
$aps_member_db = [];
foreach (dbFetchRows('SELECT * FROM `wifi_aps_members` WHERE `device_id` = ?', [ $device['device_id'] ]) as $member) {
if (isset($aps_member_db[$member['ap_index_member']])) {
// Duplicate entry
print_debug_vars($member);
dbDelete('wifi_aps_members', '`wifi_ap_member_id` = ?', [ $member['wifi_ap_member_id'] ]);
continue;
}
$aps_member_db[$member['ap_index_member']] = $member;
}
// Init poll vars
$aps_poll = [];
$aps_member_poll = [];
$wifi_controller = [];
$include_dir = "includes/polling/wifi";
include("includes/include-dir-mib.inc.php");
// Process APs entries
if (count($aps_poll) || count($aps_db)) {
// Check WiFi APs
$table_rows = [];
// Add/update
foreach ($aps_poll as $index => $entry) {
if (safe_empty($entry['device_id'])) {
$entry['device_id'] = $device['device_id'];
}
if (is_array($aps_db[$index])) {
//echo("AP Index exists: $index\n");
$ap_db = $aps_db[$index];
$wifi_ap_id = $ap_db['wifi_ap_id'];
$ap_update = [];
foreach ($entry as $param => $value) {
if ($entry[$param] !== $ap_db[$param]) {
$ap_update[$param] = safe_empty($entry[$param]) ? [ 'NULL' ] : $entry[$param];
}
}
if (count($ap_update)) {
dbUpdate($ap_update, 'wifi_aps', '`wifi_ap_id` = ?', [ $wifi_ap_id ]);
}
} else {
//echo("New AP Index: $index\n");
$wifi_ap_id = dbInsert($entry, 'wifi_aps');
// update db cache, need for members
$entry['wifi_ap_id'] = $wifi_ap_id;
$aps_db[$index] = $entry;
}
$table_row = [];
$table_row[] = $index;
$table_row[] = $entry['ap_name'];
$table_row[] = $entry['ap_address'];
$table_row[] = $entry['ap_serial'];
$table_row[] = $entry['ap_model'];
$table_row[] = $entry['ap_location'];
$table_row[] = $entry['ap_status'];
$table_row[] = $entry['ap_admin_status'];
$table_row[] = format_uptime($entry['ap_uptime']);
$table_row[] = format_uptime($entry['ap_control_uptime']);
$table_row[] = format_uptime($entry['ap_control_latency']);
$table_rows[] = $table_row;
}
// Append AP count graph
if (!isset($wifi_ap_count)) {
$wifi_ap_count = count($aps_poll);
}
// Delete removed
foreach ($aps_db as $index => $entry) {
if (!isset($aps_poll[$index])) {
$wifi_ap_id = $entry['wifi_ap_id'];
if ($entry['deleted'] || safe_empty($index)) {
print_warning("AP will delete AP:$index with id: $wifi_ap_id");
dbDelete('wifi_aps', '`wifi_ap_id` = ?', [ $wifi_ap_id ]);
dbDelete('wifi_aps_members', '`wifi_ap_id` = ?', [ $wifi_ap_id ]);
$status = '--';
} else {
print_warning("AP don't exists anymore, but it's not marked to be deleted (considering Down): $index with id: $wifi_ap_id");
dbUpdate([ 'ap_status' => "down" ], 'wifi_aps', '`device_id` = ? AND `wifi_ap_id` = ?', [ $device['device_id'], $wifi_ap_id ]);
$status = 'down';
}
$table_row = [];
$table_row[] = $index;
$table_row[] = $entry['ap_name'];
$table_row[] = $entry['ap_address'];
$table_row[] = $entry['ap_serial'];
$table_row[] = $entry['ap_model'];
$table_row[] = $entry['ap_location'];
$table_row[] = $status;
$table_row[] = '%rdeleted%n';
$table_row[] = '--';
$table_row[] = '--';
$table_row[] = '--';
$table_rows[] = $table_row;
unset($table_row);
}
}
$table_headers = [ '%WAP MacAddress%n', '%WName%n', '%WAddress%n', '%WSerial%n', '%WModel%n', '%WLocation%n', '%WOperStatus%n', '%WAdminStatus', '%WUptime%n', '%WController Uptime%n', '%WController Latency%n' ];
print_cli_table($table_rows, $table_headers);
unset($table_rows, $table_headers, $table_row);
}
// Process APs members entries
if (count($aps_member_poll) || count($aps_member_db)) {
// Check WiFi APs members
$table_rows = [];
// Known params
$aps_member_params = [ 'wifi_ap_id', 'device_id', 'ap_index_member', 'ap_name', 'ap_member_state', 'ap_member_admin_state',
'ap_member_conns', 'ap_member_channel', 'ap_member_radiotype' ];
// Add/update
foreach ($aps_member_poll as $member_index => $entry) {
if (safe_empty($entry['device_id'])) {
$entry['device_id'] = $device['device_id'];
}
$ap_entry = $aps_db[$entry['ap_index']];
unset($entry['ap_index']); // not exist in db
if (safe_empty($entry['ap_name'])) {
$entry['ap_name'] = $ap_entry['ap_name'];
}
if (safe_empty($entry['wifi_ap_id'])) {
$entry['wifi_ap_id'] = $ap_entry['wifi_ap_id'];
}
if (is_array($aps_member_db[$member_index])) {
//echo("AP member exists: $member_index\n");
$ap_member_db = $aps_member_db[$member_index];
$wifi_ap_member_id = $ap_member_db['wifi_ap_member_id'];
$ap_member_update = [];
foreach ($entry as $param => $value) {
if ($entry[$param] !== $ap_member_db[$param]) {
$ap_member_update[$param] = safe_empty($entry[$param]) ? [ 'NULL' ] : $entry[$param];
}
}
if (count($ap_member_update)) {
dbUpdate($ap_member_update, 'wifi_aps_members', '`wifi_ap_member_id` = ?', [ $wifi_ap_member_id ]);
}
} else {
//echo("New AP member: $member_index\n");
$wifi_ap_member_id = dbInsert($entry, 'wifi_aps_members');
}
$table_row = [];
$table_row[] = $member_index;
$table_row[] = $entry['ap_name'];
$table_row[] = $entry['ap_member_radiotype'];
$table_row[] = $entry['ap_member_channel'];
$table_row[] = $entry['ap_member_conns'];
$table_row[] = $entry['ap_member_state'];
$table_row[] = $entry['ap_member_admin_state'];
$table_rows[] = $table_row;
unset($table_row);
// Update graph
rrdtool_update_ng($device, 'wifi_ap_member', [ 'bsnApIfNoOfUsers' => $entry['ap_member_conns'] ], $member_index);
}
// Delete removed members
foreach ($aps_member_db as $member_index => $entry) {
if (!isset($aps_member_poll[$member_index])) {
$wifi_ap_member_id = $entry['wifi_ap_member_id'];
dbDelete('wifi_aps_members', '`wifi_ap_member_id` = ?', [ $wifi_ap_member_id ]);
$table_row = [];
$table_row[] = $member_index;
$table_row[] = $entry['ap_name'];
$table_row[] = $entry['ap_member_radiotype'];
$table_row[] = $entry['ap_member_channel'];
$table_row[] = '--';
$table_row[] = '--';
$table_row[] = '%rdeleted%n';
$table_rows[] = $table_row;
unset($table_row);
}
}
$table_headers = array('%WAP MacAddress%n', '%WAP Name%n', '%WMember Radio Type%n', '%WChannel Number%n', '%WConnected Users%n', '%WOper Status%n', '%WAdmin Status%n');
print_cli_table($table_rows, $table_headers);
unset($table_rows, $table_headers);
}
// WiFi Controller stats
if (count($wifi_controller)) {
rrdtool_update_ng($device, 'wifi-controller', [
'NUMAPS' => $wifi_controller['aps'],
'NUMCLIENTS' => $wifi_controller['clients'],
]);
}
unset($GLOBALS['cache']['wifi_radios'], $GLOBALS['cache']['wifi_wlans'], $aps_db, $aps_poll, $aps_member_db, $aps_member_poll, $member_index);
/// FIXME : everything below this point is horrible shit that needs to be moved elsewhere.
/// These aren't wireless entities, they're just graphs. They go in graphs.
// Convert old variables to array
$poll_wifi = [];
if (isset($wificlients1) && is_numeric($wificlients1)) {
$poll_wifi['wifi_clients1'] = $wificlients1;
}
if (isset($wificlients2) && is_numeric($wificlients2)) {
$poll_wifi['wifi_clients2'] = $wificlients2;
}
if (isset($wifi_ap_count) && is_numeric($wifi_ap_count)) {
$poll_wifi['wifi_ap_count'] = $wifi_ap_count;
}
// Find MIB-specific SNMP data via OID fetch: wifi_clients (or wifi_clients1, wifi_clients2), wifi_ap_count
$wifi_metatypes = [ 'wifi_clients', 'wifi_clients1', 'wifi_clients2', 'wifi_ap_count' ];
foreach (poll_device_mib_metatypes($device, $wifi_metatypes, $poll_wifi) as $metatype => $value) {
if (!is_numeric($value)) { continue; } // Skip not numeric entries
// RRD Filling Code
switch ($metatype) {
case 'wifi_clients':
case 'wifi_clients1':
rrdtool_update_ng($device, 'wificlients', [ 'wificlients' => $value ], 'radio1');
$graphs['wifi_clients'] = TRUE;
break;
case 'wifi_clients2':
rrdtool_update_ng($device, 'wificlients', [ 'wificlients' => $value ], 'radio2');
$graphs['wifi_clients'] = TRUE;
break;
case 'wifi_ap_count':
rrdtool_update_ng($device, 'wifi_ap_count', [ 'value' => $value ]);
$graphs['wifi_ap_count'] = TRUE;
break;
}
}
unset($wificlients2, $wificlients1, $wifi_ap_count);
// EOF