Observium_CE/includes/polling/ports/tplink-dot1q-vlan-mib.inc.php

128 lines
4.7 KiB
PHP

<?php
/**
* Observium
*
* This file is part of Observium.
*
* @package observium
* @subpackage poller
* @copyright (C) Adam Armstrong
*
*/
// Untagged/primary port vlans
$port_module = 'vlan';
if (!$ports_modules[$port_module]) {
// Module disabled
return FALSE; // False for do not collect stats
}
/*
TPLINK-DOT1Q-VLAN-MIB::vlanPortPvid.49154 = INTEGER: 999
TPLINK-DOT1Q-VLAN-MIB::vlanPortPvid.49155 = INTEGER: 744
TPLINK-DOT1Q-VLAN-MIB::vlanPortPvid.49156 = INTEGER: 2616
*/
// Base vlan IDs
$ports_vlans_oids = snmpwalk_cache_oid($device, 'vlanPortPvid', [], 'TPLINK-DOT1Q-VLAN-MIB');
print_debug_vars($ports_vlans_oids);
if (snmp_status()) {
echo("vlanPortPvid ");
// TPLINK-DOT1Q-VLAN-MIB::vlanPortNumber.49154 = STRING: "1/0/2"
$port_descr = [];
foreach (snmpwalk_cache_oid($device, 'vlanPortNumber', [], 'TPLINK-DOT1Q-VLAN-MIB') as $index => $entry) {
$port_descr[$entry['vlanPortNumber']] = $index;
}
// TPLINK-DOT1Q-VLAN-MIB::vlanTagPortMemberAdd.8 = ""
// TPLINK-DOT1Q-VLAN-MIB::vlanTagPortMemberAdd.10 = STRING: "1/0/4,1/0/11,1/0/13,1/0/15,1/0/19-20"
$port_trunks = [];
foreach (snmpwalk_cache_oid($device, 'vlanTagPortMemberAdd', [], 'TPLINK-DOT1Q-VLAN-MIB') as $vlan_num => $vlan) {
if (safe_empty($vlan['vlanTagPortMemberAdd'])) {
continue;
}
// See: https://jira.observium.org/browse/OBS-3827
// TPLINK-DOT1Q-VLAN-MIB::vlanTagPortMemberAdd.10 = STRING: "1/0/4,1/0/11,1/0/13,1/0/15,1/0/19-20"
// TPLINK-DOT1Q-VLAN-MIB::vlanTagPortMemberAdd.2 = STRING: "Gi1/0/3-24,Te1/0/27-28,Gi2/0/3-24,Te2/0/27-28,Po1-3,7,11,13-14"
$members = [];
$i = -1;
foreach (explode(',', $vlan['vlanTagPortMemberAdd']) as $member) {
if (!preg_match('/^\d+(\-\d+)?$/', $member)) {
$i++;
$members[$i] = $member;
} else {
// append to previous
$members[$i] .= ',' . $member;
}
}
$member_base = '';
foreach ($members as $member) {
if (isset($port_descr[$member])) {
$ifIndex = $port_descr[$member];
$port_trunks[$ifIndex][$vlan_num] = $vlan_num;
continue;
}
if (preg_match('/^([^\d]+)(.+)$/', $member, $matches)) {
$member_base = $matches[1];
}
if (str_contains_array($member, ['-', ','])) {
// Expand list to individual ports
if (str_contains($member, '/')) {
// 1/0/19-20,30
// Te2/0/27-28,30
$split_char = '/';
$member_array = explode($split_char, $member);
} elseif (preg_match('/^([^\d]+)(.+)$/', $member, $matches)) {
// Po1-3,7,11,13-14
$split_char = '';
$member_array = [$matches[1], $matches[2]];
}
$numbers = array_pop($member_array);
foreach (list_to_range($numbers) as $number) {
$member_new = $member_array;
$member_new[] = $number;
$member_name = implode($split_char, $member_new);
if (isset($port_descr[$member_name])) {
$ifIndex = $port_descr[$member_name];
$port_trunks[$ifIndex][$vlan_num] = $vlan_num;
continue;
}
if (isset($port_descr[$member_base . $member_name])) {
$ifIndex = $port_descr[$member_base . $member_name];
$discovery_ports_vlans[$ifIndex][$vlan_num] = ['vlan' => $vlan_num];
continue;
}
}
} elseif (isset($port_descr[$member_base . $member])) {
$ifIndex = $port_descr[$member_base . $member];
$discovery_ports_vlans[$ifIndex][$vlan_num] = ['vlan' => $vlan_num];
continue;
}
print_debug("Unknown port name for Tagged Vlans: $member");
}
}
$vlan_rows = [];
foreach ($ports_vlans_oids as $ifIndex => $vlan) {
$vlan_num = $vlan['vlanPortPvid'];
$trunk = isset($port_trunks[$ifIndex]) ? 'dot1Q' : 'access';
$vlan_rows[] = [$ifIndex, $vlan_num, $trunk];
// Set Vlan and Trunk
$port_stats[$ifIndex]['ifVlan'] = $vlan_num;
$port_stats[$ifIndex]['ifTrunk'] = $trunk;
}
}
$headers = ['%WifIndex%n', '%WVlan%n', '%WTrunk%n'];
print_cli_table($vlan_rows, $headers);
// EOF