| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | <?php | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2016-09-08 14:12:23 +01:00
										 |  |  | // LibreNMS module to do device discovery by ARP table contents.
 | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Needs to be run after the ARP table discovery, because it uses the
 | 
					
						
							|  |  |  | // data gathered by the ARP table discovery module.  Keeps a cache of
 | 
					
						
							|  |  |  | // seen hosts, and will not attempt re-discovery of the same IP (whether
 | 
					
						
							|  |  |  | // discovery failed or succeed) during the same discovery run.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Copyright (c) 2012-2013 Gear Consulting Pty Ltd <http://libertysys.com.au/>
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2013-11-02 16:31:49 +10:00
										 |  |  | // Author:  Paul Gear <librenms@libertysys.com.au>
 | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | // License: GPLv3
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $hostname = $device['hostname']; | 
					
						
							|  |  |  | $deviceid = $device['device_id']; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Find all IPv4 addresses in the MAC table that haven't been discovered on monitored devices.
 | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  | $sql = ' | 
					
						
							|  |  |  |     SELECT * | 
					
						
							|  |  |  |     FROM ipv4_mac as m, ports as i | 
					
						
							|  |  |  |     WHERE m.port_id = i.port_id | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  |     AND i.device_id = ? | 
					
						
							|  |  |  |     AND i.deleted = 0 | 
					
						
							|  |  |  |     AND NOT EXISTS ( | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  |         SELECT * FROM ipv4_addresses a | 
					
						
							|  |  |  |         WHERE a.ipv4_address = m.ipv4_address | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  |     GROUP BY ipv4_address | 
					
						
							|  |  |  |     ORDER BY ipv4_address | 
					
						
							|  |  |  |     '; | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-02 16:31:49 +10:00
										 |  |  | // FIXME: Observium now uses ip_mac.ip_address in place of ipv4_mac.ipv4_address - why?
 | 
					
						
							| 
									
										
										
										
											2014-03-14 09:08:32 +10:00
										 |  |  | $names = array(); | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  | $ips   = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | foreach (dbFetchRows($sql, array($deviceid)) as $entry) { | 
					
						
							|  |  |  |     global $config; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $ip    = $entry['ipv4_address']; | 
					
						
							|  |  |  |     $mac   = $entry['mac_address']; | 
					
						
							|  |  |  |     $if    = $entry['port_id']; | 
					
						
							|  |  |  |     $int   = ifLabel($if); | 
					
						
							|  |  |  |     $label = $int['label']; | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  |     // Even though match_network is done inside discover_new_device, we do it here
 | 
					
						
							|  |  |  |     // as well in order to skip unnecessary reverse DNS lookups on discovered IPs.
 | 
					
						
							|  |  |  |     if (match_network($config['autodiscovery']['nets-exclude'], $ip)) { | 
					
						
							|  |  |  |         echo 'x'; | 
					
						
							|  |  |  |         continue; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  |     if (!match_network($config['nets'], $ip)) { | 
					
						
							|  |  |  |         echo 'i'; | 
					
						
							|  |  |  |         log_event("Ignored $ip", $deviceid, 'interface', $if); | 
					
						
							|  |  |  |         continue; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  |     // Attempt discovery of each IP only once per run.
 | 
					
						
							| 
									
										
										
										
											2015-07-20 14:02:16 +10:00
										 |  |  |     if (object_is_cached('arp_discovery', $ip)) { | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  |         echo '.'; | 
					
						
							|  |  |  |         continue; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-20 14:02:16 +10:00
										 |  |  |     object_add_cache('arp_discovery', $ip); | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  |     $name = gethostbyaddr($ip); | 
					
						
							|  |  |  |     echo '+'; | 
					
						
							|  |  |  |     $names[]    = $name; | 
					
						
							|  |  |  |     $ips[$name] = $ip; | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | echo "\n"; | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Run device discovery on each of the devices we've detected so far.
 | 
					
						
							|  |  |  | foreach ($names as $name) { | 
					
						
							| 
									
										
										
										
											2015-07-13 20:10:26 +02:00
										 |  |  |     $remote_device_id = discover_new_device($name, $device, 'ARP'); | 
					
						
							| 
									
										
										
										
											2013-10-28 15:55:57 +10:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | unset($names); | 
					
						
							|  |  |  | unset($ips); |