diff --git a/src/sysinfo.js b/src/sysinfo.js index 0d78d53f6..a77a45db1 100644 --- a/src/sysinfo.js +++ b/src/sysinfo.js @@ -11,6 +11,7 @@ var assert = require('assert'), config = require('./config.js'), ec2 = require('./sysinfo/ec2.js'), generic = require('./sysinfo/generic.js'), + scaleway = require('./sysinfo/scaleway.js'), util = require('util'); var gCachedIp = null; @@ -44,6 +45,7 @@ function getApi(callback) { case 'caas': return callback(null, caas); case 'digitalocean': return callback(null, caas); case 'ec2': return callback(null, ec2); + case 'scaleway': return callback(null, scaleway); case 'generic': return callback(null, generic); default: return callback(new Error('Unknown provider ' + config.provider())); } diff --git a/src/sysinfo/scaleway.js b/src/sysinfo/scaleway.js new file mode 100644 index 000000000..09b89f097 --- /dev/null +++ b/src/sysinfo/scaleway.js @@ -0,0 +1,23 @@ +'use strict'; + +exports = module.exports = { + getIp: getIp +}; + +var assert = require('assert'), + superagent = require('superagent'); + +function getIp(callback) { + assert.strictEqual(typeof callback, 'function'); + + superagent.get('http://169.254.42.42/conf').timeout(30 * 1000).end(function (error, result) { + if (error) return callback(new SysInfoError(SysInfoError.INTERNAL_ERROR, error.status ? 'Request failed: ' + error.status : 'Network failure')); + if (result.statusCode !== 200) return callback(new SysInfoError(SysInfoError.EXTERNAL_ERROR, util.format('%s %j', result.status, result.body))); + + var kv = result.text.split('\n').filter(function (line) { return line.startsWith('PUBLIC_IP_ADDRESS='); }); + if (kv.length !== 1) return callback(new SysInfoError(SysInfoError.EXTERNAL_ERROR, util.format('%s %j', result.status, result.body))); + + callback(null, kv[0].split('=')[1]); + }); +} +