diff --git a/src/js/client.js b/src/js/client.js index 21d984461..73c091198 100644 --- a/src/js/client.js +++ b/src/js/client.js @@ -579,6 +579,18 @@ angular.module('Application').service('Client', ['$http', '$interval', 'md5', 'N }).error(defaultErrorHandler(callback)); }; + Client.prototype.getTaskLogs = function (taskId, follow, lines, callback) { + if (follow) { + var eventSource = new EventSource(client.apiOrigin + '/api/v1/tasks/' + taskId + '/logstream?lines=' + lines + '&access_token=' + token); + callback(null, eventSource); + } else { + get('/api/v1/services/' + taskId + '/logs?lines=100').success(function (data, status) { + if (status !== 200 || typeof data !== 'object') return callback(new ClientError(status, data)); + callback(null, data); + }).error(defaultErrorHandler(callback)); + } + }; + Client.prototype.startBackup = function (callback) { post('/api/v1/backups').success(function(data, status) { if (status !== 202 || typeof data !== 'object') return callback(new ClientError(status, data)); diff --git a/src/js/logs.js b/src/js/logs.js index 2e2501510..f5c3257be 100644 --- a/src/js/logs.js +++ b/src/js/logs.js @@ -14,6 +14,7 @@ app.controller('LogsController', ['$scope', '$timeout', '$location', 'Client', f $scope.activeEventSource = null; $scope.lines = 100; $scope.selectedAppInfo = null; + $scope.selectedTaskInfo = null; $scope.error = function (error) { console.error(error); @@ -34,8 +35,9 @@ app.controller('LogsController', ['$scope', '$timeout', '$location', 'Client', f var func; if ($scope.selected.type === 'platform') func = Client.getPlatformLogs; - else if ($scope.selected.type === 'addon') func = Client.getServiceLogs; - else func = Client.getAppLogs; + else if ($scope.selected.type === 'service') func = Client.getServiceLogs; + else if ($scope.selected.type === 'task') func = Client.getTaskLogs; + else if ($scope.selected.type === 'app') func = Client.getAppLogs; func($scope.selected.value, true, $scope.lines, function handleLogs(error, result) { if (error) return console.error(error); @@ -64,38 +66,52 @@ app.controller('LogsController', ['$scope', '$timeout', '$location', 'Client', f }); } - function loadId(id, callback) { - // Add built-in log types for now - var BUILT_IN_LOGS = [ - { name: 'Box', type: 'platform', value: 'box', url: Client.makeURL('/api/v1/cloudron/logs/box') }, - { name: 'Mail', type: 'platform', value: 'mail', url: Client.makeURL('/api/v1/cloudron/logs/mail') }, - { name: 'Backup', type: 'platform', value: 'backup', url: Client.makeURL('/api/v1/cloudron/logs/backup') }, - { name: 'MongoDB', type: 'addon', value: 'mongodb', url: Client.makeURL('/api/v1/services/mongodb/logs') }, - { name: 'MySQL', type: 'addon', value: 'mysql', url: Client.makeURL('/api/v1/services/mysql/logs') }, - { name: 'PostgreSQL', type: 'addon', value: 'postgresql', url: Client.makeURL('/api/v1/services/postgresql/logs') }, - { name: 'Mail', type: 'addon', value: 'mail', url: Client.makeURL('/api/v1/services/mail/logs') }, - { name: 'Docker', type: 'addon', value: 'docker', url: Client.makeURL('/api/v1/services/docker/logs') }, - { name: 'Unbound', type: 'addon', value: 'unbound', url: Client.makeURL('/api/v1/services/unbound/logs') } - ]; - - $scope.selected = BUILT_IN_LOGS.find(function (e) { return e.value === id; }); - if ($scope.selected) return callback(); - - Client.getApp(id, function (error, app) { - if (error) return callback(error); - - $scope.selectedAppInfo = app; - - $scope.selected = { - type: 'app', - value: app.id, - name: app.fqdn + ' (' + app.manifest.title + ')', - url: Client.makeURL('/api/v1/apps/' + app.id + '/logs'), - addons: app.manifest.addons - }; + function select(ids, callback) { + if (ids.id) { + var BUILT_IN_LOGS = [ + { name: 'Box', type: 'platform', value: 'box', url: Client.makeURL('/api/v1/cloudron/logs/box') }, + { name: 'MongoDB', type: 'service', value: 'mongodb', url: Client.makeURL('/api/v1/services/mongodb/logs') }, + { name: 'MySQL', type: 'service', value: 'mysql', url: Client.makeURL('/api/v1/services/mysql/logs') }, + { name: 'PostgreSQL', type: 'service', value: 'postgresql', url: Client.makeURL('/api/v1/services/postgresql/logs') }, + { name: 'Mail', type: 'service', value: 'mail', url: Client.makeURL('/api/v1/services/mail/logs') }, + { name: 'Docker', type: 'service', value: 'docker', url: Client.makeURL('/api/v1/services/docker/logs') }, + { name: 'Unbound', type: 'service', value: 'unbound', url: Client.makeURL('/api/v1/services/unbound/logs') } + ]; + $scope.selected = BUILT_IN_LOGS.find(function (e) { return e.value === ids.id; }); callback(); - }); + } else if (ids.appId) { + Client.getApp(ids.appId, function (error, app) { + if (error) return callback(error); + + $scope.selectedAppInfo = app; + + $scope.selected = { + type: 'app', + value: app.id, + name: app.fqdn + ' (' + app.manifest.title + ')', + url: Client.makeURL('/api/v1/apps/' + app.id + '/logs'), + addons: app.manifest.addons + }; + + callback(); + }); + } else if (ids.taskId) { + Client.getTask(ids.taskId, function (error, task) { + if (error) return callback(error); + + $scope.selectedTaskInfo = task; + + $scope.selected = { + type: 'task', + value: task.id, + name: task.type, + url: Client.makeURL('/api/v1/tasks/' + task.id + '/logs') + }; + + callback(); + }); + } } Client.getStatus(function (error, status) { @@ -124,7 +140,7 @@ app.controller('LogsController', ['$scope', '$timeout', '$location', 'Client', f Client.refreshConfig(function (error) { if (error) return $scope.error(error); - loadId(search.id, function (error) { + select({ id: search.id, taskId: search.taskId, appId: search.appId }, function (error) { if (error) return $scope.error(error); // now mark the Client to be ready diff --git a/src/views/apps.html b/src/views/apps.html index 276301c89..3e5d23b78 100644 --- a/src/views/apps.html +++ b/src/views/apps.html @@ -403,7 +403,7 @@ @@ -574,7 +574,7 @@
- +
diff --git a/src/views/backups.html b/src/views/backups.html index bc42d4c2c..5239e5a80 100644 --- a/src/views/backups.html +++ b/src/views/backups.html @@ -241,7 +241,7 @@

Please be careful when uploading these logs to a public server since they may contain sensitive information.

- Show Logs + Show Logs
diff --git a/src/views/backups.js b/src/views/backups.js index 114a2a5db..f2c8b281c 100644 --- a/src/views/backups.js +++ b/src/views/backups.js @@ -86,6 +86,7 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat percent: 0, message: '', errorMessage: '', + taskId: '', checkStatus: function () { Client.getLatestTaskByType('backup', function (error, task) { @@ -93,13 +94,14 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat if (!task) return; - $scope.createBackup.updateStatus(task.id); + $scope.createBackup.taskId = task.id; + $scope.createBackup.updateStatus(); }); }, - updateStatus: function (taskId) { - Client.getTask(taskId, function (error, data) { - if (error) return window.setTimeout($scope.createBackup.updateStatus.bind(null, taskId), 5000); + updateStatus: function () { + Client.getTask($scope.createBackup.taskId, function (error, data) { + if (error) return window.setTimeout($scope.createBackup.updateStatus, 5000); if (!data.active) { $scope.createBackup.busy = false; @@ -113,7 +115,7 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat $scope.createBackup.busy = true; $scope.createBackup.percent = data.percent; $scope.createBackup.message = data.message; - window.setTimeout($scope.createBackup.updateStatus.bind(null, taskId), 500); + window.setTimeout($scope.createBackup.updateStatus, 500); }); }, @@ -142,7 +144,8 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat return; } - $scope.createBackup.updateStatus(taskId); + $scope.createBackup.taskId = taskId; + $scope.createBackup.updateStatus(); }); },