diff --git a/migrations/20190725172940-settings-migrate-cloudron-conf.js b/migrations/20190725172940-settings-migrate-cloudron-conf.js index 1d9a5bda5..6ba2b22d9 100644 --- a/migrations/20190725172940-settings-migrate-cloudron-conf.js +++ b/migrations/20190725172940-settings-migrate-cloudron-conf.js @@ -18,7 +18,6 @@ exports.up = function(db, callback) { db.runSql.bind(db, 'INSERT settings (name, value) VALUES(?, ?)', [ 'web_server_origin', config.webServerOrigin ]), db.runSql.bind(db, 'INSERT settings (name, value) VALUES(?, ?)', [ 'admin_domain', config.adminDomain ]), db.runSql.bind(db, 'INSERT settings (name, value) VALUES(?, ?)', [ 'admin_fqdn', config.adminFqdn ]), - db.runSql.bind(db, 'INSERT settings (name, value) VALUES(?, ?)', [ 'provider', config.provider ]), db.runSql.bind(db, 'INSERT settings (name, value) VALUES(?, ?)', [ 'demo', config.isDemo ]), db.runSql.bind(db, 'COMMIT') ], callback); diff --git a/scripts/cloudron-setup b/scripts/cloudron-setup index e14c6c37a..d415b4359 100755 --- a/scripts/cloudron-setup +++ b/scripts/cloudron-setup @@ -202,10 +202,10 @@ mkdir -p /etc/cloudron cat > "/etc/cloudron/cloudron.conf" < /etc/cloudron/provider [[ -n "${license}" ]] && echo -n "$license" > /etc/cloudron/LICENSE diff --git a/src/appstore.js b/src/appstore.js index a39311f91..5511926f8 100644 --- a/src/appstore.js +++ b/src/appstore.js @@ -40,6 +40,7 @@ var apps = require('./apps.js'), semver = require('semver'), settings = require('./settings.js'), superagent = require('superagent'), + sysinfo = require('./sysinfo.js'), users = require('./users.js'), util = require('util'); @@ -282,7 +283,7 @@ function sendAliveStatus(callback) { var data = { version: constants.VERSION, adminFqdn: config.adminFqdn(), - provider: config.provider(), + provider: sysinfo.provider(), backendSettings: backendSettings, machine: { cpus: os.cpus(), diff --git a/src/cloudron.js b/src/cloudron.js index 5774219bd..af3e94373 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -51,6 +51,7 @@ var apps = require('./apps.js'), shell = require('./shell.js'), spawn = require('child_process').spawn, split = require('split'), + sysinfo = require('./sysinfo.js'), tasks = require('./tasks.js'), users = require('./users.js'), util = require('util'); @@ -172,7 +173,7 @@ function getConfig(callback) { version: constants.VERSION, isDemo: config.isDemo(), memory: os.totalmem(), - provider: config.provider(), + provider: sysinfo.provider(), cloudronName: allSettings[settings.CLOUDRON_NAME_KEY], uiSpec: custom.uiSpec() }); diff --git a/src/config.js b/src/config.js index e380aeba9..463dec892 100644 --- a/src/config.js +++ b/src/config.js @@ -12,7 +12,6 @@ exports = module.exports = { TEST: process.env.BOX_ENV === 'test', // convenience getters - provider: provider, apiServerOrigin: apiServerOrigin, webServerOrigin: webServerOrigin, adminDomain: adminDomain, @@ -59,7 +58,6 @@ function saveSync() { webServerOrigin: data.webServerOrigin, adminDomain: data.adminDomain, adminFqdn: data.adminFqdn, - provider: data.provider, isDemo: data.isDemo }; @@ -80,7 +78,6 @@ function initConfig() { data.adminDomain = ''; data.apiServerOrigin = null; data.webServerOrigin = null; - data.provider = 'generic'; // overrides for local testings if (exports.TEST) { @@ -151,6 +148,3 @@ function isDemo() { return get('isDemo') === true; } -function provider() { - return get('provider'); -} diff --git a/src/paths.js b/src/paths.js index 37273f41a..de5956829 100644 --- a/src/paths.js +++ b/src/paths.js @@ -9,6 +9,7 @@ exports = module.exports = { INFRA_VERSION_FILE: path.join(config.baseDir(), 'platformdata/INFRA_VERSION'), LICENSE_FILE: '/etc/cloudron/LICENSE', + PROVIDER_FILE: '/etc/cloudron/PROVIDER', PLATFORM_DATA_DIR: path.join(config.baseDir(), 'platformdata'), APPS_DATA_DIR: path.join(config.baseDir(), 'appsdata'), diff --git a/src/provision.js b/src/provision.js index 187fe7c4a..8fa6bdf39 100644 --- a/src/provision.js +++ b/src/provision.js @@ -32,6 +32,7 @@ var appstore = require('./appstore.js'), semver = require('semver'), settings = require('./settings.js'), superagent = require('superagent'), + sysinfo = require('./sysinfo.js'), users = require('./users.js'), UsersError = users.UsersError, tld = require('tldjs'), @@ -308,7 +309,7 @@ function getStatus(callback) { callback(null, _.extend({ version: constants.VERSION, apiServerOrigin: config.apiServerOrigin(), // used by CaaS tool - provider: config.provider(), + provider: sysinfo.provider(), cloudronName: cloudronName, adminFqdn: config.adminDomain() ? config.adminFqdn() : null, activated: activated, diff --git a/src/routes/provision.js b/src/routes/provision.js index 71b4365b9..0865eaad8 100644 --- a/src/routes/provision.js +++ b/src/routes/provision.js @@ -10,18 +10,18 @@ exports = module.exports = { var assert = require('assert'), auditSource = require('../auditsource'), - config = require('../config.js'), debug = require('debug')('box:routes/setup'), HttpError = require('connect-lastmile').HttpError, HttpSuccess = require('connect-lastmile').HttpSuccess, provision = require('../provision.js'), ProvisionError = require('../provision.js').ProvisionError, + sysinfo = require('../sysinfo.js'), superagent = require('superagent'); function providerTokenAuth(req, res, next) { assert.strictEqual(typeof req.body, 'object'); - if (config.provider() === 'ami') { + if (sysinfo.provider() === 'ami') { if (typeof req.body.providerToken !== 'string' || !req.body.providerToken) return next(new HttpError(400, 'providerToken must be a non empty string')); superagent.get('http://169.254.169.254/latest/meta-data/instance-id').timeout(30 * 1000).end(function (error, result) { diff --git a/src/routes/settings.js b/src/routes/settings.js index 97c2357da..3c561fbf5 100644 --- a/src/routes/settings.js +++ b/src/routes/settings.js @@ -128,15 +128,15 @@ function getCloudronAvatar(req, res, next) { } function getBackupConfig(req, res, next) { - settings.getBackupConfig(function (error, config) { + settings.getBackupConfig(function (error, backupConfig) { if (error) return next(new HttpError(500, error)); // always send provider as it is used by the UI to figure if backups are disabled ('noop' backend) if (!custom.spec().backups.configurable) { - return next(new HttpSuccess(200, { provider: config.provider })); + return next(new HttpSuccess(200, { provider: backupConfig.provider })); } - next(new HttpSuccess(200, backups.removePrivateFields(config))); + next(new HttpSuccess(200, backups.removePrivateFields(backupConfig))); }); } diff --git a/src/support.js b/src/support.js index dc2494a18..87f090a63 100644 --- a/src/support.js +++ b/src/support.js @@ -12,11 +12,12 @@ let assert = require('assert'), shell = require('./shell.js'), once = require('once'), path = require('path'), + sysinfo = require('./sysinfo.js'), util = require('util'); // the logic here is also used in the cloudron-support tool -var AUTHORIZED_KEYS_FILEPATH = config.TEST ? path.join(config.baseDir(), 'authorized_keys') : ((config.provider() === 'ec2' || config.provider() === 'lightsail' || config.provider() === 'ami') ? '/home/ubuntu/.ssh/authorized_keys' : '/root/.ssh/authorized_keys'), - AUTHORIZED_KEYS_USER = config.TEST ? process.getuid() : ((config.provider() === 'ec2' || config.provider() === 'lightsail' || config.provider() === 'ami') ? 'ubuntu' : 'root'), +var AUTHORIZED_KEYS_FILEPATH = config.TEST ? path.join(config.baseDir(), 'authorized_keys') : ((sysinfo.provider() === 'ec2' || sysinfo.provider() === 'lightsail' || sysinfo.provider() === 'ami') ? '/home/ubuntu/.ssh/authorized_keys' : '/root/.ssh/authorized_keys'), + AUTHORIZED_KEYS_USER = config.TEST ? process.getuid() : ((sysinfo.provider() === 'ec2' || sysinfo.provider() === 'lightsail' || sysinfo.provider() === 'ami') ? 'ubuntu' : 'root'), AUTHORIZED_KEYS_CMD = path.join(__dirname, 'scripts/remotesupport.sh'); function SupportError(reason, errorOrMessage) { diff --git a/src/sysinfo.js b/src/sysinfo.js index 9942d2368..d18772211 100644 --- a/src/sysinfo.js +++ b/src/sysinfo.js @@ -5,7 +5,8 @@ exports = module.exports = { getPublicIp: getPublicIp, - hasIPv6: hasIPv6 + hasIPv6: hasIPv6, + provider: provider }; var assert = require('assert'), @@ -13,7 +14,9 @@ var assert = require('assert'), ec2 = require('./sysinfo/ec2.js'), fs = require('fs'), generic = require('./sysinfo/generic.js'), + paths = require('./paths.js'), scaleway = require('./sysinfo/scaleway.js'), + safe = require('safetydance'), util = require('util'); function SysInfoError(reason, errorOrMessage) { @@ -38,10 +41,22 @@ util.inherits(SysInfoError, Error); SysInfoError.INTERNAL_ERROR = 'Internal Error'; SysInfoError.EXTERNAL_ERROR = 'External Error'; +let gProvider = null; + + +function provider() { + if (gProvider) return gProvider; + + gProvider = safe.fs.readFileSync(paths.PROVIDER_FILE, 'utf8'); + if (!gProvider) return gProvider = 'generic'; + + return gProvider; +} + function getApi(callback) { assert.strictEqual(typeof callback, 'function'); - switch (config.provider()) { + switch (provider()) { case 'ec2': return callback(null, ec2); case 'lightsail': return callback(null, ec2); case 'ami': return callback(null, ec2);