Permalink
Switch branches/tags
bareos-12.4 bareos-13.2 bareos-14.2-debian bareos-14.2 bareos-15.2 bareos-16.2-droplet bareos-16.2 bareos-17.2 bareos-18.2 dev/bpoed/master/localization dev/fbergkemper/master/documentation dev/fbergkemper/master/test dev/franku/bareos-17.2.5/autochanger-empty-slot dev/franku/bareos-18.2/18.2.4-rc2 dev/franku/bareos-18.2/18.2.4-rc3 dev/franku/bareos-18.2/18.2.4-rc4 dev/franku/master/cleanup dev/franku/master/reserve-device dev/joergs/bareos-16.2-droplet/truncate-volumes dev/joergs/bareos-18.2/doc-aws dev/joergs/master/doc dev/joergs/master/selenium dev/maik/master/fd_plugins dev/maik/master/partioned_tables dev/pstorz/bareos-17.2/ndmp-native-multidrive dev/pstorz/bareos-17.2/test dev/pstorz/bareos-18.2/FreeBSD dev/pstorz/bareos-18.2/rc_fixup dev/pstorz/bareos-18.2/releasenotes dev/pstorz/bareos-18.2/sphinx-versioning dev/pstorz/bareos-18.2/test dev/pstorz/bareos-18.2/traymon-qt5 dev/pstorz/bareos-18.2/webui-8-fix dev/pstorz/bareos-18.2/webui-cmake dev/pstorz/debian-test dev/pstorz/master/authenticate-getreswithname-callback dev/pstorz/master/bug942 dev/pstorz/master/cdash-build-no-gitrev dev/pstorz/master/cmake-remove-include-directories dev/pstorz/master/d_msg-regex-on-filename-with-unittests dev/pstorz/master/documentation-merged dev/pstorz/master/documentation dev/pstorz/master/fix-create-queries dev/pstorz/master/format dev/pstorz/master/move_unittests_to_src_tests_directory dev/pstorz/master/one-pass-build dev/pstorz/master/regress-fixing dev/pstorz/master/sphinx-versioning dev/pstorz/master/split-two-way-authenticate dev/pstorz/master/test dev/pstorz/master/tls-bsock-unitttests dev/pstorz/master/tls-md5-handshake dev/pstorz/master/travis-run-regression dev/pstorz/master/windows-package-rename-remove-postvista master pstorz/bareos-17.2-boogie
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
576 lines (488 sloc) 16.8 KB
<?php
/**
*
* bareos-webui - Bareos Web-Frontend
*
* @link https://github.com/bareos/bareos-webui for the canonical source repository
* @copyright Copyright (c) 2013-2017 Bareos GmbH & Co. KG (http://www.bareos.org/)
* @license GNU Affero General Public License (http://www.gnu.org/licenses/)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace Restore\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\View\Model\JsonModel;
use Restore\Model\Restore;
use Restore\Form\RestoreForm;
class RestoreController extends AbstractActionController
{
/**
* Variables
*/
protected $restoreModel = null;
protected $jobModel = null;
protected $clientModel = null;
protected $filesetModel = null;
protected $bsock = null;
protected $restore_params = null;
protected $acl_alert = false;
private $directories = null;
private $files = null;
private $required_commands = array(
"llist",
".filesets",
".jobs",
"restore",
".bvfs_update",
".bvfs_get_jobids",
".bvfs_lsdirs",
".bvfs_lsfiles",
".bvfs_restore",
".bvfs_cleanup"
);
/**
* Index Action
*/
public function indexAction()
{
$this->RequestURIPlugin()->setRequestURI();
if(!$this->SessionTimeoutPlugin()->isValid()) {
return $this->redirect()->toRoute('auth', array('action' => 'login'), array('query' => array('req' => $this->RequestURIPlugin()->getRequestURI(), 'dird' => $_SESSION['bareos']['director'])));
}
if(!$this->CommandACLPlugin()->validate($_SESSION['bareos']['commands'], $this->required_commands)) {
$this->acl_alert = true;
return new ViewModel(
array(
'acl_alert' => $this->acl_alert,
'required_commands' => $this->required_commands,
)
);
}
$this->bsock = $this->getServiceLocator()->get('director');
$this->setRestoreParams();
$errors = null;
$result = null;
if($this->restore_params['client'] == null) {
try {
$clients = $this->getClientModel()->getClients($this->bsock);
$client = array_pop($clients);
$this->restore_params['client'] = $client['name'];
}
catch(Exception $e) {
echo $e->getMessage();
}
}
if($this->restore_params['type'] == "client" && $this->restore_params['jobid'] == null) {
try {
$latestbackup = $this->getClientModel()->getClientBackups($this->bsock, $this->restore_params['client'], "any", "desc", 1);
if(empty($latestbackup)) {
$this->restore_params['jobid'] = null;
}
else {
$this->restore_params['jobid'] = $latestbackup[0]['jobid'];
}
}
catch(Exception $e) {
echo $e->getMessage();
}
}
if(isset($this->restore_params['mergejobs']) && $this->restore_params['mergejobs'] == 1) {
$jobids = $this->restore_params['jobid'];
}
else {
try {
$jobids = $this->getRestoreModel()->getJobIds($this->bsock, $this->restore_params['jobid'], $this->restore_params['mergefilesets']);
$this->restore_params['jobids'] = $jobids;
}
catch(Exception $e) {
echo $e->getMessage();
}
}
if($this->restore_params['type'] == "client") {
try {
$backups = $this->getClientModel()->getClientBackups($this->bsock, $this->restore_params['client'], "any", "desc", null);
}
catch(Exception $e) {
echo $e->getMessage();
}
}
try {
//$jobs = $this->getJobModel()->getJobs();
$clients = $this->getClientModel()->getClients($this->bsock);
$filesets = $this->getFilesetModel()->getDotFilesets($this->bsock);
$restorejobs = $this->getJobModel()->getRestoreJobs($this->bsock);
}
catch(Exception $e) {
echo $e->getMessage();
}
if(empty($backups)) {
$errors = 'No backups of client <strong>'.$this->restore_params['client'].'</strong> found.';
}
// Create the form
$form = new RestoreForm(
$this->restore_params,
//$jobs,
$clients,
$filesets,
$restorejobs,
$jobids,
$backups
);
// Set the method attribute for the form
$form->setAttribute('method', 'post');
$form->setAttribute('onsubmit','return getFiles()');
$request = $this->getRequest();
if($request->isPost()) {
$restore = new Restore();
$form->setInputFilter($restore->getInputFilter());
$form->setData( $request->getPost() );
if($form->isValid()) {
if($this->restore_params['type'] == "client") {
$type = $this->restore_params['type'];
$jobid = $form->getInputFilter()->getValue('jobid');
$client = $form->getInputFilter()->getValue('client');
$restoreclient = $form->getInputFilter()->getValue('restoreclient');
$restorejob = $form->getInputFilter()->getValue('restorejob');
$where = $form->getInputFilter()->getValue('where');
$fileid = $form->getInputFilter()->getValue('checked_files');
$dirid = $form->getInputFilter()->getValue('checked_directories');
$jobids = $form->getInputFilter()->getValue('jobids_hidden');
$replace = $form->getInputFilter()->getValue('replace');
try {
$result = $this->getRestoreModel()->restore($this->bsock, $type, $jobid, $client, $restoreclient, $restorejob, $where, $fileid, $dirid, $jobids, $replace);
}
catch(Exception $e) {
echo $e->getMessage();
}
}
$this->bsock->disconnect();
return new ViewModel(array(
'restore_params' => $this->restore_params,
'form' => $form,
'result' => $result,
'errors' => $errors
));
}
else {
$this->bsock->disconnect();
return new ViewModel(array(
'restore_params' => $this->restore_params,
'form' => $form,
'result' => $result,
'errors' => $errors
));
}
}
else {
$this->bsock->disconnect();
return new ViewModel(array(
'restore_params' => $this->restore_params,
'form' => $form,
'result' => $result,
'errors' => $errors
));
}
}
/**
* Delivers a subtree as Json for JStree
*/
public function filebrowserAction()
{
$this->RequestURIPlugin()->setRequestURI();
if(!$this->SessionTimeoutPlugin()->isValid()) {
return $this->redirect()->toRoute('auth', array('action' => 'login'), array('query' => array('req' => $this->RequestURIPlugin()->getRequestURI(), 'dird' => $_SESSION['bareos']['director'])));
}
$this->setRestoreParams();
$this->layout('layout/json');
return new ViewModel(array(
'items' => $this->buildSubtree()
));
}
/**
* Get the directories
*/
private function getDirectories()
{
$this->directories = null;
try {
if($this->restore_params['type'] == "client") {
if(empty($this->restore_params['jobid'])) {
$this->restore_params['jobids'] = null;
}
else {
$jobids = $this->getRestoreModel()->getJobIds($this->bsock, $this->restore_params['jobid'],$this->restore_params['mergefilesets'],$this->restore_params['mergejobs']);
$this->restore_params['jobids'] = $jobids;
$this->directories = $this->getRestoreModel()->getDirectories($this->bsock, $this->restore_params['jobids'], $this->restore_params['id']);
}
}
else {
$this->directories = $this->getRestoreModel()->getDirectories($this->bsock, $this->restore_params['jobid'], $this->restore_params['id']);
}
}
catch(Exception $e) {
echo $e->getMessage();
}
}
/**
* Get the files
*/
private function getFiles()
{
$this->files = null;
try {
if($this->restore_params['type'] == "client") {
if(empty($this->restore_params['jobid'])) {
$this->restore_params['jobids'] = null;
}
else {
$jobids = $this->getRestoreModel()->getJobIds($this->bsock, $this->restore_params['jobid'],$this->restore_params['mergefilesets'],$this->restore_params['mergejobs']);
$this->restore_params['jobids'] = $jobids;
$this->files = $this->getRestoreModel()->getFiles($this->bsock, $this->restore_params['jobids'], $this->restore_params['id']);
}
}
else {
$this->files = $this->getRestoreModel()->getFiles($this->bsock, $this->restore_params['jobid'], $this->restore_params['id']);
}
}
catch(Exception $e) {
echo $e->getMessage();
}
}
/**
* Builds a subtree as Json for JStree
*/
private function buildSubtree()
{
$this->bsock = $this->getServiceLocator()->get('director');
$this->setRestoreParams();
$this->getDirectories();
$this->getFiles();
$dnum = count($this->directories);
$fnum = count($this->files);
$tmp = $dnum;
// Build Json for JStree
$items = '[';
if($dnum > 0) {
foreach($this->directories as $dir) {
if($dir['name'] == ".") {
--$dnum;
next($this->directories);
}
elseif($dir['name'] == "..") {
--$dnum;
next($this->directories);
}
else {
--$dnum;
$items .= '{';
$items .= '"id":"-' . $dir['pathid'] . '"';
$items .= ',"text":"' . preg_replace('/[\x00-\x1F\x7F]/', '', str_replace('"', '\"', $dir["name"])) . '"';
$items .= ',"icon":"glyphicon glyphicon-folder-close"';
$items .= ',"state":""';
$items .= ',"data":' . \Zend\Json\Json::encode($dir, \Zend\Json\Json::TYPE_OBJECT);
$items .= ',"children":true';
$items .= '}';
if($dnum > 0) {
$items .= ",";
}
}
}
if($fnum > 0) {
$items .= ",";
}
}
if($fnum > 0) {
foreach($this->files as $file) {
$items .= '{';
$items .= '"id":"' . $file["fileid"] . '"';
$items .= ',"text":"' . preg_replace('/[\x00-\x1F\x7F]/', '', str_replace('"', '\"', $file["name"])) . '"';
$items .= ',"icon":"glyphicon glyphicon-file"';
$items .= ',"state":""';
$items .= ',"data":' . \Zend\Json\Json::encode($file, \Zend\Json\Json::TYPE_OBJECT);
$items .= '}';
--$fnum;
if($fnum > 0) {
$items .= ",";
}
}
}
$items .= ']';
$this->bsock->disconnect();
return $items;
}
/**
* Set the restore parameters
*/
private function setRestoreParams()
{
if($this->params()->fromQuery('type')) {
$this->restore_params['type'] = $this->params()->fromQuery('type');
}
else {
$this->restore_params['type'] = 'client';
}
if($this->params()->fromQuery('jobid')) {
$this->restore_params['jobid'] = $this->params()->fromQuery('jobid');
}
else {
$this->restore_params['jobid'] = null;
}
if($this->params()->fromQuery('client')) {
$this->restore_params['client'] = $this->params()->fromQuery('client');
}
else {
$this->restore_params['client'] = null;
}
if($this->params()->fromQuery('restoreclient')) {
$this->restore_params['restoreclient'] = $this->params()->fromQuery('restoreclient');
}
else {
$this->restore_params['restoreclient'] = null;
}
if($this->params()->fromQuery('restorejob')) {
$this->restore_params['restorejob'] = $this->params()->fromQuery('restorejob');
}
else {
$this->restore_params['restorejob'] = null;
}
if($this->params()->fromQuery('fileset')) {
$this->restore_params['fileset'] = $this->params()->fromQuery('fileset');
}
else {
$this->restore_params['fileset'] = null;
}
if($this->params()->fromQuery('before')) {
$this->restore_params['before'] = $this->params()->fromQuery('before');
}
else {
$this->restore_params['before'] = null;
}
if($this->params()->fromQuery('where')) {
$this->restore_params['where'] = $this->params()->fromQuery('where');
}
else {
$this->restore_params['where'] = null;
}
if($this->params()->fromQuery('fileid')) {
$this->restore_params['fileid'] = $this->params()->fromQuery('fileid');
}
else {
$this->restore_params['fileid'] = null;
}
if($this->params()->fromQuery('dirid')) {
$this->restore_params['dirid'] = $this->params()->fromQuery('dirid');
}
else {
$this->restore_params['dirid'] = null;
}
if($this->params()->fromQuery('id')) {
$this->restore_params['id'] = $this->params()->fromQuery('id');
}
else {
$this->restore_params['id'] = null;
}
if($this->params()->fromQuery('limit')) {
$this->restore_params['limit'] = $this->params()->fromQuery('limit');
}
else {
$this->restore_params['limit'] = 2000;
}
if($this->params()->fromQuery('jobids')) {
$this->restore_params['jobids'] = $this->params()->fromQuery('jobids');
}
else {
$this->restore_params['jobids'] = null;
}
if($this->params()->fromQuery('mergefilesets')) {
$this->restore_params['mergefilesets'] = $this->params()->fromQuery('mergefilesets');
}
else {
$this->restore_params['mergefilesets'] = 0;
}
if($this->params()->fromQuery('mergejobs')) {
$this->restore_params['mergejobs'] = $this->params()->fromQuery('mergejobs');
}
else {
$this->restore_params['mergejobs'] = 0;
}
if($this->params()->fromQuery('replace')) {
$this->restore_params['replace'] = $this->params()->fromQuery('replace');
}
else {
$this->restore_params['replace'] = null;
}
if($this->params()->fromQuery('replaceoptions')) {
$this->restore_params['replaceoptions'] = $this->params()->fromQuery('replaceoptions');
}
else {
$this->restore_params['replaceoptions'] = null;
}
if($this->params()->fromQuery('versions')) {
$this->restore_params['versions'] = $this->params()->fromQuery('versions');
}
else {
$this->restore_params['versions'] = null;
}
}
/**
* Get the restore model
* @return object
*/
public function getRestoreModel()
{
if(!$this->restoreModel) {
$sm = $this->getServiceLocator();
$this->restoreModel = $sm->get('Restore\Model\RestoreModel');
}
return $this->restoreModel;
}
/**
* Get the job model
* @return object
*/
public function getJobModel()
{
if(!$this->jobModel) {
$sm = $this->getServiceLocator();
$this->jobModel = $sm->get('Job\Model\JobModel');
}
return $this->jobModel;
}
/**
* Get the client model
* @return object
*/
public function getClientModel()
{
if(!$this->clientModel) {
$sm = $this->getServiceLocator();
$this->clientModel = $sm->get('CLient\Model\ClientModel');
}
return $this->clientModel;
}
/**
* Get the fileset model
* @return object
*/
public function getFilesetModel()
{
if(!$this->filesetModel) {
$sm = $this->getServiceLocator();
$this->filesetModel = $sm->get('Fileset\Model\FilesetModel');
}
return $this->filesetModel;
}
}