HTTP/2 does not support statusText, and proxies might replace it. Use the response body instead. Closes #4729
180 lines
5.9 KiB
JavaScript
180 lines
5.9 KiB
JavaScript
backupApp.controller('CommandlineController', function($scope, $routeParams, $location, $timeout, SystemInfo, ServerStatus, AppUtils, AppService, DialogService, gettextCatalog) {
|
|
$scope.SystemInfo = SystemInfo.watch($scope);
|
|
$scope.ServerStatus = ServerStatus;
|
|
$scope.serverstate = ServerStatus.watch($scope);
|
|
|
|
$scope.ExtendedOptions = [];
|
|
$scope.Arguments = [];
|
|
$scope.Running = false;
|
|
$scope.Mode = 'submit';
|
|
$scope.ViewLines = [];
|
|
$scope.Started = null;
|
|
$scope.Finished = false;
|
|
$scope.RawFinished = false;
|
|
|
|
var viewid = null;
|
|
var view_offset = 0;
|
|
var view_refreshing = false;
|
|
var view_timer = null;
|
|
var scope = $scope;
|
|
|
|
function reloadOptionsList()
|
|
{
|
|
var opts = AppUtils.parseOptionStrings($scope.ExtendedOptions || []);
|
|
|
|
var encmodule = opts['encryption-module'] || opts['--encryption-module'] || '';
|
|
var compmodule = opts['compression-module'] || opts['--compression-module'] || 'zip';
|
|
var backmodule = $scope.TargetURL || '';
|
|
var ix = backmodule.indexOf(':');
|
|
if (ix > 0)
|
|
backmodule = backmodule.substr(0, ix);
|
|
|
|
$scope.ExtendedOptionList = AppUtils.buildOptionList($scope.SystemInfo, encmodule, compmodule, backmodule);
|
|
};
|
|
|
|
$scope.$watchCollection("ExtendedOptions", reloadOptionsList);
|
|
$scope.$watch("TargetURL", reloadOptionsList);
|
|
$scope.$on('systeminfochanged', reloadOptionsList);
|
|
|
|
reloadOptionsList();
|
|
|
|
var scope = $scope;
|
|
|
|
$scope.HideEditUri = function() {
|
|
scope.EditUriState = false;
|
|
};
|
|
|
|
$scope.run = function() {
|
|
|
|
var opts = AppUtils.parseOptionStrings($scope.ExtendedOptions || []);
|
|
var combined = angular.copy($scope.Arguments || []);
|
|
|
|
if (($scope.TargetURL || '').trim().length != 0)
|
|
combined.unshift($scope.TargetURL);
|
|
|
|
combined.unshift($scope.Command);
|
|
|
|
for (n in opts) {
|
|
var value = opts[n];
|
|
if (n == 'include' || n == 'exclude') {
|
|
// Handle filters that appear multiple times
|
|
for (var i = 0; i < value.length; ++i) {
|
|
combined.push('--' + n + '=' + value[i]);
|
|
}
|
|
} else if (value == null) {
|
|
combined.push(n);
|
|
} else {
|
|
combined.push(n + '=' + value);
|
|
}
|
|
}
|
|
|
|
options = {
|
|
headers: {'Content-Type': 'application/json; charset=utf-8'},
|
|
responseType: 'text'
|
|
};
|
|
|
|
AppService.post('/commandline', combined, options).then(
|
|
function(resp) {
|
|
$location.path('/commandline/view/' + resp.data.ID);
|
|
},
|
|
function(resp) {
|
|
DialogService.dialog(gettextCatalog.getString('Error'), gettextCatalog.getString('Failed to connect: {{message}}', { message: message }));
|
|
}
|
|
);
|
|
};
|
|
|
|
$scope.Abort = function()
|
|
{
|
|
AppService.post('/commandline/' + viewid + '/abort' ).then(function(resp) {
|
|
|
|
}, function() {
|
|
AppUtils.connectionError.apply(AppUtils, arguments);
|
|
});
|
|
|
|
};
|
|
|
|
function FetchOutputLines()
|
|
{
|
|
if (view_refreshing)
|
|
return;
|
|
|
|
view_refreshing = true;
|
|
if (view_timer != null) {
|
|
$timeout.cancel(view_timer);
|
|
view_timer = null;
|
|
}
|
|
|
|
AppService.get('/commandline/' + viewid + '?pagesize=100&offset=' + view_offset).then(function(resp) {
|
|
$scope.ViewLines.push.apply($scope.ViewLines, resp.data.Items);
|
|
view_offset = view_offset + resp.data.Items.length;
|
|
|
|
while ($scope.ViewLines.length > 2000)
|
|
$scope.ViewLines.shift();
|
|
|
|
$scope.Started = resp.data.Started;
|
|
$scope.Finished = resp.data.Finished && view_offset == resp.data.Count;
|
|
$scope.RawFinished = resp.data.Finished;
|
|
|
|
view_refreshing = false;
|
|
var wait_time = 2000;
|
|
|
|
// Fetch more as we are not empty
|
|
if (resp.data.Items.length != 0)
|
|
wait_time = 100;
|
|
// All done, slowly keep the data alive
|
|
else if (resp.data.Finished)
|
|
wait_time = 10000;
|
|
|
|
view_timer = $timeout(FetchOutputLines, wait_time);
|
|
|
|
}, function(resp) {
|
|
$scope.Started = true;
|
|
if (resp.status == 404) {
|
|
$scope.ViewLines.push('Connection lost, data has expired ...');
|
|
$scope.Finished = true;
|
|
} else {
|
|
$scope.ViewLines.push('Connection error, retry in 2 sec ...');
|
|
view_refreshing = false;
|
|
view_timer = $timeout(FetchOutputLines, 2000);
|
|
}
|
|
});
|
|
};
|
|
|
|
AppService.get('/commandline').then(function(resp) {
|
|
var cmds = [];
|
|
for (var i = resp.data.length - 1; i >= 0; i--)
|
|
cmds.push(resp.data[i]);
|
|
|
|
$scope.SupportedCommands = cmds.sort();
|
|
$scope.Command = 'help';
|
|
|
|
}, function() {
|
|
AppUtils.connectionError.apply(AppUtils, arguments);
|
|
$location.path('/');
|
|
});
|
|
|
|
if ($routeParams.viewid != null) {
|
|
$scope.Mode = 'view';
|
|
viewid = $routeParams.viewid;
|
|
view_offset = 0;
|
|
|
|
FetchOutputLines();
|
|
}
|
|
|
|
if ($routeParams.backupid != null) {
|
|
AppService.get('/backup/' + $routeParams.backupid + '/export?argsonly=true&export-passwords=true').then(
|
|
function(resp) {
|
|
$scope.TargetURL = resp.data.Backend;
|
|
$scope.Arguments = resp.data.Arguments;
|
|
$scope.ExtendedOptions = resp.data.Options;
|
|
$scope.Command = 'backup';
|
|
},
|
|
function(resp) {
|
|
var message = AppService.responseErrorMessage(resp);
|
|
|
|
DialogService.dialog(gettextCatalog.getString('Error'), gettextCatalog.getString('Failed to connect: {{message}}', { message: message }));
|
|
}
|
|
);
|
|
}
|
|
});
|