mirror of
				https://github.com/librenms/librenms.git
				synced 2024-10-07 16:52:45 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			192 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
use App\Models\Device;
 | 
						|
use App\Models\Ipv4Address;
 | 
						|
use App\Models\OspfArea;
 | 
						|
use App\Models\OspfInstance;
 | 
						|
use App\Models\OspfNbr;
 | 
						|
use App\Models\OspfPort;
 | 
						|
use LibreNMS\RRD\RrdDefinition;
 | 
						|
 | 
						|
$device_model = Device::find($device['device_id']);
 | 
						|
 | 
						|
if (key_exists('vrf_lite_cisco', $device) && ($device['vrf_lite_cisco'] != '')) {
 | 
						|
    $vrfs_lite_cisco = $device['vrf_lite_cisco'];
 | 
						|
} else {
 | 
						|
    $vrfs_lite_cisco = array(array('context_name' => null));
 | 
						|
}
 | 
						|
 | 
						|
foreach ($vrfs_lite_cisco as $vrf_lite) {
 | 
						|
    $device['context_name'] = $vrf_lite['context_name'];
 | 
						|
 | 
						|
    echo ' Processes: ';
 | 
						|
 | 
						|
    // Pull data from device
 | 
						|
    $ospf_instances_poll = snmpwalk_cache_oid($device, 'OSPF-MIB::ospfGeneralGroup', array(), 'OSPF-MIB');
 | 
						|
    d_echo($ospf_instances_poll);
 | 
						|
 | 
						|
    $ospf_instances = collect();
 | 
						|
    foreach ($ospf_instances_poll as $ospf_instance_id => $ospf_entry) {
 | 
						|
        // TODO add model listener from wireless polling PR #8607 for improved output
 | 
						|
        $instance = OspfInstance::updateOrCreate([
 | 
						|
            'device_id' => $device['device_id'],
 | 
						|
            'ospf_instance_id' => $ospf_instance_id,
 | 
						|
            'context_name' => $device['context_name'],
 | 
						|
        ], $ospf_entry);
 | 
						|
 | 
						|
        $ospf_instances->push($instance);
 | 
						|
    }
 | 
						|
 | 
						|
    // cleanup
 | 
						|
    OspfInstance::query()
 | 
						|
        ->where(['device_id' => $device['device_id'], 'context_name' => $device['context_name']])
 | 
						|
        ->whereNotIn('id', $ospf_instances->pluck('id'))->delete();
 | 
						|
 | 
						|
    $instance_count = $ospf_instances->count();
 | 
						|
    echo $instance_count;
 | 
						|
    if ($instance_count == 0) {
 | 
						|
        // if there are no instances, don't check for areas, neighbors, and ports
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    echo ' Areas: ';
 | 
						|
 | 
						|
    // Pull data from device
 | 
						|
    $ospf_areas_poll = snmpwalk_cache_oid($device, 'OSPF-MIB::ospfAreaEntry', array(), 'OSPF-MIB');
 | 
						|
    d_echo($ospf_areas_poll);
 | 
						|
 | 
						|
    $ospf_areas = collect();
 | 
						|
    foreach ($ospf_areas_poll as $ospf_area_id => $ospf_area) {
 | 
						|
        $area = OspfArea::updateOrCreate([
 | 
						|
            'device_id' => $device['device_id'],
 | 
						|
            'ospfAreaId' => $ospf_area_id,
 | 
						|
            'context_name' => $device['context_name'],
 | 
						|
        ], $ospf_area);
 | 
						|
 | 
						|
        $ospf_areas->push($area);
 | 
						|
    }
 | 
						|
 | 
						|
    // cleanup
 | 
						|
    OspfArea::query()
 | 
						|
        ->where(['device_id' => $device['device_id'], 'context_name' => $device['context_name']])
 | 
						|
        ->whereNotIn('id', $ospf_areas->pluck('id'))->delete();
 | 
						|
 | 
						|
    echo $ospf_areas->count();
 | 
						|
 | 
						|
    echo ' Ports: ';
 | 
						|
 | 
						|
    // Pull data from device
 | 
						|
    $ospf_ports_poll = snmpwalk_cache_oid($device, 'OSPF-MIB::ospfIfEntry', array(), 'OSPF-MIB');
 | 
						|
    d_echo($ospf_ports_poll);
 | 
						|
 | 
						|
    $ospf_ports = collect();
 | 
						|
    foreach ($ospf_ports_poll as $ospf_port_id => $ospf_port) {
 | 
						|
        // find port_id
 | 
						|
        if ($ospf_port['ospfAddressLessIf']) {
 | 
						|
            $ospf_port['port_id'] = (int)$device_model->ports()->where('ifIndex', $ospf_port['ospfAddressLessIf'])->value('port_id');
 | 
						|
        } else {
 | 
						|
            // FIXME force same device ?
 | 
						|
            $ospf_port['port_id'] = (int)Ipv4Address::query()
 | 
						|
                ->where('ipv4_address', $ospf_port['ospfIfIpAddress'])
 | 
						|
                ->where('context_name', $device['context_name'])
 | 
						|
                ->value('port_id');
 | 
						|
        }
 | 
						|
 | 
						|
        $port = OspfPort::updateOrCreate([
 | 
						|
            'device_id' => $device['device_id'],
 | 
						|
            'ospf_port_id' => $ospf_port_id,
 | 
						|
            'context_name' => $device['context_name'],
 | 
						|
        ], $ospf_port);
 | 
						|
 | 
						|
        $ospf_ports->push($port);
 | 
						|
    }
 | 
						|
 | 
						|
    // cleanup
 | 
						|
    OspfPort::query()
 | 
						|
        ->where(['device_id' => $device['device_id'], 'context_name' => $device['context_name']])
 | 
						|
        ->whereNotIn('id', $ospf_ports->pluck('id'))->delete();
 | 
						|
 | 
						|
    echo $ospf_ports->count();
 | 
						|
 | 
						|
    echo ' Neighbours: ';
 | 
						|
 | 
						|
    // Pull data from device
 | 
						|
    $ospf_nbrs_poll = snmpwalk_cache_oid($device, 'OSPF-MIB::ospfNbrEntry', array(), 'OSPF-MIB');
 | 
						|
    d_echo($ospf_nbrs_poll);
 | 
						|
 | 
						|
    $ospf_neighbours = collect();
 | 
						|
    foreach ($ospf_nbrs_poll as $ospf_nbr_id => $ospf_nbr) {
 | 
						|
        // get neighbor port_id
 | 
						|
        $ospf_nbr['port_id'] = Ipv4Address::query()
 | 
						|
            ->where('ipv4_address', $ospf_nbr['ospfNbrIpAddr'])
 | 
						|
            ->where('context_name', $device['context_name'])
 | 
						|
            ->value('port_id');
 | 
						|
        $ospf_nbr['ospf_nbr_id'] = $ospf_nbr_id;
 | 
						|
 | 
						|
        $neighbour = OspfNbr::updateOrCreate([
 | 
						|
            'device_id' => $device['device_id'],
 | 
						|
            'ospf_nbr_id' => $ospf_nbr_id,
 | 
						|
            'context_name' => $device['context_name'],
 | 
						|
        ], $ospf_nbr);
 | 
						|
 | 
						|
        $ospf_neighbours->push($neighbour);
 | 
						|
    }
 | 
						|
 | 
						|
    // cleanup
 | 
						|
    OspfNbr::query()
 | 
						|
        ->where(['device_id' => $device['device_id'], 'context_name' => $device['context_name']])
 | 
						|
        ->whereNotIn('id', $ospf_neighbours->pluck('id'))->delete();
 | 
						|
 | 
						|
    echo $ospf_neighbours->count();
 | 
						|
}
 | 
						|
 | 
						|
unset($device['context_name'], $vrfs_lite_cisco, $vrf_lite);
 | 
						|
 | 
						|
if ($instance_count) {
 | 
						|
    // Create device-wide statistics RRD
 | 
						|
    $rrd_def = RrdDefinition::make()
 | 
						|
        ->addDataset('instances', 'GAUGE', 0, 1000000)
 | 
						|
        ->addDataset('areas', 'GAUGE', 0, 1000000)
 | 
						|
        ->addDataset('ports', 'GAUGE', 0, 1000000)
 | 
						|
        ->addDataset('neighbours', 'GAUGE', 0, 1000000);
 | 
						|
 | 
						|
    $fields = [
 | 
						|
        'instances'   => $instance_count,
 | 
						|
        'areas'       => $ospf_areas->count(),
 | 
						|
        'ports'       => $ospf_ports->count(),
 | 
						|
        'neighbours'  => $ospf_neighbours->count(),
 | 
						|
    ];
 | 
						|
 | 
						|
    $tags = compact('rrd_def');
 | 
						|
    data_update($device, 'ospf-statistics', $tags, $fields);
 | 
						|
}
 | 
						|
 | 
						|
echo PHP_EOL;
 | 
						|
 | 
						|
unset(
 | 
						|
    $ospf_instances,
 | 
						|
    $instance_count,
 | 
						|
    $ospf_areas,
 | 
						|
    $ospf_ports,
 | 
						|
    $ospf_neighbours,
 | 
						|
    $ospf_instances_poll,
 | 
						|
    $ospf_areas_poll,
 | 
						|
    $ospf_ports_poll,
 | 
						|
    $ospf_nbrs_poll,
 | 
						|
    $ospf_entry,
 | 
						|
    $instance,
 | 
						|
    $ospf_instance_id,
 | 
						|
    $ospf_area,
 | 
						|
    $area,
 | 
						|
    $ospf_area_id,
 | 
						|
    $ospf_port,
 | 
						|
    $port,
 | 
						|
    $ospf_port_id,
 | 
						|
    $ospf_nbr,
 | 
						|
    $neighbour,
 | 
						|
    $ospf_nbr_id,
 | 
						|
    $rrd_def,
 | 
						|
    $fields,
 | 
						|
    $tags
 | 
						|
);
 |