summaryrefslogtreecommitdiffstats
path: root/modules-available/backup/page.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/backup/page.inc.php')
-rw-r--r--modules-available/backup/page.inc.php92
1 files changed, 76 insertions, 16 deletions
diff --git a/modules-available/backup/page.inc.php b/modules-available/backup/page.inc.php
index c6aa09ae..9a2d08be 100644
--- a/modules-available/backup/page.inc.php
+++ b/modules-available/backup/page.inc.php
@@ -3,9 +3,8 @@
class Page_Backup extends Page
{
- const LAST_BACKUP_PROP = 'backup.last-time';
-
- private $action = false;
+ /** @var ?string */
+ private $action = null;
private $templateData = array();
protected function doPreprocess()
@@ -22,6 +21,9 @@ class Page_Backup extends Page
} elseif ($this->action === 'restore') {
User::assertPermission("restore");
$this->restore();
+ } elseif ($this->action === 'config') {
+ User::assertPermission("config");
+ $this->config();
}
User::assertPermission('*');
}
@@ -30,30 +32,49 @@ class Page_Backup extends Page
{
if ($this->action === 'restore') { // TODO: We're in post mode, redirect with all the taskids first...
Render::addTemplate('restore', $this->templateData);
+ } elseif (($taskid = Request::get('errtaskid', false, 'string')) !== false) {
+ Render::addTemplate('task-error', ['taskid' => $taskid]);
} else {
- $lastBackup = (int)Property::get(self::LAST_BACKUP_PROP, 0);
+ // Normal page
+ $title = Property::get('page-title-prefix', '');
+ $bgcolor = Property::get('logo-background', '');
+ $lastBackup = (int)Property::get(BackupRestore::PROP_LAST_BACKUP, 0);
if ($lastBackup === 0) {
$lastBackup = false;
} else {
$lastBackup = date('d.m.Y', $lastBackup);
}
- $params = ['last_backup' => $lastBackup];
- Permission::addGlobalTags($params['perms'], NULL, ['create', 'restore']);
+ $params = [
+ 'id_color' => $bgcolor,
+ 'id_prefix' => $title,
+ 'last_backup' => $lastBackup,
+ 'backup_' . Property::get(BackupRestore::PROP_AUTO_BACKUP_MODE, BackupRestore::BACKUP_MODE_OFF)
+ . '_checked' => 'checked',
+ 'autoBackupPw' => Property::get(BackupRestore::PROP_AUTO_BACKUP_PASS, ''),
+ ];
+ Permission::addGlobalTags($params['perms'], NULL, ['create', 'restore', 'config']);
Render::addTemplate('_page', $params);
}
}
private function backup()
{
- $task = Taskmanager::submit('BackupRestore', array('mode' => 'backup'));
+ $password = trim(Request::post('passwd', '', 'string'));
+ if (empty($password)) {
+ $password = null;
+ }
+ EventLog::info('Creating backup on ' . Property::getServerIp());
+ $task = Taskmanager::submit('BackupRestore', [
+ 'mode' => 'backup',
+ 'password' => $password,
+ ]);
if (!isset($task['id'])) {
Message::addError('backup-failed');
Util::redirect('?do=Backup');
}
- $task = Taskmanager::waitComplete($task, 30000);
+ $task = Taskmanager::waitComplete($task, 60000);
if (!Taskmanager::isFinished($task) || !isset($task['data']['backupFile'])) {
- Taskmanager::addErrorMessage($task);
- Util::redirect('?do=Backup');
+ Util::redirect('?do=backup&errtaskid=' . $task['id']);
}
while ((@ob_get_level()) > 0)
@ob_end_clean();
@@ -62,8 +83,12 @@ class Page_Backup extends Page
Message::addError('main.error-read', $task['data']['backupFile']);
Util::redirect('?do=Backup');
}
+ $userFn = 'satellite-backup_' . Property::getServerIp() . '_' . date('Y.m.d-H.i.s') . '.tgz';
+ if ($password !== null) {
+ $userFn .= '.aes';
+ }
Header('Content-Type: application/octet-stream', true);
- Header('Content-Disposition: attachment; filename=' . 'satellite-backup_' . Property::getServerIp() . '_' . date('Y.m.d-H.i.s') . '.tgz');
+ Header('Content-Disposition: attachment; filename=' . $userFn);
Header('Content-Length: ' . @filesize($task['data']['backupFile']));
while (!feof($fh)) {
$data = fread($fh, 16000);
@@ -77,7 +102,7 @@ class Page_Backup extends Page
}
@fclose($fh);
@unlink($task['data']['backupFile']);
- Property::set(self::LAST_BACKUP_PROP, time());
+ Property::set(BackupRestore::PROP_LAST_BACKUP, time());
die();
}
@@ -91,11 +116,28 @@ class Page_Backup extends Page
Message::addError('upload-failed', Util::uploadErrorString($_FILES['backupfile']['error']));
Util::redirect('?do=Backup');
}
+ $password = trim(Request::post('passwd', '', 'string'));
+ if (empty($password)) {
+ $password = null;
+ }
$tempfile = '/tmp/bwlp-' . mt_rand(1, 100000) . '-' . crc32($_SERVER['REMOTE_ADDR']) . '.tgz';
if (!move_uploaded_file($_FILES['backupfile']['tmp_name'], $tempfile)) {
Message::addError('main.error-write', $tempfile);
Util::redirect('?do=Backup');
}
+ copy($tempfile, $tempfile . '2');
+ // Check if correct password first etc.
+ $task = Taskmanager::submit('BackupRestore', [
+ 'mode' => 'test',
+ 'password' => $password,
+ 'backupFile' => $tempfile . '2',
+ ]);
+ $task = Taskmanager::waitComplete($task, 5000);
+ @unlink($tempfile . '2');
+ if (Taskmanager::isFailed($task)) {
+ @unlink($tempfile);
+ Util::redirect('?do=backup&errtaskid=' . $task['id']);
+ }
// Got uploaded file, now shut down all the daemons etc.
$parent = Trigger::stopDaemons(null, $this->templateData);
// Unmount store
@@ -109,16 +151,16 @@ class Page_Backup extends Page
$this->templateData['mountid'] = $task['id'];
$parent = $task['id'];
}
- EventLog::info('Creating backup on ' . Property::getServerIp());
// Finally run restore
- $task = Taskmanager::submit('BackupRestore', array(
+ $task = Taskmanager::submit('BackupRestore', [
'mode' => 'restore',
+ 'password' => $password,
'backupFile' => $tempfile,
'parentTask' => $parent,
'failOnParentFail' => false,
'restoreOpenslx' => Request::post('restore_openslx', 'off') === 'on',
'restoreDozmod' => Request::post('restore_dozmod', 'off') === 'on',
- ));
+ ]);
if (isset($task['id'])) {
$this->templateData['restoreid'] = $task['id'];
$parent = $task['id'];
@@ -139,8 +181,26 @@ class Page_Backup extends Page
));
// Leave this comment so the i18n scanner finds it:
// Message::addSuccess('restore-done');
- if (isset($task['id']))
+ if (isset($task['id'])) {
$this->templateData['rebootid'] = $task['id'];
+ }
+ }
+
+ private function config()
+ {
+ $password = trim(Request::post('passwd', '', 'string'));
+ if (empty($password)) {
+ $password = null;
+ }
+ $mode = Request::post('auto-backup-mode', false, 'string');
+ if ($mode !== BackupRestore::BACKUP_MODE_OFF && $mode !== BackupRestore::BACKUP_MODE_ROOTHOME
+ && $mode !== BackupRestore::BACKUP_MODE_VMSTORE) {
+ Message::addError('invalid-auto-backup-mode', $mode);
+ Util::redirect('?do=backup');
+ }
+ Property::set(BackupRestore::PROP_AUTO_BACKUP_MODE, $mode);
+ Property::set(BackupRestore::PROP_AUTO_BACKUP_PASS, $password);
+ Util::redirect('?do=backup');
}
}