diff --git a/html/includes/dev-overview-data.inc.php b/html/includes/dev-overview-data.inc.php
index 6ff78d43c4..2e7ed141ea 100644
--- a/html/includes/dev-overview-data.inc.php
+++ b/html/includes/dev-overview-data.inc.php
@@ -30,6 +30,13 @@ echo '
'.$device['sysName'].' |
';
+if ($ip = inet6_ntop($device['ip'])) {
+ echo '
+ Resolved IP |
+ '.$ip.' |
+
';
+}
+
if ($device['hardware']) {
echo '
Hardware |
diff --git a/includes/common.php b/includes/common.php
index f80583a83f..e24e83b86e 100644
--- a/includes/common.php
+++ b/includes/common.php
@@ -1040,3 +1040,17 @@ function version_info($remote=true) {
return $output;
}//end version_info()
+
+/**
+* Convert a MySQL binary v4 (4-byte) or v6 (16-byte) IP address to a printable string.
+* @param string $ip A binary string containing an IP address, as returned from MySQL's INET6_ATON function
+* @return string Empty if not valid.
+*/
+// Fuction is from http://uk3.php.net/manual/en/function.inet-ntop.php
+function inet6_ntop($ip) {
+ $l = strlen($ip);
+ if ($l == 4 or $l == 16) {
+ return inet_ntop(pack('A' . $l, $ip));
+ }
+ return '';
+}
diff --git a/includes/functions.php b/includes/functions.php
index c9d842b9a3..63fd646b72 100644
--- a/includes/functions.php
+++ b/includes/functions.php
@@ -1320,3 +1320,28 @@ function oxidized_reload_nodes() {
curl_close($ch);
}
}
+
+/**
+ * Perform DNS lookup
+ *
+ * @param array $device Device array from database
+ * @param string $type The type of record to lookup
+ *
+ * @return string ip
+ *
+**/
+function dnslookup($device,$type=false) {
+ if (empty($type)) {
+ // We are going to use the transport to work out the record type
+ if ($device['transport'] == 'udp6' || $device['transport'] == 'tcp6') {
+ $type = DNS_AAAA;
+ $return = 'ipv6';
+ }
+ else {
+ $type = DNS_A;
+ $return = 'ip';
+ }
+ }
+ $record = dns_get_record($device['hostname'],$type);
+ return $record[0][$return];
+}//end dnslookup
diff --git a/includes/polling/functions.inc.php b/includes/polling/functions.inc.php
index 266c3d4a2e..e6435a3906 100644
--- a/includes/polling/functions.inc.php
+++ b/includes/polling/functions.inc.php
@@ -138,6 +138,14 @@ function poll_device($device, $options) {
$device_start = microtime(true);
// Start counting device poll time
echo $device['hostname'].' '.$device['device_id'].' '.$device['os'].' ';
+ $ip = dnslookup($device);
+
+ if (!empty($ip) && $ip != inet6_ntop($device['ip'])) {
+ log_event('Device IP changed to '.$ip, $device, 'system');
+ $db_ip = inet_pton($ip);
+ dbUpdate(array('ip' => $db_ip), 'devices', 'device_id=?', array($device['device_id']));
+ }
+
if ($config['os'][$device['os']]['group']) {
$device['os_group'] = $config['os'][$device['os']]['group'];
echo '('.$device['os_group'].')';
diff --git a/sql-schema/091.sql b/sql-schema/091.sql
new file mode 100644
index 0000000000..5400018f1c
--- /dev/null
+++ b/sql-schema/091.sql
@@ -0,0 +1 @@
+ALTER TABLE `devices` ADD `ip` VARBINARY( 16 ) NOT NULL AFTER `sysName` ;