$a) # { # foreach ($a as $key_b => $b) # { # foreach ($b as $key_c => $c) # { # $new_array[] = array($key_a, $key_b, $key_c, $c); # } # } # } # return $new_array; #} $acc_id = []; // Count exist ma_ids if (safe_count($ma_array)) { if (OBS_DEBUG > 1) { print_vars($ma_array); } $polled = time(); $mac_entries = 0; echo('Entries: ' . count($ma_array) . PHP_EOL); foreach ($ma_array as $id => $ma) { $port = get_port_by_index_cache($device['device_id'], $ma['ifIndex']); echo(' ' . $id . ' '); if (!is_array($ma_db_array[$id])) { $ma_id = dbInsert(['port_id' => $port['port_id'], 'device_id' => $device['device_id'], 'vlan_id' => $ma['vlan'], 'mac' => $ma['mac']], 'mac_accounting'); if ($ma_id) { echo('+'); $acc_id[$ma_id] = $ma_id; } else { echo('-'); continue; // wrong adding to DB, not exist id - delete } } else { echo('.'); $ma_db = $ma_db_array[$id]; $acc_id[$ma_db['ma_id']] = $ma_db['ma_id']; } $polled_period = $polled - $acc['poll_time']; if (OBS_DEBUG > 1) { print_vars($ma_array[$ifIndex][$vlan_id][$mac]); } $ma['update']['poll_time'] = $polled; $ma['update']['poll_period'] = $polled_period; $mac_entries++; $b_in = $ma['bytes']['input']; $b_out = $ma['bytes']['output']; $p_in = $ma['pkts']['input']; $p_out = $ma['pkts']['output']; echo(' ' . $port['ifDescr'] . '(' . $ifIndex . ') -> ' . $mac); // Update metrics foreach (['bytes', 'pkts'] as $oid) { foreach (['input', 'output'] as $dir) { $oid_dir = $oid . '_' . $dir; $ma['update'][$oid_dir] = $ma[$oid][$dir]; if ($ma[$oid][$dir] && $ma_db[$oid_dir]) { $oid_diff = $ma[$oid][$dir] - $ma_db[$oid_dir]; $oid_rate = $oid_diff / $polled_period; $ma['update'][$oid_dir . '_rate'] = $oid_rate; $ma['update'][$oid_dir . '_delta'] = $oid_diff; print_debug("\n $oid_dir ($oid_diff B) $oid_rate Bps $polled_period secs"); } } print_debug($ma['hostname'] . ' ' . $ma['ifDescr'] . " $mac -> $b_in:$b_out:$p_in:$p_out "); // FIXME - use memory tables to make sure these values don't go backwards? rrdtool_update_ng($device, 'mac_acc', [ 'IN' => $b_in, 'OUT' => $b_out, 'PIN' => $p_in, 'POUT' => $p_out, ], $port['ifIndex'] . '-' . $ma['vlan'] . '-' . $ma['mac']); if (OBS_DEBUG > 1) { print_vars($ma['update']); } if (is_array($ma['update'])) { // Do Updates dbUpdate($ma['update'], 'mac_accounting', '`ma_id` = ?', [$ma_db['ma_id']]); } // End Updates } } unset($ma_array); if ($mac_entries) { echo(" $mac_entries MAC accounting entries\n"); } echo(PHP_EOL); } // CLEAN not exist entries foreach ($acc_id_db as $ma_id => $entry) { if (!isset($acc_id[$ma_id])) { dbDelete('mac_accounting', '`ma_id` = ?', [$ma_id]); } } echo(PHP_EOL); // EOF