diff options
Diffstat (limited to 'modules-available/backup/page.inc.php')
-rw-r--r-- | modules-available/backup/page.inc.php | 94 |
1 files changed, 77 insertions, 17 deletions
diff --git a/modules-available/backup/page.inc.php b/modules-available/backup/page.inc.php index 1d69ddd3..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']; @@ -126,7 +168,7 @@ class Page_Backup extends Page } // Wait a bit $task = Taskmanager::submit('SleepTask', array( - 'seconds' => 3, + 'seconds' => 6, 'parentTask' => $parent, 'failOnParentFail' => false )); @@ -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'); } } |