diff --git a/.gitignore b/.gitignore index 73c0553298..e0e27e27dc 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,7 @@ bin # Resources resources/cache resources/base-images.tar.gz -resources/virtualbox-4.3.12.pkg +resources/virtualbox-*.pkg resources/boot2docker resources/node-webkit resources/mongod diff --git a/index.js b/index.js index dcfbb580d1..923ab6f841 100644 --- a/index.js +++ b/index.js @@ -70,6 +70,7 @@ var start = function (callback) { user_env.BIND_IP = '127.0.0.1'; user_env.DB_PATH = dataPath; user_env.MONGO_URL = 'mongodb://localhost:' + mongoPort + '/meteor'; + user_env.METEOR_SETTINGS = fs.readFileSync(path.join(process.cwd(), 'resources', 'settings.json'), 'utf8'); var nodeChild = child_process.spawn(path.join(process.cwd(), 'resources', 'node'), ['./bundle/main.js'], { env: user_env }); @@ -124,4 +125,4 @@ app.on('ready', function() { mainWindow.loadUrl(url); mainWindow.show(); }); -}); \ No newline at end of file +}); diff --git a/meteor/.meteor/packages b/meteor/.meteor/packages index bd8c7b3e8f..ef35f4dc26 100755 --- a/meteor/.meteor/packages +++ b/meteor/.meteor/packages @@ -11,4 +11,3 @@ underscore-string-latest collection-helpers iron:router reywood:iron-router-ga - diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index 03ff2b4bf1..12845487fc 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -47,6 +47,48 @@ AppUtil.restartHelper = function (app) { } }; +AppUtil.start = function (appId) { + var app = Apps.findOne(appId); + if (app && app.docker) { + Apps.update(app._id, {$set: { + status: 'STARTING' + }}); + Docker.startContainer(app.docker.Id, function (err) { + if (err) { console.error(err); } + Docker.getContainerData(app.docker.Id, function (err, data) { + if (err) { console.error(err); } + // Use dig to refresh the DNS + exec('/usr/bin/dig ' + app.name + '.kite @172.17.42.1', function(err, stdout, stderr) { + console.log(err); + console.log(stdout); + console.log(stderr); + Apps.update(app._id, {$set: { + status: 'READY', + docker: data + }}); + }); + }); + }); + } +}; + +AppUtil.stop = function (appId) { + var app = Apps.findOne(appId); + if (app && app.docker) { + Apps.update(app._id, {$set: { + status: 'STOPPING' + }}); + Docker.stopContainer(app.docker.Id, function (err) { + if (err) { console.error(err); } + Meteor.setTimeout(function () { + Apps.update(app._id, {$set: { + status: 'STOPPED' + }}); + }, 2500); + }); + } +}; + AppUtil.restart = function (appId) { var app = Apps.findOne(appId); if (app && app.docker) { @@ -92,7 +134,6 @@ AppUtil.logs = function (appId) { logs: [] } }); - var logs = []; response.setEncoding('utf8'); response.on('data', function (line) { Apps.update(app._id, { @@ -115,7 +156,7 @@ AppUtil.recover = function () { } var container = Docker.client().getContainer(app.docker.Id); container.inspect(function (err, data) { - if (app.status !== 'STARTING' && data && data.State && !data.State.Running) { + if (app.status !== 'STARTING' && app.status !== 'STOPPING' && app.status !== 'STOPPED' && data && data.State && !data.State.Running) { console.log('Restarting: ' + app.name); console.log(app.docker.Id); AppUtil.restartHelper(app, function (err) { diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index 2f592ba865..e959079d08 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -81,6 +81,32 @@ Docker.runContainer = function (app, image, callback) { }); }; +Docker.startContainer = function (containerId, callback) { + var container = docker.getContainer(containerId); + container.start(function (err) { + if (err) { + console.log(err); + callback(err); + return; + } + console.log('Started container: ' + containerId); + callback(null); + }); +}; + +Docker.stopContainer = function (containerId, callback) { + var container = docker.getContainer(containerId); + container.stop(function (err) { + if (err) { + console.log(err); + callback(err); + return; + } + console.log('Stopped container: ' + containerId); + callback(null); + }); +}; + Docker.restartContainer = function (containerId, callback) { var container = docker.getContainer(containerId); container.restart(function (err) { @@ -241,13 +267,13 @@ Docker.reloadDefaultContainers = function (callback) { async.until(function () { return ready; }, function (callback) { - docker.listContainers(function (err, containers) { + docker.listContainers(function (err) { if (!err) { ready = true; } callback(); }); - }, function (err) { + }, function () { console.log('Removing old Kitematic default containers.'); Docker.killAndRemoveContainers(Docker.defaultContainerNames, function (err) { console.log('Removed old Kitematic default containers.'); diff --git a/meteor/client/lib/router.js b/meteor/client/lib/router.js index 6e8168efd6..ad5f20fb0f 100755 --- a/meteor/client/lib/router.js +++ b/meteor/client/lib/router.js @@ -1,6 +1,13 @@ Router.configure({ layoutTemplate: 'layout', - trackPageView: true + onBeforeAction: function () { + var install = Installs.findOne({}); + if (install && install.tracking) { + var currentPath = Router.current().path; + console.log(currentPath); + ga('send', 'pageview', currentPath); + } + } }); SetupController = RouteController.extend({ diff --git a/meteor/client/lib/util.js b/meteor/client/lib/util.js index 0b302da912..2d46b711ee 100755 --- a/meteor/client/lib/util.js +++ b/meteor/client/lib/util.js @@ -207,8 +207,11 @@ Util.compareVersions = function (v1, v2, options) { }; trackLink = function (trackLabel) { - if (trackLabel) { - console.log(trackLabel); - ga('send', 'event', 'link', 'click', trackLabel); + var install = Installs.findOne({}); + if (install && install.tracking) { + if (trackLabel) { + console.log(trackLabel); + ga('send', 'event', 'link', 'click', trackLabel); + } } }; diff --git a/meteor/client/views/dashboard/apps/dashboard-single-app.html b/meteor/client/views/dashboard/apps/dashboard-single-app.html index f1e3740ff8..baa2df2470 100755 --- a/meteor/client/views/dashboard/apps/dashboard-single-app.html +++ b/meteor/client/views/dashboard/apps/dashboard-single-app.html @@ -7,10 +7,14 @@ {{#if $eq status 'STARTING'}} {{else}} - {{#if $eq status 'ERROR'}} - + {{#if $eq status 'STOPPING'}} + {{else}} - + {{#if $eq status 'ERROR'}} + + {{else}} + + {{/if}} {{/if}} {{/if}} {{/if}} @@ -25,6 +29,12 @@ {{/if}} + {{#if $eq status 'READY'}} + + {{/if}} + {{#if $eq status 'STOPPED'}} + + {{/if}} diff --git a/meteor/client/views/dashboard/apps/dashboard-single-app.js b/meteor/client/views/dashboard/apps/dashboard-single-app.js index fa5b873000..d238813c3a 100755 --- a/meteor/client/views/dashboard/apps/dashboard-single-app.js +++ b/meteor/client/views/dashboard/apps/dashboard-single-app.js @@ -24,6 +24,14 @@ Template.dashboard_single_app.events({ var cmd = Boot2Docker.command() + ' ssh -t "sudo docker-enter ' + app.docker.Id + '"'; Util.openTerminal(cmd); }, + 'click .btn-start': function () { + AppUtil.start(this._id); + $('.btn-icon').tooltip('hide'); + }, + 'click .btn-stop': function () { + AppUtil.stop(this._id); + $('.btn-icon').tooltip('hide'); + }, 'click .btn-restart': function () { AppUtil.restart(this._id); }, diff --git a/meteor/client/views/dashboard/layouts/dashboard-apps-layout.html b/meteor/client/views/dashboard/layouts/dashboard-apps-layout.html index 7f35bc79e3..67465a1e9b 100755 --- a/meteor/client/views/dashboard/layouts/dashboard-apps-layout.html +++ b/meteor/client/views/dashboard/layouts/dashboard-apps-layout.html @@ -19,6 +19,12 @@ {{/if}} + {{#if $eq status 'READY'}} + + {{/if}} + {{#if $eq status 'STOPPED'}} + + {{/if}} diff --git a/meteor/client/views/dashboard/layouts/dashboard-apps-layout.js b/meteor/client/views/dashboard/layouts/dashboard-apps-layout.js index afed57dacc..46d5cfb567 100644 --- a/meteor/client/views/dashboard/layouts/dashboard-apps-layout.js +++ b/meteor/client/views/dashboard/layouts/dashboard-apps-layout.js @@ -1,3 +1,5 @@ +var path = require('path'); + Template.dashboard_apps_layout.rendered = function () { Meteor.setInterval(function () { $('.header .icons a').tooltip(); @@ -35,5 +37,13 @@ Template.dashboard_apps_layout.events({ exec('open ' + this.path, function (err) { if (err) { throw err; } }); + }, + 'click .btn-start': function () { + AppUtil.start(this._id); + $('.btn-icon').tooltip('hide'); + }, + 'click .btn-stop': function () { + AppUtil.stop(this._id); + $('.btn-icon').tooltip('hide'); } }); diff --git a/meteor/client/views/dashboard/settings/dashboard-settings.html b/meteor/client/views/dashboard/settings/dashboard-settings.html index cf615b4d5b..9796d42e91 100644 --- a/meteor/client/views/dashboard/settings/dashboard-settings.html +++ b/meteor/client/views/dashboard/settings/dashboard-settings.html @@ -39,4 +39,17 @@ {{/if}} +
+
+

