1
0
mirror of https://github.com/docker/docs.git synced 2026-11-05 00:14:17 +03:00

Merge branch 'analytics' of github.com:kitematic/kitematic into rc0.2.0

Conflicts:
	index.js
	meteor/.meteor/packages
	meteor/client/views/dashboard/layouts/dashboard-apps-layout.js
This commit is contained in:
Jeff Morgan
2014-09-07 23:51:25 -07:00
15 changed files with 171 additions and 15 deletions

2
.gitignore vendored
View File

@@ -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

View File

@@ -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();
});
});
});

View File

@@ -11,4 +11,3 @@ underscore-string-latest
collection-helpers
iron:router
reywood:iron-router-ga

View File

@@ -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) {

View File

@@ -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.');

View File

@@ -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({

View File

@@ -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);
}
}
};

View File

@@ -7,10 +7,14 @@
{{#if $eq status 'STARTING'}}
<span style="color: #D6D6D6;" class="status starting"><i class="fa fa-circle-o-notch fa-spin"></i></span>
{{else}}
{{#if $eq status 'ERROR'}}
<span style="color: #F74B1F;" class="status"><i class="fa fa-circle-o"></i></span>
{{#if $eq status 'STOPPING'}}
<span style="color: #D6D6D6;" class="status stopping"><i class="fa fa-circle-o-notch fa-spin"></i></span>
{{else}}
<span style="color: #D6D6D6;" class="status"><i class="fa fa-circle-o"></i></span>
{{#if $eq status 'ERROR'}}
<span style="color: #F74B1F;" class="status"><i class="fa fa-circle-o"></i></span>
{{else}}
<span style="color: #D6D6D6;" class="status"><i class="fa fa-circle-o"></i></span>
{{/if}}
{{/if}}
{{/if}}
{{/if}}
@@ -25,6 +29,12 @@
<a href="#" onclick="trackLink('terminal into app')" class="btn-icon btn-terminal" data-toggle="tooltip" data-placement="bottom" title="Terminal"><span class="typcn typcn-device-laptop"></span></a>
{{/if}}
<a href="#" onclick="trackLink('open app folder')" class="btn-icon btn-folder" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Folder"><span class="typcn typcn-folder-open"></span></a>
{{#if $eq status 'READY'}}
<a href="#" onclick="trackLink('stop app')" class="btn-icon btn-stop" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Stop App"><span class="typcn typcn-media-pause-outline"></span></a>
{{/if}}
{{#if $eq status 'STOPPED'}}
<a href="#" onclick="trackLink('start app')" class="btn-icon btn-start" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Start App"><span class="typcn typcn-media-play-outline"></span></a>
{{/if}}
<a href="#" onclick="trackLink('restart app')" class="btn-icon btn-restart" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Restart"><span class="typcn typcn-refresh-outline"></span></a>
<a href="/apps/{{name}}/logs" onclick="trackLink('app logs')" class="btn-icon btn-logs" data-toggle="tooltip" data-placement="bottom" title="Logs"><span class="typcn typcn-document-text"></span></a>
<a href="/apps/{{name}}/settings" onclick="trackLink('app settings')" class="btn-icon" data-toggle="tooltip" data-placement="bottom" title="Settings"><span class="typcn typcn-cog-outline"></span></a>

View File

@@ -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);
},

View File

@@ -19,6 +19,12 @@
<a onclick="trackLink('go to app image')" href="/images/{{image._id}}" class="btn-image" data-toggle="tooltip" data-placement="bottom" title="Image" data-container="body"><span class="typcn typcn-camera-outline"></span></a>
{{/if}}
<a onclick="trackLink('open app folder')" href="#" class="btn-folder" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Folder" data-container="body"><span class="typcn typcn-folder-open"></span></a>
{{#if $eq status 'READY'}}
<a href="#" onclick="trackLink('stop app')" class="btn-icon btn-stop" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Stop App"><span class="typcn typcn-media-pause-outline"></span></a>
{{/if}}
{{#if $eq status 'STOPPED'}}
<a href="#" onclick="trackLink('start app')" class="btn-icon btn-start" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Start App"><span class="typcn typcn-media-play-outline"></span></a>
{{/if}}
<a onclick="trackLink('restart app')" href="#" class="btn-restart" target="_blank" data-toggle="tooltip" data-placement="bottom" title="Restart" data-container="body"><span class="typcn typcn-refresh-outline"></span></a>
</span>
</h3>

View File

@@ -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');
}
});

View File

@@ -39,4 +39,17 @@
{{/if}}
</div>
</div>
<div class="section dashboard-settings">
<div class="left-section">
<h4>Usage Analytics</h4>
<p class="help-block">Send usage analytics to help us improve the developer experience. No sensitive data will be tracked. We really appreciate the help.</p>
</div>
<div class="right-section">
{{#if install.tracking}}
<a onclick="trackLink('turn off usage analytics')" class="btn btn-negative btn-usage-analytics-off">Turn Off Usage Analytics</a>
{{else}}
<a onclick="trackLink('turn on usage analytics')" class="btn btn-positive btn-usage-analytics-on">Turn On Usage Analytics</a>
{{/if}}
</div>
</div>
</template>

View File

@@ -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({});
}
});

View File

@@ -1,7 +1,7 @@
{
"public": {
"ga": {
"id": "UA-53012639-2",
"id": "UA-54515442-1",
"create": {
"cookieDomain": "none"
}

10
resources/settings.json Normal file
View File

@@ -0,0 +1,10 @@
{
"public": {
"ga": {
"id": "UA-54184042-1",
"create": {
"cookieDomain": "none"
}
}
}
}