From 2db3561492864b1898b4a01a9663ff893d817a5b Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 5 Sep 2014 19:52:03 -0700 Subject: [PATCH 1/6] Added GA to track usage analytics and option to disable it. --- .gitignore | 2 +- index.js | 1 + meteor/client/lib/router.js | 9 +++++++- meteor/client/lib/util.js | 9 +++++--- .../layouts/dashboard-apps-layout.js | 17 +++++++------- .../settings/dashboard-settings.html | 13 +++++++++++ .../dashboard/settings/dashboard-settings.js | 22 +++++++++++++++++++ meteor/settings_dev.json | 2 +- resources/settings.json | 10 +++++++++ 9 files changed, 70 insertions(+), 15 deletions(-) create mode 100644 resources/settings.json 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 9edc43f678..d4e7e1436c 100644 --- a/index.js +++ b/index.js @@ -68,6 +68,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'); console.log(path.join(process.cwd(), 'resources', 'node')); var nodeChild = child_process.spawn(path.join(process.cwd(), 'resources', 'node'), ['./bundle/main.js'], { env: user_env 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 88ee3f3b9f..93b9a42c5b 100755 --- a/meteor/client/lib/util.js +++ b/meteor/client/lib/util.js @@ -156,8 +156,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/layouts/dashboard-apps-layout.js b/meteor/client/views/dashboard/layouts/dashboard-apps-layout.js index 9a32743715..3039f77881 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(); @@ -24,18 +26,15 @@ Template.dashboard_apps_layout.events({ AppUtil.logs(this._id); }, 'click .btn-terminal': function () { - var buildCmd = function (dockerId, termApp) { - return "echo 'boot2docker --vm=\"boot2docker-vm\" ssh -t \"sudo docker-enter " + dockerId + "\"' > /tmp/nsenter-start && chmod +x /tmp/nsenter-start && open -a " + termApp + " /tmp/nsenter-start"; - }; var app = this; - var nsenterCmd = buildCmd(app.docker.Id, 'iTerm.app'); + var cmd = path.join(Util.getBinDir(), 'boot2docker') + ' ssh -t "sudo docker-enter ' + app.docker.Id + '"'; + var terminalCmd = path.join(Util.getBinDir(), 'terminal') + ' ' + cmd; var exec = require('child_process').exec; - exec(nsenterCmd, function (err) { + console.log(terminalCmd); + exec(terminalCmd, function (err, stdout) { + console.log(stdout); if (err) { - nsenterCmd = buildCmd(app.docker.Id, 'Terminal.app'); - exec(nsenterCmd, function (err) { - if (err) { throw err; } - }); + console.log(err); } }); }, 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..3f21e7a970 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" + } + } + } +} From 7fc0fc083beae0294e0cf9e022eb6783900a10b3 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Sat, 6 Sep 2014 01:04:27 -0700 Subject: [PATCH 2/6] Removed octicons package. --- meteor/.meteor/packages | 1 - 1 file changed, 1 deletion(-) diff --git a/meteor/.meteor/packages b/meteor/.meteor/packages index 6d8743e310..0a499fa9ec 100755 --- a/meteor/.meteor/packages +++ b/meteor/.meteor/packages @@ -10,6 +10,5 @@ iron-router handlebar-helpers underscore-string-latest collection-helpers -octicons fast-render iron-router-ga From 30b6c52edc849fef57e79742b2f945bc0023f261 Mon Sep 17 00:00:00 2001 From: Peter Nguyen Date: Sat, 6 Sep 2014 22:14:09 +0200 Subject: [PATCH 3/6] Added feature to start/stop apps --- meteor/.meteor/packages | 1 - meteor/client/lib/apputil.js | 41 ++++++++++++++++++- meteor/client/lib/docker.js | 26 ++++++++++++ .../dashboard/apps/dashboard-single-app.html | 14 +++++-- .../dashboard/apps/dashboard-single-app.js | 8 ++++ 5 files changed, 85 insertions(+), 5 deletions(-) diff --git a/meteor/.meteor/packages b/meteor/.meteor/packages index 6d8743e310..0a499fa9ec 100755 --- a/meteor/.meteor/packages +++ b/meteor/.meteor/packages @@ -10,6 +10,5 @@ iron-router handlebar-helpers underscore-string-latest collection-helpers -octicons fast-render iron-router-ga diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index 03ff2b4bf1..4af94d476d 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -47,6 +47,45 @@ 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.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) { @@ -115,7 +154,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..f4c4e70855 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.stop(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) { diff --git a/meteor/client/views/dashboard/apps/dashboard-single-app.html b/meteor/client/views/dashboard/apps/dashboard-single-app.html index f1e3740ff8..e8fd11b7ac 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}} @@ -18,7 +22,11 @@ {{image.meta.name}}
+ {{#if $eq status 'STOPPED'}} + + {{/if}} {{#if $eq status 'READY'}} + {{#if url}} {{/if}} diff --git a/meteor/client/views/dashboard/apps/dashboard-single-app.js b/meteor/client/views/dashboard/apps/dashboard-single-app.js index 1b6190205c..8bd9da0b01 100755 --- a/meteor/client/views/dashboard/apps/dashboard-single-app.js +++ b/meteor/client/views/dashboard/apps/dashboard-single-app.js @@ -32,6 +32,14 @@ Template.dashboard_single_app.events({ } }); }, + '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); }, From 67d90fb882c3a2263ed2083f095021d569879818 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Sat, 6 Sep 2014 20:44:45 -0700 Subject: [PATCH 4/6] UX refactor and JSHint. --- meteor/client/lib/apputil.js | 1 - meteor/client/lib/docker.js | 4 ++-- .../views/dashboard/apps/dashboard-single-app.html | 10 ++++++---- .../views/dashboard/settings/dashboard-settings.js | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index 4af94d476d..d0a866584c 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -131,7 +131,6 @@ AppUtil.logs = function (appId) { logs: [] } }); - var logs = []; response.setEncoding('utf8'); response.on('data', function (line) { Apps.update(app._id, { diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index f4c4e70855..a9534719ce 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -267,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/views/dashboard/apps/dashboard-single-app.html b/meteor/client/views/dashboard/apps/dashboard-single-app.html index e8fd11b7ac..baa2df2470 100755 --- a/meteor/client/views/dashboard/apps/dashboard-single-app.html +++ b/meteor/client/views/dashboard/apps/dashboard-single-app.html @@ -22,17 +22,19 @@ {{image.meta.name}}
- {{#if $eq status 'STOPPED'}} - - {{/if}} {{#if $eq status 'READY'}} - {{#if url}} {{/if}} {{/if}} + {{#if $eq status 'READY'}} + + {{/if}} + {{#if $eq status 'STOPPED'}} + + {{/if}} diff --git a/meteor/client/views/dashboard/settings/dashboard-settings.js b/meteor/client/views/dashboard/settings/dashboard-settings.js index 3f21e7a970..2919d189ca 100644 --- a/meteor/client/views/dashboard/settings/dashboard-settings.js +++ b/meteor/client/views/dashboard/settings/dashboard-settings.js @@ -27,7 +27,7 @@ Template.dashboard_settings.events({ $set: { tracking: true } - }) + }); }, 'click .btn-usage-analytics-off': function () { var install = Installs.findOne({}); @@ -35,7 +35,7 @@ Template.dashboard_settings.events({ $set: { tracking: false } - }) + }); } }); From 5d88c4ed878a37acae5eaf8387f39e364f3f723a Mon Sep 17 00:00:00 2001 From: Sean Li Date: Sat, 6 Sep 2014 20:47:24 -0700 Subject: [PATCH 5/6] Added start/stop action in app detail page. --- .../views/dashboard/layouts/dashboard-apps-layout.html | 6 ++++++ .../views/dashboard/layouts/dashboard-apps-layout.js | 8 ++++++++ 2 files changed, 14 insertions(+) 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 3039f77881..c7709de005 100644 --- a/meteor/client/views/dashboard/layouts/dashboard-apps-layout.js +++ b/meteor/client/views/dashboard/layouts/dashboard-apps-layout.js @@ -46,5 +46,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'); } }); From 1a67c090baa6d52a24d2d091d6641c9061a60d0a Mon Sep 17 00:00:00 2001 From: Sean Li Date: Sun, 7 Sep 2014 14:52:44 -0700 Subject: [PATCH 6/6] Fixed starting/stopping apps locking up issue. --- meteor/client/lib/apputil.js | 23 +++++++++++++---------- meteor/client/lib/docker.js | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/meteor/client/lib/apputil.js b/meteor/client/lib/apputil.js index d0a866584c..12845487fc 100644 --- a/meteor/client/lib/apputil.js +++ b/meteor/client/lib/apputil.js @@ -53,17 +53,20 @@ AppUtil.start = function (appId) { Apps.update(app._id, {$set: { status: 'STARTING' }}); - Docker.getContainerData(app.docker.Id, function (err, data) { + Docker.startContainer(app.docker.Id, function (err) { 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 - }}); + 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 + }}); + }); }); }); } diff --git a/meteor/client/lib/docker.js b/meteor/client/lib/docker.js index a9534719ce..e959079d08 100644 --- a/meteor/client/lib/docker.js +++ b/meteor/client/lib/docker.js @@ -83,7 +83,7 @@ Docker.runContainer = function (app, image, callback) { Docker.startContainer = function (containerId, callback) { var container = docker.getContainer(containerId); - container.stop(function (err) { + container.start(function (err) { if (err) { console.log(err); callback(err);