define("docker-manager/app", ["ember/resolver","ember/load-initializers","exports"], function(__dependency1__, __dependency2__, __exports__) { "use strict"; var Resolver = __dependency1__["default"]; var loadInitializers = __dependency2__["default"]; var App = Ember.Application.extend({ modulePrefix: 'docker-manager', // TODO: loaded via config Resolver: Resolver }); loadInitializers(App, 'docker-manager'); __exports__["default"] = App; }); define("docker-manager/components/progress-bar", ["exports"], function(__exports__) { "use strict"; __exports__["default"] = Em.Component.extend({ classNameBindings: [':progress', ':progress-striped', 'active'], active: function() { return parseInt(this.get('percent'), 10) !== 100; }.property('percent'), barStyle: function() { var percent = parseInt(this.get('percent'), 10); if (percent > 0) { if (percent > 100) { percent = 100; } return 'width: ' + this.get('percent') + '%'; } }.property('percent') }); }); define("docker-manager/components/x-console", ["exports"], function(__exports__) { "use strict"; __exports__["default"] = Em.Component.extend({ classNameBindings: [':logs'], render: function(buffer) { if (!Em.isEmpty(this.get('output'))) { buffer.push(this.get('output')); } }, _outputChanged: function() { Em.run.scheduleOnce('afterRender', this, '_scrollBottom'); this.rerender(); }.observes('output'), _scrollBottom: function() { if (this.get('followOutput')) { this.$().scrollTop(this.$()[0].scrollHeight); } }, _scrollOnInsert: function() { this._scrollBottom(); }.on('didInsertElement') }); }); define("docker-manager/components/x-tab", ["exports"], function(__exports__) { "use strict"; __exports__["default"] = Em.Component.extend({ tagName: 'li', classNameBindings: ['active'], active: function() { return this.get('childViews').anyBy('active'); }.property('childViews.@each.active') }); }); define("docker-manager/controllers/index", ["exports"], function(__exports__) { "use strict"; __exports__["default"] = Em.ObjectController.extend({ upgrading: null }); }); define("docker-manager/controllers/processes", ["exports"], function(__exports__) { "use strict"; __exports__["default"] = Ember.ObjectController.extend({ autoRefresh: false, init: function() { this._super(); var self = this; window.setInterval(function() { self.performRefresh(); }, 5000); }, performRefresh: function() { if (this.get('autoRefresh')) { this.get('model').refresh(); } } }); }); define("docker-manager/controllers/repo", ["exports"], function(__exports__) { "use strict"; __exports__["default"] = Em.ObjectController.extend({ needs: ['index'], upgradingRepo: Em.computed.alias('controllers.index.upgrading'), managerRepo: Em.computed.alias('controllers.index.managerRepo'), upgradeDisabled: function() { var upgradingRepo = this.get('upgradingRepo'); if (Em.isNone(upgradingRepo)) { var managerRepo = this.get('managerRepo'); if (!managerRepo) { return false; } return (!managerRepo.get('upToDate')) && managerRepo !== this.get('model'); } return true; }.property('upgradingRepo', 'model', 'managerRepo', 'managerRepo.upToDate') }); }); define("docker-manager/controllers/upgrade", ["exports"], function(__exports__) { "use strict"; /* global MessageBus, bootbox */ __exports__["default"] = Em.ObjectController.extend({ init: function() { this._super(); this.reset(); }, complete: Em.computed.equal('status', 'complete'), failed: Em.computed.equal('status', 'failed'), messageReceived: function(msg) { switch(msg.type) { case "log": this.set('output', this.get('output') + msg.value + "\n"); break; case "percent": this.set('percent', msg.value); break; case "status": this.set('status', msg.value); if (msg.value === 'complete' || msg.value === 'failed') { this.set('upgrading', false); } if (msg.value === 'complete') { this.set('version', this.get('latest.version')); } break; } }, upgradeButtonText: function() { if (this.get('upgrading')) { return "Upgrading..."; } else { return "Start Upgrading"; } }.property('upgrading'), startBus: function() { var self = this; MessageBus.subscribe("/docker/upgrade", function(msg) { self.messageReceived(msg); }); }, stopBus: function() { MessageBus.unsubscribe("/docker/upgrade"); }, reset: function() { this.setProperties({ output: '', status: null, percent: 0 }); }, actions: { start: function() { this.reset(); var repo = this.get('model'); if (repo.get('upgrading')) { return; } repo.startUpgrade(); }, resetUpgrade: function() { var self = this; bootbox.confirm("
WARNING: You should only reset upgrades that have failed and are not running.
This will NOT cancel currently running builds and should only be used as a last resort.
", function(cancel) { if (cancel) { var repo = self.get('model'); repo.resetUpgrade().then(function() { self.reset(); }); } }); } }, }); }); define("docker-manager/helpers/fmt-ago", ["exports"], function(__exports__) { "use strict"; __exports__["default"] = Em.Handlebars.makeBoundHelper(function(dt) { if (Em.isEmpty(dt)) { return new Handlebars.SafeString("—"); } return moment(dt).fromNow(); }); }); define("docker-manager/helpers/fmt-commit", ["exports"], function(__exports__) { "use strict"; __exports__["default"] = Em.Handlebars.makeBoundHelper(function(sha1, url) { if (Em.isNone(url)) { return; } return new Em.Handlebars.SafeString("(" + sha1 + ")"); }); }); define("docker-manager/initializers/csrf-token", ["ic-ajax","exports"], function(__dependency1__, __exports__) { "use strict"; var ajax = __dependency1__["default"]; __exports__["default"] = { name: "findCsrfToken", initialize: function(container, application) { return ajax('/session/csrf').then(function(result) { var token = result.csrf; $.ajaxPrefilter(function(options, originalOptions, xhr) { if (!options.crossDomain) { xhr.setRequestHeader('X-CSRF-Token', token); } }); }); } }; }); define("docker-manager/models/process-list", ["ic-ajax","exports"], function(__dependency1__, __exports__) { "use strict"; var ajax = __dependency1__["default"]; var ProcessList = Em.Object.extend({ init: function() { this._super(); }, refresh: function() { var self = this; return ajax("/admin/docker/ps").then(function(result) { self.set('output', result); return self; }); } }); ProcessList.reopenClass({ find: function() { var list = ProcessList.create(); return list.refresh(); } }); __exports__["default"] = ProcessList; }); define("docker-manager/models/repo", ["ic-ajax","exports"], function(__dependency1__, __exports__) { "use strict"; var ajax = __dependency1__["default"]; var loaded = []; var Repo = Em.Object.extend({ upToDate: function() { return !this.get('upgrading') & (this.get('version') === this.get('latest.version')); }.property('upgrading', 'version', 'latest.version'), shouldCheck: function() { if (Em.isNone(this.get('version'))) { return false; } if (this.get('checking')) { return false; } // Only check once every minute var lastCheckedAt = this.get('lastCheckedAt'); if (lastCheckedAt) { var ago = new Date().getTime() - lastCheckedAt; return ago > 60 * 1000; } return true; }.property().volatile(), repoAjax: function(url, args) { args = args || {}; args.data = this.getProperties('path', 'version'); return ajax(url, args); }, findLatest: function() { var self = this; return new Em.RSVP.Promise(function(resolve, reject) { if (!self.get('shouldCheck')) { return resolve(); } self.set('checking', true); self.repoAjax('/admin/docker/latest').then(function(result) { self.setProperties({ checking: false, lastCheckedAt: new Date().getTime(), latest: Em.Object.create(result.latest) }); resolve(); }); }); }, findProgress: function() { return this.repoAjax('/admin/docker/progress').then(function(result) { return result.progress; }); }, resetUpgrade: function() { var self = this; return this.repoAjax('/admin/docker/upgrade', { type: 'DELETE' }).then(function() { self.set('upgrading', false); }); }, startUpgrade: function() { var self = this; this.set('upgrading', true); return this.repoAjax('/admin/docker/upgrade', { type: 'POST' }).catch(function() { self.set('upgrading', false); }); } }); Repo.reopenClass({ findAll: function() { return new Em.RSVP.Promise(function (resolve) { if (loaded.length) { return resolve(loaded); } ajax("/admin/docker/repos").then(function(result) { loaded = result.repos.map(function(r) { return Repo.create(r); }); resolve(loaded); }); }); }, findUpgrading: function() { return this.findAll().then(function(result) { return result.findBy('upgrading', true); }); }, find: function(id) { return this.findAll().then(function(result) { return result.findBy('id', id); }); }, }); __exports__["default"] = Repo; }); define("docker-manager/router", ["exports"], function(__exports__) { "use strict"; var Router = Ember.Router.extend(); // ensure we don't share routes between all Router instances Router.map(function() { this.route("processes"); this.resource('upgrade', { path: '/upgrade/:id' }); }); __exports__["default"] = Router; }); define("docker-manager/routes/index", ["docker-manager/models/repo","exports"], function(__dependency1__, __exports__) { "use strict"; var Repo = __dependency1__["default"]; __exports__["default"] = Em.Route.extend({ model: function() { return Repo.findAll(); }, setupController: function(controller, model) { controller.setProperties({ model: model, upgrading: null }); model.forEach(function(repo) { repo.findLatest(); if (repo.get('upgrading')) { controller.set('upgrading', repo); } // Special case: Upgrade docker manager first if (repo.get('id') === 'docker_manager') { controller.set('managerRepo', repo); } }); }, actions: { upgrade: function(repo) { this.transitionTo('upgrade', repo); } } }); }); define("docker-manager/routes/processes", ["docker-manager/models/process-list","exports"], function(__dependency1__, __exports__) { "use strict"; var ProcessList = __dependency1__["default"]; __exports__["default"] = Em.Route.extend({ model: function() { return ProcessList.find(); } }); }); define("docker-manager/routes/upgrade", ["docker-manager/models/repo","exports"], function(__dependency1__, __exports__) { "use strict"; var Repo = __dependency1__["default"]; __exports__["default"] = Em.Route.extend({ model: function(params) { return Repo.find(params.id); }, afterModel: function(model, transition) { var self = this; return Repo.findUpgrading().then(function(u) { if (u && u !== model) { return Ember.RSVP.Promise.reject("wat"); } return model.findLatest().then(function() { return model.findProgress().then(function(progress) { self.set("progress", progress); }); }); }); }, setupController: function(controller, model) { controller.reset(); controller.setProperties({ model: model, output: this.get('progress.logs'), percent: this.get('progress.percentage') }); controller.startBus(); }, deactivate: function() { this.controllerFor('upgrade').stopBus(); } }); }); define("docker-manager/utils/ajax", ["exports"], function(__exports__) { "use strict"; /* global ic */ __exports__["default"] = function ajax(){ return ic.ajax.apply(null, arguments); } }); define("docker-manager/views/loading", ["exports"], function(__exports__) { "use strict"; __exports__["default"] = Em.View.extend({ _showOnInsert: function() { var self = this; self.set('runner', Em.run.later(function() { self.$('h3').show(); }, 200)); }.on('didInsertElement'), _cancelFade: function() { Em.run.cancel(this.get('runner')); }.on('willDestroyElement') }); }); define("docker-manager/views/processes", ["exports"], function(__exports__) { "use strict"; __exports__["default"] = Em.View.extend({ _insertedIntoDOM: function() { this.set('controller.autoRefresh', true); }.on('didInsertElement'), _removedFromDOM: function() { this.set('controller.autoRefresh', false); }.on('willDestroyElement') }); }); //# sourceMappingURL=app.js.map define('docker-manager/templates/application', ['exports'], function(__exports__){ __exports__['default'] = Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) { this.compilerInfo = [4,'>= 1.0.0']; helpers = this.merge(helpers, Ember.Handlebars.helpers); data = data || {}; var buffer = '', stack1, helper, options, self=this, helperMissing=helpers.helperMissing; function program1(depth0,data) { data.buffer.push("Name | \nStatus | \n
---|
Upgrade completed successfully!
\nNote: The web server restarts in the background. It's a good idea to wait 30 seconds or so\n before refreshing your browser to see the latest version of the application.
\n"); } function program3(depth0,data) { data.buffer.push("\nSorry, there wasn an error upgrading Discourse. Please check the logs.
\n"); } function program5(depth0,data) { var buffer = '', stack1, helper, options; data.buffer.push("\n"); stack1 = helpers._triageMustache.call(depth0, "name", {hash:{},hashTypes:{},hashContexts:{},contexts:[depth0],types:["ID"],data:data}); if(stack1 || stack1 === 0) { data.buffer.push(stack1); } data.buffer.push(" is at the newest version "); data.buffer.push(escapeExpression((helper = helpers['fmt-commit'] || (depth0 && depth0['fmt-commit']),options={hash:{},hashTypes:{},hashContexts:{},contexts:[depth0,depth0],types:["ID","ID"],data:data},helper ? helper.call(depth0, "version", "url", options) : helperMissing.call(depth0, "fmt-commit", "version", "url", options)))); data.buffer.push(".
\n"); return buffer; } function program7(depth0,data) { var buffer = '', stack1; data.buffer.push("\n