diff --git a/webadmin/src/js/client.js b/webadmin/src/js/client.js index cc803a964..011cf4a04 100644 --- a/webadmin/src/js/client.js +++ b/webadmin/src/js/client.js @@ -388,6 +388,21 @@ angular.module('Application').service('Client', ['$http', 'md5', 'Notification', }).error(defaultErrorHandler(callback)); }; + Client.prototype.debugApp = function (id, state, callback) { + var data = { + appId: id, + debugMode: state ? { + readonlyRootfs: true, + cmd: [ '/bin/bash', '-c', 'echo "Repair mode. Use the webterminal or cloudron exec to repair. Sleeping" && sleep infinity' ] + } : null + }; + + post('/api/v1/apps/' + id + '/configure', data).success(function (data, status) { + if (status !== 202) return callback(new ClientError(status, data)); + callback(null); + }).error(defaultErrorHandler(callback)); + }; + Client.prototype.progress = function (callback, errorCallback) { // this is used in the defaultErrorHandler itself, and avoids a loop if (typeof errorCallback !== 'function') errorCallback = defaultErrorHandler(callback); diff --git a/webadmin/src/views/debug.html b/webadmin/src/views/debug.html index 6b0484d2a..a128d24b1 100644 --- a/webadmin/src/views/debug.html +++ b/webadmin/src/views/debug.html @@ -46,6 +46,25 @@ + + +
@@ -61,10 +80,12 @@
- + + +
diff --git a/webadmin/src/views/debug.js b/webadmin/src/views/debug.js index 6503503cb..ed8ce2aea 100644 --- a/webadmin/src/views/debug.js +++ b/webadmin/src/views/debug.js @@ -18,6 +18,7 @@ angular.module('Application').controller('DebugController', ['$scope', '$locatio $scope.terminalSocket = null; $scope.lines = 10; $scope.restartAppBusy = false; + $scope.selectedAppInfo = null; function ab2str(buf) { return String.fromCharCode.apply(null, new Uint16Array(buf)); @@ -144,6 +145,8 @@ angular.module('Application').controller('DebugController', ['$scope', '$locatio if ($scope.terminalSocket) { $scope.terminalSocket = null; } + + $scope.selectedAppInfo = null; } $scope.restartApp = function () { @@ -178,6 +181,33 @@ angular.module('Application').controller('DebugController', ['$scope', '$locatio }); }; + $scope.repairApp = function () { + $('#repairAppModal').modal('show'); + }; + + $scope.repairAppBegin = function () { + var appId = $scope.selected.value; + + Client.debugApp(appId, true, function (error) { + if (error) return console.error(error); + + $('#repairAppModal').modal('hide'); + }); + }; + + $scope.repairAppDone = function () { + var appId = $scope.selected.value; + + Client.debugApp(appId, false, function (error) { + if (error) return console.error(error); + + Client.getApp(appId, function (error, result) { + if (error) return console.error(error); + $scope.selectedAppInfo = result; + }); + }); + }; + $scope.showLogs = function () { $scope.terminalVisible = false; @@ -229,6 +259,12 @@ angular.module('Application').controller('DebugController', ['$scope', '$locatio return; } + // fetch current app state + Client.getApp($scope.selected.value, function (error, result) { + if (error) return console.error(error); + $scope.selectedAppInfo = result; + }); + $scope.terminal = new Terminal(); $scope.terminal.open(document.querySelector('.logs-and-term-container')); $scope.terminal.fit();