diff --git a/src/addons.js b/src/addons.js index 0ebb31857..6662833cf 100644 --- a/src/addons.js +++ b/src/addons.js @@ -194,7 +194,11 @@ function getEnvironment(app, callback) { assert.strictEqual(typeof app, 'object'); assert.strictEqual(typeof callback, 'function'); - appdb.getAddonConfigByAppId(app.id, callback); + appdb.getAddonConfigByAppId(app.id, function (error, result) { + if (error) return callback(error); + + return callback(null, result.map(function (e) { return e.name + '=' + e.value; })); + }); } function getBindsSync(app, addons) { @@ -254,9 +258,9 @@ function setupOauth(app, options, callback) { if (error) return callback(error); var env = [ - 'OAUTH_CLIENT_ID=' + result.id, - 'OAUTH_CLIENT_SECRET=' + result.clientSecret, - 'OAUTH_ORIGIN=' + config.adminOrigin() + { name: 'OAUTH_CLIENT_ID', value: result.id }, + { name: 'OAUTH_CLIENT_SECRET', value: result.clientSecret }, + { name: 'OAUTH_ORIGIN', value: config.adminOrigin() } ]; debugApp(app, 'Setting oauth addon config to %j', env); @@ -287,13 +291,13 @@ function setupEmail(app, options, callback) { // note that "external" access info can be derived from MAIL_DOMAIN (since it's part of user documentation) var env = [ - 'MAIL_SMTP_SERVER=mail', - 'MAIL_SMTP_PORT=2525', - 'MAIL_IMAP_SERVER=mail', - 'MAIL_IMAP_PORT=9993', - 'MAIL_SIEVE_SERVER=mail', - 'MAIL_SIEVE_PORT=4190', - 'MAIL_DOMAIN=' + config.fqdn() + { name: 'MAIL_SMTP_SERVER', value: 'mail' }, + { name: 'MAIL_SMTP_PORT', value: '2525' }, + { name: 'MAIL_IMAP_SERVER', value: 'mail' }, + { name: 'MAIL_IMAP_PORT', value: '9993' }, + { name: 'MAIL_SIEVE_SERVER', value: 'mail' }, + { name: 'MAIL_SIEVE_PORT', value: '4190' }, + { name: 'MAIL_DOMAIN', value: config.fqdn() } ]; debugApp(app, 'Setting up Email'); @@ -319,13 +323,13 @@ function setupLdap(app, options, callback) { if (!app.sso) return callback(null); var env = [ - 'LDAP_SERVER=172.18.0.1', - 'LDAP_PORT=' + config.get('ldapPort'), - 'LDAP_URL=ldap://172.18.0.1:' + config.get('ldapPort'), - 'LDAP_USERS_BASE_DN=ou=users,dc=cloudron', - 'LDAP_GROUPS_BASE_DN=ou=groups,dc=cloudron', - 'LDAP_BIND_DN=cn='+ app.id + ',ou=apps,dc=cloudron', - 'LDAP_BIND_PASSWORD=' + hat(4 * 128) // this is ignored + { name: 'LDAP_SERVER', value: '172.18.0.1' }, + { name: 'LDAP_PORT', value: '' + config.get('ldapPort') }, + { name: 'LDAP_URL', value: 'ldap://172.18.0.1:' + config.get('ldapPort') }, + { name: 'LDAP_USERS_BASE_DN', value: 'ou=users,dc=cloudron' }, + { name: 'LDAP_GROUPS_BASE_DN', value: 'ou=groups,dc=cloudron' }, + { name: 'LDAP_BIND_DN', value: 'cn='+ app.id + ',ou=apps,dc=cloudron' }, + { name: 'LDAP_BIND_PASSWORD', value: hat(4 * 128) } // this is ignored ]; debugApp(app, 'Setting up LDAP'); @@ -356,12 +360,12 @@ function setupSendMail(app, options, callback) { var mailbox = results.filter(function (r) { return !r.aliasTarget; })[0]; var env = [ - "MAIL_SMTP_SERVER=mail", - "MAIL_SMTP_PORT=2525", - "MAIL_SMTP_USERNAME=" + mailbox.name, - "MAIL_SMTP_PASSWORD=" + app.id, - "MAIL_FROM=" + mailbox.name + '@' + config.fqdn(), - "MAIL_DOMAIN=" + config.fqdn() + { name: 'MAIL_SMTP_SERVER', value: 'mail' }, + { name: 'MAIL_SMTP_PORT', value: '2525' }, + { name: 'MAIL_SMTP_USERNAME', value: mailbox.name }, + { name: 'MAIL_SMTP_PASSWORD', value: app.id }, + { name: 'MAIL_FROM', value: mailbox.name + '@' + config.fqdn() }, + { name: 'MAIL_DOMAIN', value: config.fqdn() } ]; debugApp(app, 'Setting sendmail addon config to %j', env); appdb.setAddonConfig(app.id, 'sendmail', env, callback); @@ -391,12 +395,12 @@ function setupRecvMail(app, options, callback) { var mailbox = results.filter(function (r) { return !r.aliasTarget; })[0]; var env = [ - "MAIL_IMAP_SERVER=mail", - "MAIL_IMAP_PORT=9993", - "MAIL_IMAP_USERNAME=" + mailbox.name, - "MAIL_IMAP_PASSWORD=" + app.id, - "MAIL_TO=" + mailbox.name + '@' + config.fqdn(), - "MAIL_DOMAIN=" + config.fqdn() + { name: 'MAIL_IMAP_SERVER', value: 'mail' }, + { name: 'MAIL_IMAP_PORT', value: '9993' }, + { name: 'MAIL_IMAP_USERNAME', value: mailbox.name }, + { name: 'MAIL_IMAP_PASSWORD', value: app.id }, + { name: 'MAIL_TO', value: mailbox.name + '@' + config.fqdn() }, + { name: 'MAIL_DOMAIN', value: config.fqdn() } ]; debugApp(app, 'Setting sendmail addon config to %j', env); @@ -426,7 +430,9 @@ function setupMySql(app, options, callback) { docker.execContainer('mysql', cmd, { bufferStdout: true }, function (error, stdout) { if (error) return callback(error); - var env = stdout.toString('utf8').split('\n').slice(0, -1); // remove trailing newline + var result = stdout.toString('utf8').split('\n').slice(0, -1); // remove trailing newline + var env = result.map(function (r) { var idx = r.indexOf('='); return { name: r.substr(0, idx), value: r.substr(idx + 1) }; }); + debugApp(app, 'Setting mysql addon config to %j', env); appdb.setAddonConfig(app.id, 'mysql', env, callback); }); @@ -489,7 +495,9 @@ function setupPostgreSql(app, options, callback) { docker.execContainer('postgresql', cmd, { bufferStdout: true }, function (error, stdout) { if (error) return callback(error); - var env = stdout.toString('utf8').split('\n').slice(0, -1); // remove trailing newline + var result = stdout.toString('utf8').split('\n').slice(0, -1); // remove trailing newline + var env = result.map(function (r) { var idx = r.indexOf('='); return { name: r.substr(0, idx), value: r.substr(idx + 1) }; }); + debugApp(app, 'Setting postgresql addon config to %j', env); appdb.setAddonConfig(app.id, 'postgresql', env, callback); }); @@ -553,7 +561,9 @@ function setupMongoDb(app, options, callback) { docker.execContainer('mongodb', cmd, { bufferStdout: true }, function (error, stdout) { if (error) return callback(error); - var env = stdout.toString('utf8').split('\n').slice(0, -1); // remove trailing newline + var result = stdout.toString('utf8').split('\n').slice(0, -1); // remove trailing newline + var env = result.map(function (r) { var idx = r.indexOf('='); return { name: r.substr(0, idx), value: r.substr(idx + 1) }; }); + debugApp(app, 'Setting mongodb addon config to %j', env); appdb.setAddonConfig(app.id, 'mongodb', env, callback); }); @@ -631,10 +641,10 @@ function setupRedis(app, options, callback) { --read-only -v /tmp -v /run ${tag}`; var env = [ - 'REDIS_URL=redis://redisuser:' + redisPassword + '@redis-' + app.id, - 'REDIS_PASSWORD=' + redisPassword, - 'REDIS_HOST=' + redisName, - 'REDIS_PORT=6379' + { name: 'REDIS_URL', value: 'redis://redisuser:' + redisPassword + '@redis-' + app.id }, + { name: 'REDIS_PASSWORD', value: redisPassword }, + { name: 'REDIS_HOST', value: redisName }, + { name: 'REDIS_PORT', value: '6379' } ]; async.series([ diff --git a/src/appdb.js b/src/appdb.js index 8f1b980f5..056b8e728 100644 --- a/src/appdb.js +++ b/src/appdb.js @@ -413,11 +413,11 @@ function setAddonConfig(appId, addonId, env, callback) { if (env.length === 0) return callback(null); - var query = 'INSERT INTO appAddonConfigs(appId, addonId, value) VALUES '; + var query = 'INSERT INTO appAddonConfigs(appId, addonId, name, value) VALUES '; var args = [ ], queryArgs = [ ]; for (var i = 0; i < env.length; i++) { - args.push(appId, addonId, env[i]); - queryArgs.push('(?, ?, ?)'); + args.push(appId, addonId, env[i].name, env[i].value); + queryArgs.push('(?, ?, ?, ?)'); } database.query(query + queryArgs.join(','), args, function (error) { @@ -456,13 +456,10 @@ function getAddonConfig(appId, addonId, callback) { assert.strictEqual(typeof addonId, 'string'); assert.strictEqual(typeof callback, 'function'); - database.query('SELECT value FROM appAddonConfigs WHERE appId = ? AND addonId = ?', [ appId, addonId ], function (error, results) { + database.query('SELECT name, value FROM appAddonConfigs WHERE appId = ? AND addonId = ?', [ appId, addonId ], function (error, results) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); - var config = [ ]; - results.forEach(function (v) { config.push(v.value); }); - - callback(null, config); + callback(null, results); }); } @@ -470,13 +467,9 @@ function getAddonConfigByAppId(appId, callback) { assert.strictEqual(typeof appId, 'string'); assert.strictEqual(typeof callback, 'function'); - database.query('SELECT value FROM appAddonConfigs WHERE appId = ?', [ appId ], function (error, results) { + database.query('SELECT name, value FROM appAddonConfigs WHERE appId = ?', [ appId ], function (error, results) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); - var config = [ ]; - results.forEach(function (v) { config.push(v.value); }); - - callback(null, config); + callback(null, results); }); } - diff --git a/src/infra_version.js b/src/infra_version.js index fbb034db4..7e4da8fc2 100644 --- a/src/infra_version.js +++ b/src/infra_version.js @@ -6,7 +6,7 @@ exports = module.exports = { // a version bump means that all app containers are recreated - 'version': 46, + 'version': 47, 'baseImages': [ 'cloudron/base:0.10.0' ], diff --git a/src/test/database-test.js b/src/test/database-test.js index 02ed2b8f0..a92b90add 100644 --- a/src/test/database-test.js +++ b/src/test/database-test.js @@ -789,14 +789,14 @@ describe('database', function () { }); it('setAddonConfig succeeds', function (done) { - appdb.setAddonConfig(APP_1.id, 'addonid1', [ 'ENV1=env', 'ENV2=env' ], function (error) { + appdb.setAddonConfig(APP_1.id, 'addonid1', [ { name: 'ENV1', value: 'env' }, { name: 'ENV2', value: 'env' } ], function (error) { expect(error).to.be(null); done(); }); }); it('setAddonConfig succeeds', function (done) { - appdb.setAddonConfig(APP_1.id, 'addonid2', [ 'ENV3=env' ], function (error) { + appdb.setAddonConfig(APP_1.id, 'addonid2', [ { name: 'ENV3', value: 'env' } ], function (error) { expect(error).to.be(null); done(); }); @@ -805,7 +805,7 @@ describe('database', function () { it('getAddonConfig succeeds', function (done) { appdb.getAddonConfig(APP_1.id, 'addonid1', function (error, results) { expect(error).to.be(null); - expect(results).to.eql([ 'ENV1=env', 'ENV2=env' ]); + expect(results).to.eql([ { name: 'ENV1', value: 'env' }, { name: 'ENV2', value: 'env' } ]); done(); }); }); @@ -813,7 +813,7 @@ describe('database', function () { it('getAddonConfigByAppId succeeds', function (done) { appdb.getAddonConfigByAppId(APP_1.id, function (error, results) { expect(error).to.be(null); - expect(results).to.eql([ 'ENV1=env', 'ENV2=env', 'ENV3=env' ]); + expect(results).to.eql([ { name: 'ENV1', value: 'env' }, { name: 'ENV2', value: 'env' }, { name: 'ENV3', value: 'env' } ]); done(); }); }); @@ -828,7 +828,7 @@ describe('database', function () { it('unsetAddonConfig did remove configs', function (done) { appdb.getAddonConfigByAppId(APP_1.id, function (error, results) { expect(error).to.be(null); - expect(results).to.eql([ 'ENV3=env' ]); + expect(results).to.eql([ { name: 'ENV3', value: 'env' }]); done(); }); });