diff --git a/src/sysinfo.js b/src/sysinfo.js index 47a384d5d..0d78d53f6 100644 --- a/src/sysinfo.js +++ b/src/sysinfo.js @@ -10,7 +10,7 @@ var assert = require('assert'), caas = require('./sysinfo/caas.js'), config = require('./config.js'), ec2 = require('./sysinfo/ec2.js'), - eth0 = require('./sysinfo/eth0.js'), + generic = require('./sysinfo/generic.js'), util = require('util'); var gCachedIp = null; @@ -44,7 +44,7 @@ function getApi(callback) { case 'caas': return callback(null, caas); case 'digitalocean': return callback(null, caas); case 'ec2': return callback(null, ec2); - case 'generic': return callback(null, eth0); + case 'generic': return callback(null, generic); default: return callback(new Error('Unknown provider ' + config.provider())); } } diff --git a/src/sysinfo/eth0.js b/src/sysinfo/eth0.js deleted file mode 100644 index cb44d0f87..000000000 --- a/src/sysinfo/eth0.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -exports = module.exports = { - getIp: getIp -}; - -var assert = require('assert'), - os = require('os'), - SysInfoError = require('../sysinfo.js').SysInfoError; - -function getIp(callback) { - assert.strictEqual(typeof callback, 'function'); - - try { - var ip = os.networkInterfaces().eth0[0].address; - return callback(null, ip); - } catch (e) { - return callback(new SysInfoError(SysInfoError.INTERNAL_ERROR, e)); - } -} - diff --git a/src/sysinfo/generic.js b/src/sysinfo/generic.js new file mode 100644 index 000000000..f7cec833c --- /dev/null +++ b/src/sysinfo/generic.js @@ -0,0 +1,30 @@ +'use strict'; + +exports = module.exports = { + getIp: getIp +}; + +var assert = require('assert'), + os = require('os'), + SysInfoError = require('../sysinfo.js').SysInfoError; + +function getIp(callback) { + assert.strictEqual(typeof callback, 'function'); + + try { + var interfaces = os.networkInterfaces(); + // https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ + for (var ifname in interfaces) { + if (!ifname.match(/^(en|eth)/)) continue; + + for (var obj of interfaces[ifname]) { // array + if (obj.family === 'IPv4') return callback(null, obj.address); + } + } + + return callback(new SysInfoError(SysInfoError.INTERNAL_ERROR, new Error('Could not find interface'))); + } catch (e) { + return callback(new SysInfoError(SysInfoError.INTERNAL_ERROR, e)); + } +} +