$vlans) { foreach ($vlans as $vlan_id => $vlan) { echo(" $vlan_id"); $vlan_update = []; // Currently, vlan_context param only actual for CISCO-VTP-MIB if (!isset($vlan['vlan_context'])) { $vlan['vlan_context'] = 0; } if (isset($vlans_db[$domain_index][$vlan_id])) { // Vlan already in db, compare foreach ($vlan_params as $param) { if ($vlans_db[$domain_index][$vlan_id][$param] != $vlan[$param]) { if ($param === 'ifIndex' && (is_null($vlan[$param]) || $vlan[$param] === '')) { // Empty string stored as 0, prevent $vlan_update[$param] = ['NULL']; } else { $vlan_update[$param] = $vlan[$param]; } } } if (count($vlan_update)) { dbUpdate($vlan_update, 'vlans', 'vlan_id = ?', [$vlans_db[$domain_index][$vlan_id]['vlan_id']]); $module_stats[$vlan_id]['V'] = 'U'; $GLOBALS['module_stats'][$module]['updated']++; } else { $module_stats[$vlan_id]['V'] = '.'; $GLOBALS['module_stats'][$module]['unchanged']++; } } else { // New vlan discovered $vlan_update = $vlan; $vlan_update['device_id'] = $device['device_id']; dbInsert($vlan_update, 'vlans'); $module_stats[$vlan_id]['V'] = '+'; $GLOBALS['module_stats'][$module]['added']++; } $table_rows[] = [$domain_index, $vlan_id, $vlan['vlan_name'], $vlan['vlan_type'], $vlan['vlan_status']]; } } $table_headers = ['%WDomain%n', '%WVlan: ID%n', '%WName%n', '%WType%n', '%WStatus%n']; print_cli_table($table_rows, $table_headers); /* End process vlans */ // Clean removed vlans foreach ($vlans_db as $domain_index => $vlans) { foreach ($vlans as $vlan_id => $vlan) { if (empty($discovery_vlans[$domain_index][$vlan_id])) { dbDelete('vlans', "`device_id` = ? AND vlan_domain = ? AND vlan_vlan = ?", [$device['device_id'], $domain_index, $vlan_id]); $module_stats[$vlan_id]['V'] = '-'; $GLOBALS['module_stats'][$module]['deleted']++; $table_rows[] = [$domain_index, $vlan_id, $vlan['vlan_name'], $vlan['vlan_type'], $vlan['vlan_status'], '']; } } } $valid['vlans'] = $discovery_vlans; $GLOBALS['module_stats'][$module]['status'] = safe_count($valid[$module]); //if (OBS_DEBUG && $GLOBALS['module_stats'][$module]['status']) { print_vars($valid[$module]); } /* Process discovered ports vlans */ $table_rows = []; $vlan_params = ['vlan', 'baseport', 'priority', 'state', 'cost']; // FIXME. move STP to separate table foreach ($discovery_ports_vlans as $ifIndex => $vlans) { foreach ($vlans as $vlan_id => $vlan) { $port = get_port_by_index_cache($device, $ifIndex); if (!is_array($port)) { continue; } // Port not founded, skip $table_rows[] = [$ifIndex, $port['port_label_short'], $vlan['vlan'], $vlan['priority'], $vlan['state'], $vlan['cost']]; $vlan_update = []; if (isset($ports_vlans_db[$port['port_id']][$vlan_id])) { // Port vlan already in db, compare foreach ($vlan_params as $param) { if ($ports_vlans_db[$port['port_id']][$vlan_id] != $vlan[$param]) { $vlan_update[$param] = $vlan[$param]; } } $id = $ports_vlans_db[$port['port_id']][$vlan_id]['port_vlan_id']; if (count($vlan_update)) { dbUpdate($vlan_update, 'ports_vlans', '`port_vlan_id` = ?', [$id]); $module_stats[$vlan_id]['P'] = 'U'; $GLOBALS['module_stats']['ports_vlans']['updated']++; } else { $module_stats[$vlan_id]['P'] = '.'; $GLOBALS['module_stats']['ports_vlans']['unchanged']++; } } else { // New port vlan discovered $vlan_update = $vlan; $vlan_update['device_id'] = $device['device_id']; $vlan_update['port_id'] = $port['port_id']; $id = dbInsert($vlan_update, 'ports_vlans'); $module_stats[$vlan_id]['P'] = '+'; $GLOBALS['module_stats']['ports_vlans']['added']++; } // Store processed IDs $ports_vlans[$port['port_id']][$vlan_id] = $id; } } $table_headers = ['%WifIndex%n', '%WifDescr%n', '%WVlan%n', '%WSTP: Priority%n', '%WState%n', '%WCost%n']; print_cli_table($table_rows, $table_headers); /* End process ports vlans */ // Clean removed per port vlans foreach ($ports_vlans_db as $port_id => $vlans) { foreach ($vlans as $vlan_id => $vlan) { if (empty($ports_vlans[$port_id][$vlan_id])) { dbDelete('ports_vlans', "`port_vlan_id` = ?", [$ports_vlans_db[$port_id][$vlan_id]['port_vlan_id']]); $module_stats[$vlan_id]['P'] = '-'; $GLOBALS['module_stats']['ports_vlans']['deleted']++; } } } $valid['ports_vlans'] = $ports_vlans; $GLOBALS['module_stats']['ports_vlans']['status'] = count($valid['ports_vlans']); //if (OBS_DEBUG && $GLOBALS['module_stats']['ports_vlans']['status']) { print_vars($valid['ports_vlans']); } // Print vlan specific module stats (P - ports, V - vlans, S - spannigtree) if ($module_stats) { $msg = "Module [ $module ] stats:"; foreach ($module_stats as $vlan_id => $stat) { $msg .= ' ' . $vlan_id . '['; foreach ($stat as $k => $v) { $msg .= $k . $v; } $msg .= ']'; } echo($msg); } unset($vlans_db, $ports_vlans_db, $ports_vlans, $discovery_vlans, $discovery_ports_vlans); echo(PHP_EOL); // EOF