diff --git a/src/views/backups.html b/src/views/backups.html
index de0587150..5181390af 100644
--- a/src/views/backups.html
+++ b/src/views/backups.html
@@ -15,6 +15,39 @@
+
+
+
+
+
Schedule and Retention
+
+
+
+
Cloudron makes a complete backup of your system based on this scheduled interval and keeps backups with the specified retention policy.
+
+
+ Interval
+
+
+ {{ prettyBackupInterval(backupConfig.intervalSecs) }}
+
+
+
+
+ Retention Policy
+
+
+ {{ prettyBackupRetentionPolicy(backupConfig.retentionPolicy) }}
+
+
+
+
+
+
Listing
diff --git a/src/views/backups.js b/src/views/backups.js
index c0fd1f235..661f7cf03 100644
--- a/src/views/backups.js
+++ b/src/views/backups.js
@@ -123,6 +123,16 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat
}
};
+ $scope.prettyBackupInterval = function (interval) {
+ var tmp = $scope.intervalTimes.find(function (i) { return i.value === interval; });
+ return tmp ? tmp.name : '';
+ };
+
+ $scope.prettyBackupRetentionPolicy = function (retentionPolicy) {
+ var tmp = $scope.retentionPolicies.find(function (p) { return angular.equals(p.value, retentionPolicy); });
+ return tmp ? tmp.name : '';
+ };
+
$scope.createBackup = {
busy: false,
percent: 0,
@@ -262,6 +272,53 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat
download('cloudron_backup.json', JSON.stringify(tmp));
};
+ $scope.configureScheduleAndRetention = {
+ busy: false,
+ error: {},
+
+ retentionPolicy: $scope.retentionPolicies[0],
+ intervalSecs: 24 * 60 * 60,
+
+ show: function () {
+ $scope.configureScheduleAndRetention.error = {};
+ $scope.configureScheduleAndRetention.busy = false;
+ $scope.configureScheduleAndRetention.retentionPolicy = $scope.retentionPolicies.find(function (x) { return angular.equals(x.value, $scope.backupConfig.retentionPolicy); }).value;
+ $scope.configureScheduleAndRetention.intervalSecs = $scope.backupConfig.intervalSecs;
+
+ $('#configureScheduleAndRetentionModal').modal('show');
+ },
+
+ submit: function () {
+ $scope.configureScheduleAndRetention.error = {};
+ $scope.configureScheduleAndRetention.busy = true;
+
+ // start with the full backupConfig since the api requires all fields
+ var backupConfig = $scope.backupConfig;
+ backupConfig.retentionPolicy = $scope.configureScheduleAndRetention.retentionPolicy;
+ backupConfig.intervalSecs = $scope.configureScheduleAndRetention.intervalSecs;
+
+ Client.setBackupConfig(backupConfig, function (error) {
+ $scope.configureScheduleAndRetention.busy = false;
+
+ if (error) {
+ if (error.statusCode === 424) {
+ $scope.configureScheduleAndRetention.error.generic = error.message;
+ } else if (error.statusCode === 400) {
+ $scope.configureScheduleAndRetention.error.generic = error.message;
+ } else {
+ console.error('Unable to change schedule or retention.', error);
+ }
+
+ return;
+ }
+
+ $('#configureScheduleAndRetentionModal').modal('hide');
+
+ getBackupConfig();
+ });
+ }
+ };
+
$scope.configureBackup = {
busy: false,
error: {},
@@ -275,8 +332,6 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat
region: '',
endpoint: '',
backupFolder: '',
- retentionPolicy: $scope.retentionPolicies[0],
- intervalSecs: 24 * 60 * 60,
acceptSelfSignedCerts: false,
useHardlinks: true,
externalDisk: false,
@@ -319,8 +374,6 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat
$scope.configureBackup.endpoint = $scope.backupConfig.endpoint;
$scope.configureBackup.password = $scope.backupConfig.password;
$scope.configureBackup.backupFolder = $scope.backupConfig.backupFolder;
- $scope.configureBackup.retentionPolicy = $scope.retentionPolicies.find(function (x) { return angular.equals(x.value, $scope.backupConfig.retentionPolicy); }).value;
- $scope.configureBackup.intervalSecs = $scope.backupConfig.intervalSecs;
$scope.configureBackup.format = $scope.backupConfig.format;
$scope.configureBackup.acceptSelfSignedCerts = !!$scope.backupConfig.acceptSelfSignedCerts;
$scope.configureBackup.useHardlinks = !$scope.backupConfig.noHardlinks;
@@ -335,9 +388,10 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat
var backupConfig = {
provider: $scope.configureBackup.provider,
- retentionPolicy: $scope.configureBackup.retentionPolicy,
- intervalSecs: $scope.configureBackup.intervalSecs,
- format: $scope.configureBackup.format
+ format: $scope.configureBackup.format,
+ // required for api call to provide all fields
+ intervalSecs: $scope.backupConfig.intervalSecs,
+ retentionPolicy: $scope.backupConfig.retentionPolicy
};
if ($scope.configureBackup.password) backupConfig.password = $scope.configureBackup.password;