diff --git a/src/appstore.js b/src/appstore.js index 9b222ba05..bb9d55132 100644 --- a/src/appstore.js +++ b/src/appstore.js @@ -2,12 +2,16 @@ exports = module.exports = { purchase: purchase, - unpurchase: unpurchase + unpurchase: unpurchase, + + sendAliveStatus: sendAliveStatus }; var AppsError = require('./apps.js').AppsError, assert = require('assert'), + CloudronError = require('./cloudron.js').CloudronError, config = require('./config.js'), + debug = require('debug')('box:appstore'), settings = require('./settings.js'), superagent = require('superagent'), util = require('util'); @@ -104,3 +108,44 @@ function unpurchase(appId, appstoreId, callback) { }); } } + +function sendAliveStatus(data, callback) { + + function sendAliveStatusWithAppstoreConfig(data, appstoreConfig) { + assert.strictEqual(typeof data, 'object'); + assert.strictEqual(typeof appstoreConfig.userId, 'string'); + assert.strictEqual(typeof appstoreConfig.cloudronId, 'string'); + assert.strictEqual(typeof appstoreConfig.token, 'string'); + + var url = config.apiServerOrigin() + '/api/v1/users/' + appstoreConfig.userId + '/cloudrons/' + appstoreConfig.cloudronId + '/alive'; + superagent.post(url).send(data).query({ accessToken: appstoreConfig.token }).timeout(30 * 1000).end(function (error, result) { + if (error && !error.response) return callback(new CloudronError(CloudronError.EXTERNAL_ERROR, error)); + if (result.statusCode === 404) return callback(new CloudronError(CloudronError.NOT_FOUND)); + if (result.statusCode !== 201) return callback(new CloudronError(CloudronError.EXTERNAL_ERROR, util.format('Sending alive status failed. %s %j', result.status, result.body))); + + callback(null); + }); + } + + // Caas Cloudrons do not store appstore credentials in their local database + if (config.provider() === 'caas') { + var url = config.apiServerOrigin() + '/api/v1/exchangeBoxTokenWithUserToken'; + superagent.post(url).query({ token: config.token() }).timeout(30 * 1000).end(function (error, result) { + if (error && !error.response) return callback(new CloudronError(CloudronError.EXTERNAL_ERROR, error)); + if (result.statusCode !== 201) return callback(new CloudronError(CloudronError.EXTERNAL_ERROR, util.format('Token exchange failed. %s %j', result.status, result.body))); + + sendAliveStatusWithAppstoreConfig(data, result.body); + }); + } else { + settings.getAppstoreConfig(function (error, result) { + if (error) return callback(new CloudronError(CloudronError.INTERNAL_ERROR, error)); + + if (!result.token) { + debug('sendAliveStatus: Cloudron not yet registered'); + return callback(null); + } + + sendAliveStatusWithAppstoreConfig(data, result); + }); + } +} diff --git a/src/cloudron.js b/src/cloudron.js index 585893acf..38d51ae58 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -32,6 +32,7 @@ exports = module.exports = { }; var apps = require('./apps.js'), + appstore = require('./appstore.js'), assert = require('assert'), async = require('async'), backups = require('./backups.js'), @@ -484,33 +485,6 @@ function sendAliveStatus(callback) { }; } - function sendAliveStatusWithAppstoreConfig(backendSettings, appstoreConfig) { - assert.strictEqual(typeof backendSettings, 'object'); - assert.strictEqual(typeof appstoreConfig.userId, 'string'); - assert.strictEqual(typeof appstoreConfig.cloudronId, 'string'); - assert.strictEqual(typeof appstoreConfig.token, 'string'); - - var url = config.apiServerOrigin() + '/api/v1/users/' + appstoreConfig.userId + '/cloudrons/' + appstoreConfig.cloudronId + '/alive'; - var data = { - domain: config.fqdn(), - version: config.version(), - provider: config.provider(), - backendSettings: backendSettings, - machine: { - cpus: os.cpus(), - totalmem: os.totalmem() - } - }; - - superagent.post(url).send(data).query({ accessToken: appstoreConfig.token }).timeout(30 * 1000).end(function (error, result) { - if (error && !error.response) return callback(new CloudronError(CloudronError.EXTERNAL_ERROR, error)); - if (result.statusCode === 404) return callback(new CloudronError(CloudronError.NOT_FOUND)); - if (result.statusCode !== 201) return callback(new CloudronError(CloudronError.EXTERNAL_ERROR, util.format('Sending alive status failed. %s %j', result.status, result.body))); - - callback(null); - }); - } - settings.getAll(function (error, result) { if (error) return callback(new CloudronError(CloudronError.INTERNAL_ERROR, error)); @@ -532,27 +506,18 @@ function sendAliveStatus(callback) { timeZone: result[settings.TIME_ZONE_KEY] }; - // Caas Cloudrons do not store appstore credentials in their local database - if (config.provider() === 'caas') { - var url = config.apiServerOrigin() + '/api/v1/exchangeBoxTokenWithUserToken'; - superagent.post(url).query({ token: config.token() }).timeout(30 * 1000).end(function (error, result) { - if (error && !error.response) return callback(new CloudronError(CloudronError.EXTERNAL_ERROR, error)); - if (result.statusCode !== 201) return callback(new CloudronError(CloudronError.EXTERNAL_ERROR, util.format('Token exchange failed. %s %j', result.status, result.body))); + var data = { + domain: config.fqdn(), + version: config.version(), + provider: config.provider(), + backendSettings: backendSettings, + machine: { + cpus: os.cpus(), + totalmem: os.totalmem() + } + }; - sendAliveStatusWithAppstoreConfig(backendSettings, result.body); - }); - } else { - settings.getAppstoreConfig(function (error, result) { - if (error) return callback(new CloudronError(CloudronError.INTERNAL_ERROR, error)); - - if (!result.token) { - debug('sendAliveStatus: Cloudron not yet registered'); - return callback(null); - } - - sendAliveStatusWithAppstoreConfig(backendSettings, result); - }); - } + appstore.sendAliveStatus(data, callback); }); }