Usage Analytics

+

Send usage analytics to help us improve the developer experience. No sensitive data will be tracked. We really appreciate the help.

+
+
+ {{#if install.tracking}} + Turn Off Usage Analytics + {{else}} + Turn On Usage Analytics + {{/if}} +
+
diff --git a/meteor/client/views/dashboard/settings/dashboard-settings.js b/meteor/client/views/dashboard/settings/dashboard-settings.js index 1a2ef4b7bd..2919d189ca 100644 --- a/meteor/client/views/dashboard/settings/dashboard-settings.js +++ b/meteor/client/views/dashboard/settings/dashboard-settings.js @@ -20,6 +20,28 @@ Template.dashboard_settings.events({ console.log(err); } }); + }, + 'click .btn-usage-analytics-on': function () { + var install = Installs.findOne({}); + Installs.update(install._id, { + $set: { + tracking: true + } + }); + }, + 'click .btn-usage-analytics-off': function () { + var install = Installs.findOne({}); + Installs.update(install._id, { + $set: { + tracking: false + } + }); + } +}); + +Template.dashboard_settings.helpers({ + install: function () { + return Installs.findOne({}); } }); diff --git a/meteor/settings_dev.json b/meteor/settings_dev.json index 19b3d63fd8..424ce6b0f5 100644 --- a/meteor/settings_dev.json +++ b/meteor/settings_dev.json @@ -1,7 +1,7 @@ { "public": { "ga": { - "id": "UA-53012639-2", + "id": "UA-54515442-1", "create": { "cookieDomain": "none" } diff --git a/resources/settings.json b/resources/settings.json new file mode 100644 index 0000000000..06c85b0597 --- /dev/null +++ b/resources/settings.json @@ -0,0 +1,10 @@ +{ + "public": { + "ga": { + "id": "UA-54184042-1", + "create": { + "cookieDomain": "none" + } + } + } +}