2011-04-27 01:39:02 +00:00
< ? php
2015-07-10 13:36:21 +02:00
echo 'OSPF: ' ;
2011-04-27 17:41:35 +00:00
$ospf_instance_count = 0 ;
$ospf_port_count = 0 ;
$ospf_area_count = 0 ;
$ospf_neighbour_count = 0 ;
2011-04-27 13:51:30 +00:00
2015-07-10 13:36:21 +02:00
$ospf_oids_db = array (
'ospfRouterId' ,
'ospfAdminStat' ,
'ospfVersionNumber' ,
'ospfAreaBdrRtrStatus' ,
'ospfASBdrRtrStatus' ,
'ospfExternLsaCount' ,
'ospfExternLsaCksumSum' ,
'ospfTOSSupport' ,
'ospfOriginateNewLsas' ,
'ospfRxNewLsas' ,
'ospfExtLsdbLimit' ,
'ospfMulticastExtensions' ,
'ospfExitOverflowInterval' ,
'ospfDemandExtensions' ,
);
2011-04-27 01:39:02 +00:00
2015-07-10 13:36:21 +02:00
$ospf_area_oids = array (
'ospfAuthType' ,
'ospfImportAsExtern' ,
'ospfSpfRuns' ,
'ospfAreaBdrRtrCount' ,
'ospfAsBdrRtrCount' ,
'ospfAreaLsaCount' ,
'ospfAreaLsaCksumSum' ,
'ospfAreaSummary' ,
'ospfAreaStatus' ,
);
2011-04-27 01:39:02 +00:00
2015-07-10 13:36:21 +02:00
$ospf_port_oids = array (
'ospfIfIpAddress' ,
'port_id' ,
'ospfAddressLessIf' ,
'ospfIfAreaId' ,
'ospfIfType' ,
'ospfIfAdminStat' ,
'ospfIfRtrPriority' ,
'ospfIfTransitDelay' ,
'ospfIfRetransInterval' ,
2016-01-20 15:13:53 +01:00
'ospfIfHelloInterval' ,
2015-07-10 13:36:21 +02:00
'ospfIfRtrDeadInterval' ,
'ospfIfPollInterval' ,
'ospfIfState' ,
'ospfIfDesignatedRouter' ,
'ospfIfBackupDesignatedRouter' ,
'ospfIfEvents' ,
'ospfIfAuthKey' ,
'ospfIfStatus' ,
'ospfIfMulticastForwarding' ,
'ospfIfDemand' ,
'ospfIfAuthType' ,
);
2011-04-27 01:39:02 +00:00
2016-01-20 15:13:53 +01:00
$ospf_nbr_oids_db = array (
'ospfNbrIpAddr' ,
'ospfNbrAddressLessIndex' ,
'ospfNbrRtrId' ,
'ospfNbrOptions' ,
'ospfNbrPriority' ,
'ospfNbrState' ,
'ospfNbrEvents' ,
'ospfNbrLsRetransQLen' ,
'ospfNbmaNbrStatus' ,
'ospfNbmaNbrPermanence' ,
'ospfNbrHelloSuppressed' ,
);
2016-01-28 11:00:24 +01:00
$ospf_nbr_oids_rrd = array ();
$ospf_nbr_oids = array_merge ( $ospf_nbr_oids_db , $ospf_nbr_oids_rrd );
2016-01-20 15:13:53 +01:00
if ( key_exists ( 'vrf_lite_cisco' , $device ) && ( count ( $device [ 'vrf_lite_cisco' ]) != 0 )) {
$vrfs_lite_cisco = $device [ 'vrf_lite_cisco' ];
2016-01-28 11:00:24 +01:00
}
else {
2016-01-20 15:13:53 +01:00
$vrfs_lite_cisco = array ( array ( 'context_name' => null ));
2011-04-27 01:39:02 +00:00
}
2016-01-20 15:13:53 +01:00
foreach ( $vrfs_lite_cisco as $vrf_lite ) {
$device [ 'context_name' ] = $vrf_lite [ 'context_name' ];
2016-01-28 11:00:24 +01:00
echo 'Processes: ' ;
2016-01-20 15:13:53 +01:00
// Build array of existing entries
foreach ( dbFetchRows ( 'SELECT * FROM `ospf_instances` WHERE `device_id` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $device [ 'context_name' ])) as $entry ) {
$ospf_instances_db [ $entry [ 'ospf_instance_id' ]][ $entry [ 'context_name' ]] = $entry ;
2015-07-10 13:36:21 +02:00
}
2011-04-27 01:39:02 +00:00
2016-01-20 15:13:53 +01:00
// Pull data from device
$ospf_instances_poll = snmpwalk_cache_oid ( $device , 'OSPF-MIB::ospfGeneralGroup' , array (), 'OSPF-MIB' );
foreach ( $ospf_instances_poll as $ospf_instance_id => $ospf_entry ) {
// If the entry doesn't already exist in the prebuilt array, insert into the database and put into the array
if ( empty ( $ospf_instances_db [ $ospf_instance_id ][ $device [ 'context_name' ]])) {
dbInsert ( array ( 'device_id' => $device [ 'device_id' ], 'ospf_instance_id' => $ospf_instance_id , 'context_name' => $device [ 'context_name' ]), 'ospf_instances' );
echo '+' ;
2016-01-28 11:00:24 +01:00
$entry = dbFetchRow ( 'SELECT * FROM `ospf_instances` WHERE `device_id` = ? AND `ospf_instance_id` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $ospf_instance_id , $device [ 'context_name' ]));
$ospf_instances_db [ $ospf_instance_id ][ $device [ 'context_name' ]] = $entry ;
2016-01-20 15:13:53 +01:00
}
}
2011-04-27 14:59:50 +00:00
2016-01-20 15:13:53 +01:00
if ( $debug ) {
echo " \n Polled: " ;
print_r ( $ospf_instances_poll );
echo 'Database: ' ;
print_r ( $ospf_instances_db );
echo " \n " ;
}
2015-07-10 13:36:21 +02:00
2016-01-20 15:13:53 +01:00
// Loop array of entries and update
if ( is_array ( $ospf_instances_db )) {
foreach ( $ospf_instances_db as $ospf_instance_id => $ospf_instance_db ) {
if ( is_array ( $ospf_instances_poll [ $ospf_instance_id ])) {
$ospf_instance_poll = $ospf_instances_poll [ $ospf_instance_id ];
foreach ( $ospf_oids_db as $oid ) {
// Loop the OIDs
if ( $ospf_instance_db [ $device [ 'context_name' ]][ $oid ] != $ospf_instance_poll [ $oid ]) {
// If data has changed, build a query
$ospf_instance_update [ $oid ] = $ospf_instance_poll [ $oid ];
// log_event("$oid -> ".$this_port[$oid], $device, 'ospf', $port['port_id']); // FIXME
}
}
2015-07-10 13:36:21 +02:00
2016-01-20 15:13:53 +01:00
if ( $ospf_instance_update ) {
2016-01-28 11:00:24 +01:00
dbUpdate ( $ospf_instance_update , 'ospf_instances' , '`device_id` = ? AND `ospf_instance_id` = ? AND `context_name`=? ' , array ( $device [ 'device_id' ], $ospf_instance_id , $device [ 'context_name' ]));
2016-01-20 15:13:53 +01:00
echo 'U' ;
unset ( $ospf_instance_update );
2015-07-10 13:36:21 +02:00
}
2016-01-20 15:13:53 +01:00
else {
echo '.' ;
}
unset ( $ospf_instance_poll );
unset ( $ospf_instance_db );
$ospf_instance_count ++ ;
} else {
dbDelete ( 'ospf_instances' , '`device_id` = ? AND `ospf_instance_id` = ? AND `context_name`=? ' , array ( $device [ 'device_id' ], $ospf_area_db [ 'ospfAreaId' ], $device [ 'context_name' ]));
2015-07-10 13:36:21 +02:00
}
2016-01-20 15:13:53 +01:00
} //end foreach
} //end if
unset ( $ospf_instances_poll );
unset ( $ospf_instances_db );
echo ' Areas: ' ;
// Build array of existing entries
2016-01-28 11:00:24 +01:00
foreach ( dbFetchRows ( 'SELECT * FROM `ospf_areas` WHERE `device_id` = ? AND `context_name`= ?' , array ( $device [ 'device_id' ], $device [ 'context_name' ])) as $entry ) {
2016-01-20 15:13:53 +01:00
$ospf_areas_db [ $entry [ 'ospfAreaId' ]][ $entry [ 'context_name' ]] = $entry ;
}
// Pull data from device
$ospf_areas_poll = snmpwalk_cache_oid ( $device , 'OSPF-MIB::ospfAreaEntry' , array (), 'OSPF-MIB' );
foreach ( $ospf_areas_poll as $ospf_area_id => $ospf_area ) {
// If the entry doesn't already exist in the prebuilt array, insert into the database and put into the array
2016-01-28 11:00:24 +01:00
if ( empty ( $ospf_areas_db [ $ospf_area_id ][ $device [ 'context_name' ]])) {
2016-01-20 15:13:53 +01:00
dbInsert ( array ( 'device_id' => $device [ 'device_id' ], 'ospfAreaId' => $ospf_area_id , 'context_name' => $device [ 'context_name' ]), 'ospf_areas' );
echo '+' ;
$entry = dbFetchRows ( 'SELECT * FROM `ospf_areas` WHERE `device_id` = ? AND `ospfAreaId` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $ospf_area_id , $device [ 'context_name' ]));
$ospf_areas_db [ $ospf_area_id ][ $device [ 'context_name' ]] = $entry ;
}
}
if ( $debug ) {
echo " \n Polled: " ;
print_r ( $ospf_areas_poll );
echo 'Database: ' ;
print_r ( $ospf_areas_db );
echo " \n " ;
}
// Loop array of entries and update
if ( is_array ( $ospf_areas_db )) {
2016-01-28 11:00:24 +01:00
foreach ( $ospf_areas_db as $ospf_area_id => $ospf_area_db ) {
2016-01-20 15:13:53 +01:00
if ( is_array ( $ospf_areas_poll [ $ospf_area_id ])) {
$ospf_area_poll = $ospf_areas_poll [ $ospf_area_id ];
foreach ( $ospf_area_oids as $oid ) {
// Loop the OIDs
2016-01-28 11:00:24 +01:00
if ( $ospf_area_db [ $device [ 'context_name' ]][ $oid ] != $ospf_area_poll [ $oid ]) {
2016-01-20 15:13:53 +01:00
// If data has changed, build a query
$ospf_area_update [ $oid ] = $ospf_area_poll [ $oid ];
// log_event("$oid -> ".$this_port[$oid], $device, 'interface', $port['port_id']); // FIXME
}
}
2015-07-10 13:36:21 +02:00
2016-01-20 15:13:53 +01:00
if ( $ospf_area_update ) {
dbUpdate ( $ospf_area_update , 'ospf_areas' , '`device_id` = ? AND `ospfAreaId` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $ospf_area_id , $device [ 'context_name' ]));
echo 'U' ;
unset ( $ospf_area_update );
}
else {
echo '.' ;
}
unset ( $ospf_area_poll );
unset ( $ospf_area_db );
$ospf_area_count ++ ;
2015-07-10 13:36:21 +02:00
}
else {
2016-01-20 15:13:53 +01:00
dbDelete ( 'ospf_ports' , '`device_id` = ? AND `ospfAreaId` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $ospf_area_db [ 'ospfAreaId' ], $device [ 'context_name' ]));
} //end if
} //end foreach
} //end if
unset ( $ospf_areas_db );
unset ( $ospf_areas_poll );
// $ospf_ports = snmpwalk_cache_oid($device, "OSPF-MIB::ospfIfEntry", array(), "OSPF-MIB");
// print_r($ospf_ports);
echo ' Ports: ' ;
// Build array of existing entries
foreach ( dbFetchRows ( 'SELECT * FROM `ospf_ports` WHERE `device_id` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $device [ 'context_name' ])) as $entry ) {
$ospf_ports_db [ $entry [ 'ospf_port_id' ]][ $device [ 'context_name' ]] = $entry ;
}
2015-07-10 13:36:21 +02:00
2016-01-20 15:13:53 +01:00
// Pull data from device
$ospf_ports_poll = snmpwalk_cache_oid ( $device , 'OSPF-MIB::ospfIfEntry' , array (), 'OSPF-MIB' );
foreach ( $ospf_ports_poll as $ospf_port_id => $ospf_port ) {
// If the entry doesn't already exist in the prebuilt array, insert into the database and put into the array
2016-01-28 11:00:24 +01:00
if ( empty ( $ospf_ports_db [ $ospf_port_id ][ $device [ 'context_name' ]])) {
2016-01-20 15:13:53 +01:00
dbInsert ( array ( 'device_id' => $device [ 'device_id' ], 'ospf_port_id' => $ospf_port_id , 'context_name' => $device [ 'context_name' ]), 'ospf_ports' );
echo '+' ;
2016-01-28 11:00:24 +01:00
$ospf_ports_db [ $ospf_port_id ][ $device [ 'context_name' ]] = dbFetchRow ( 'SELECT * FROM `ospf_ports` WHERE `device_id` = ? AND `ospf_port_id` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $ospf_port_id , $device [ 'context_name' ]));
2011-04-27 01:39:02 +00:00
}
2016-01-20 15:13:53 +01:00
}
if ( $debug ) {
echo " \n Polled: " ;
print_r ( $ospf_ports_poll );
echo 'Database: ' ;
print_r ( $ospf_ports_db );
echo " \n " ;
}
// Loop array of entries and update
if ( is_array ( $ospf_ports_db )) {
foreach ( $ospf_ports_db as $ospf_port_id => $ospf_port_db ) {
if ( is_array ( $ospf_ports_poll [ $ospf_port_id ])) {
$ospf_port_poll = $ospf_ports_poll [ $ospf_port_id ];
if ( $ospf_port_poll [ 'ospfAddressLessIf' ]) {
$ospf_port_poll [ 'port_id' ] = @ dbFetchCell ( 'SELECT `port_id` FROM `ports` WHERE `device_id` = ? AND `ifIndex` = ?' , array ( $device [ 'device_id' ], $ospf_port_poll [ 'ospfAddressLessIf' ]));
}
else {
$ospf_port_poll [ 'port_id' ] = @ dbFetchCell ( 'SELECT A.`port_id` FROM ipv4_addresses AS A, ports AS I WHERE A.ipv4_address = ? AND I.port_id = A.port_id AND I.device_id = ? AND A.context_name = ?' , array ( $ospf_port_poll [ 'ospfIfIpAddress' ], $device [ 'device_id' ], $device [ 'context_name' ]));
}
foreach ( $ospf_port_oids as $oid ) {
// Loop the OIDs
if ( $ospf_port_db [ $device [ 'context_name' ]][ $oid ] != $ospf_port_poll [ $oid ]) {
// If data has changed, build a query
$ospf_port_update [ $oid ] = $ospf_port_poll [ $oid ];
// log_event("$oid -> ".$this_port[$oid], $device, 'ospf', $port['port_id']); // FIXME
}
}
if ( $ospf_port_update ) {
dbUpdate ( $ospf_port_update , 'ospf_ports' , '`device_id` = ? AND `ospf_port_id` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $ospf_port_id , $device [ 'context_name' ]));
echo 'U' ;
unset ( $ospf_port_update );
}
else {
echo '.' ;
}
unset ( $ospf_port_poll );
unset ( $ospf_port_db );
$ospf_port_count ++ ;
}
else {
dbDelete ( 'ospf_ports' , '`device_id` = ? AND `ospf_port_id` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $ospf_port_db [ 'ospf_port_id' ], $device [ 'context_name' ]));
// ("DELETE FROM `ospf_ports` WHERE `device_id` = '".$device['device_id']."' AND `ospf_port_id` = '".$ospf_port_db['ospf_port_id']."'");
echo '-' ;
} //end if
} //end foreach
} //end if
2015-07-10 13:36:21 +02:00
// OSPF-MIB::ospfNbrIpAddr.172.22.203.98.0 172.22.203.98
// OSPF-MIB::ospfNbrAddressLessIndex.172.22.203.98.0 0
// OSPF-MIB::ospfNbrRtrId.172.22.203.98.0 172.22.203.128
// OSPF-MIB::ospfNbrOptions.172.22.203.98.0 2
// OSPF-MIB::ospfNbrPriority.172.22.203.98.0 0
// OSPF-MIB::ospfNbrState.172.22.203.98.0 full
// OSPF-MIB::ospfNbrEvents.172.22.203.98.0 6
// OSPF-MIB::ospfNbrLsRetransQLen.172.22.203.98.0 1
// OSPF-MIB::ospfNbmaNbrStatus.172.22.203.98.0 active
// OSPF-MIB::ospfNbmaNbrPermanence.172.22.203.98.0 dynamic
// OSPF-MIB::ospfNbrHelloSuppressed.172.22.203.98.0 false
2016-01-20 15:13:53 +01:00
echo ' Neighbours: ' ;
2015-07-10 13:36:21 +02:00
2016-01-28 11:00:24 +01:00
2011-04-30 22:20:11 +00:00
2016-01-20 15:13:53 +01:00
// Build array of existing entries
foreach ( dbFetchRows ( 'SELECT * FROM `ospf_nbrs` WHERE `device_id` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $device [ 'context_name' ])) as $nbr_entry ) {
$ospf_nbrs_db [ $nbr_entry [ 'ospf_nbr_id' ]][ $device [ 'context_name' ]] = $nbr_entry ;
}
2011-04-30 22:20:11 +00:00
2016-01-20 15:13:53 +01:00
// Pull data from device
$ospf_nbrs_poll = snmpwalk_cache_oid ( $device , 'OSPF-MIB::ospfNbrEntry' , array (), 'OSPF-MIB' );
2015-07-10 13:36:21 +02:00
2016-01-20 15:13:53 +01:00
foreach ( $ospf_nbrs_poll as $ospf_nbr_id => $ospf_nbr ) {
// If the entry doesn't already exist in the prebuilt array, insert into the database and put into the array
if ( ! isset ( $ospf_nbrs_db [ $ospf_nbr_id ][ $device [ 'context_name' ]])) {
dbInsert ( array ( 'device_id' => $device [ 'device_id' ], 'ospf_nbr_id' => $ospf_nbr_id , 'context_name' => $device [ 'context_name' ]), 'ospf_nbrs' );
echo '+' ;
$entry = dbFetchRow ( 'SELECT * FROM `ospf_nbrs` WHERE `device_id` = ? AND `ospf_nbr_id` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $ospf_nbr_id , $device [ 'context_name' ]));
$ospf_nbrs_db [ $ospf_nbr_id ][ $device [ 'context_name' ]] = $entry ;
}
2015-07-10 13:36:21 +02:00
}
2011-04-30 22:20:11 +00:00
2016-01-20 15:13:53 +01:00
if ( $debug ) {
echo " \n Polled: " ;
print_r ( $ospf_nbrs_poll );
echo 'Database: ' ;
print_r ( $ospf_nbrs_db );
echo " \n " ;
}
2011-04-30 22:20:11 +00:00
2016-01-20 15:13:53 +01:00
// Loop array of entries and update
if ( is_array ( $ospf_nbrs_db )) {
foreach ( $ospf_nbrs_db as $ospf_nbr_id => $ospf_nbr_db ) {
2016-01-28 11:00:24 +01:00
if ( is_array ( $ospf_nbrs_poll [ $ospf_nbr_id ])) {
$ospf_nbr_poll = $ospf_nbrs_poll [ $ospf_nbr_id ];
2016-01-20 15:13:53 +01:00
2016-01-28 11:00:24 +01:00
$ospf_nbr_poll [ 'port_id' ] = @ dbFetchCell ( 'SELECT A.`port_id` FROM ipv4_addresses AS A, ospf_nbrs AS I WHERE A.ipv4_address = ? AND I.port_id = A.port_id AND I.device_id = ? AND A.context_name = ?' , array ( $ospf_nbr_poll [ 'ospfNbrIpAddr' ], $device [ 'device_id' ], $device [ 'context_name' ]));
2016-01-20 15:13:53 +01:00
if ( $ospf_nbr_db [ $device [ 'context_name' ]][ 'port_id' ] != $ospf_nbr_poll [ 'port_id' ]) {
if ( ! empty ( $ospf_nbr_poll [ 'port_id' ])) {
$ospf_nbr_update = array ( 'port_id' => $ospf_nbr_poll [ 'port_id' ]);
}
else {
$ospf_nbr_update = array ( 'port_id' => array ( 'NULL' ));
}
}
2015-07-10 13:36:21 +02:00
2016-01-20 15:13:53 +01:00
foreach ( $ospf_nbr_oids as $oid ) {
// Loop the OIDs
d_echo ( $ospf_nbr_db [ $device [ 'context_name' ]][ $oid ] . '|' . $ospf_nbr_poll [ $oid ] . " \n " );
2015-07-10 13:36:21 +02:00
2016-01-20 15:13:53 +01:00
if ( $ospf_nbr_db [ $device [ 'context_name' ]][ $oid ] != $ospf_nbr_poll [ $oid ]) {
// If data has changed, build a query
$ospf_nbr_update [ $oid ] = $ospf_nbr_poll [ $oid ];
// log_event("$oid -> ".$this_nbr[$oid], $device, 'ospf', $nbr['port_id']); // FIXME
}
2015-07-10 13:36:21 +02:00
}
2016-01-20 15:13:53 +01:00
if ( $ospf_nbr_update ) {
dbUpdate ( $ospf_nbr_update , 'ospf_nbrs' , '`device_id` = ? AND `ospf_nbr_id` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $ospf_nbr_id , $device [ 'context_name' ]));
echo 'U' ;
unset ( $ospf_nbr_update );
}
else {
echo '.' ;
2015-07-10 13:36:21 +02:00
}
2016-01-20 15:13:53 +01:00
unset ( $ospf_nbr_poll );
unset ( $ospf_nbr_db );
$ospf_nbr_count ++ ;
2015-07-10 13:36:21 +02:00
}
else {
2016-01-20 15:13:53 +01:00
dbDelete ( 'ospf_nbrs' , '`device_id` = ? AND `ospf_nbr_id` = ? AND `context_name` = ?' , array ( $device [ 'device_id' ], $ospf_nbr_db [ 'ospf_nbr_id' ], $device [ 'context_name' ]));
echo '-' ;
} //end if
} //end foreach
} //end if
unset ( $ospf_nbrs_db );
unset ( $ospf_nbrs_poll );
2016-01-28 11:00:24 +01:00
echo " \n " ;
2016-01-20 15:13:53 +01:00
}
unset ( $device [ 'context_name' ]);
unset ( $vrfs_lite_cisco );
2012-05-25 12:24:34 +00:00
// Create device-wide statistics RRD
2015-07-10 13:36:21 +02:00
$filename = $config [ 'rrd_dir' ] . '/' . $device [ 'hostname' ] . '/' . safename ( 'ospf-statistics.rrd' );
if ( ! is_file ( $filename )) {
rrdtool_create (
$filename ,
2015-09-28 08:24:57 +00:00
' -- step 300
DS : instances : GAUGE : 600 : 0 : 1000000
DS : areas : GAUGE : 600 : 0 : 1000000
DS : ports : GAUGE : 600 : 0 : 1000000
2015-07-10 13:36:21 +02:00
DS : neighbours : GAUGE : 600 : 0 : 1000000 '.$config[' rrd_rra ' ]
);
}
2011-04-27 17:41:35 +00:00
2015-08-18 16:26:55 +00:00
$fields = array (
'instances' => $ospf_instance_count ,
'areas' => $ospf_area_count ,
'ports' => $ospf_port_count ,
'neighbours' => $ospf_neighbour_count ,
);
$ret = rrdtool_update ( " $filename " , $fields );
2011-04-27 17:41:35 +00:00
2015-08-19 20:58:02 +00:00
$tags = array ();
influx_update ( $device , 'ospf-statistics' , $tags , $fields );
2015-07-10 13:36:21 +02:00
echo " \n " ;