318 lines
8.3 KiB
PHP
318 lines
8.3 KiB
PHP
<?php
|
|
/**
|
|
* @package Campcaster
|
|
* @subpackage htmlUI
|
|
|
|
*/
|
|
class uiExchange
|
|
{
|
|
private $Base;
|
|
private $file;
|
|
private $folder;
|
|
|
|
public function __construct(&$uiBase)
|
|
{
|
|
$this->Base =& $uiBase;
|
|
$this->file =& $_SESSION['EXCHANGE']['file'];
|
|
$this->folder =& $_SESSION['EXCHANGE']['folder'];
|
|
if (empty($this->folder)) {
|
|
$this->folder = '/tmp';
|
|
}
|
|
}
|
|
|
|
// GB wrapper methods
|
|
|
|
function getBackupToken()
|
|
{
|
|
$token = $this->Base->gb->loadPref($this->Base->sessid, UI_BACKUPTOKEN_KEY);
|
|
|
|
if (PEAR::isError($token)) {
|
|
return false;
|
|
}
|
|
return $token;
|
|
}
|
|
|
|
|
|
function createBackupOpen()
|
|
{
|
|
$criteria = array('filetype' => UI_FILETYPE_ANY);
|
|
$token = $this->Base->gb->createBackupOpen($this->Base->sessid, $criteria);
|
|
if (PEAR::isError($token)) {
|
|
$this->Base->_retMsg('Error initializing backup: $1', $token->getMessage());
|
|
return false;
|
|
}
|
|
$this->createBackupCheck();
|
|
$this->Base->gb->savePref($this->Base->sessid, UI_BACKUPTOKEN_KEY, $token['token']);
|
|
return true;
|
|
}
|
|
|
|
|
|
function createBackupCheck()
|
|
{
|
|
$token = $this->getBackupToken();
|
|
if ($token === false) {
|
|
return false;
|
|
}
|
|
$res = $this->Base->gb->createBackupCheck($token);
|
|
if (PEAR::isError($res)) {
|
|
$this->Base->_retMsg('Unable to check backup status: $1', $res->getMessage());
|
|
return false;
|
|
}
|
|
return $res;
|
|
}
|
|
|
|
|
|
// Download the backup
|
|
|
|
function createBackupDownload()
|
|
{
|
|
$check = $this->createBackupCheck();
|
|
header('Content-Length: '.filesize($check['tmpfile']));
|
|
header("Content-Transfer-Encoding: binary");
|
|
$newname='backup_'.date("Ymd", filectime($check['tmpfile'])).'.tar';
|
|
header('Content-Disposition: attachment; filename="'.$newname.'"');
|
|
readfile($check['tmpfile']);
|
|
}
|
|
|
|
|
|
function createBackupClose()
|
|
{
|
|
$token = $this->getBackupToken();
|
|
|
|
if ($token === false) {
|
|
$this->Base->_retMsg('Token not available');
|
|
return false;
|
|
}
|
|
$status = $this->Base->gb->createBackupClose($token);
|
|
if (PEAR::isError($status)) {
|
|
$this->Base->_retMsg('Error closing backup: $1', $status->getMessage());
|
|
return false;
|
|
}
|
|
if ($status === true) {
|
|
$this->Base->gb->delPref($this->Base->sessid, UI_BACKUPTOKEN_KEY);
|
|
}
|
|
return $status;
|
|
}
|
|
|
|
|
|
// backup schduler methods
|
|
/**
|
|
* @return array
|
|
*/
|
|
function getScheduleBackupForm()
|
|
{
|
|
include('formmask/exchange.inc.php');
|
|
$form = new HTML_QuickForm('BACKUP_Schedule', UI_STANDARD_FORM_METHOD, UI_HANDLER);
|
|
uiBase::parseArrayToForm($form, $mask['BACKUP.schedule']);
|
|
$renderer = new HTML_QuickForm_Renderer_Array(true, true);
|
|
$form->accept($renderer);
|
|
return $renderer->toArray();
|
|
}
|
|
|
|
|
|
/**
|
|
* Copy a file or directory.
|
|
*
|
|
* @param string $target
|
|
* path to file or directory
|
|
* @return boolean
|
|
*/
|
|
function copy2target($target)
|
|
{
|
|
if (is_dir($target)) {
|
|
$this->folder = $target;
|
|
} else {
|
|
$pathinfo = pathinfo($target);
|
|
$this->folder = $pathinfo['dirname'];
|
|
$this->file = $pathinfo['basename'];
|
|
}
|
|
|
|
$this->completeTarget();
|
|
$target = $this->folder.'/'.$this->file;
|
|
|
|
if ($this->checkTarget() !== true) {
|
|
$this->Base->_retMsg('$1: open: permission denied', $target);
|
|
return false;
|
|
}
|
|
|
|
$check = $this->createBackupCheck();
|
|
|
|
if ($check['status'] === 'success') {
|
|
if (@copy($check['tmpfile'], $target)) {
|
|
@chmod($target,0666);
|
|
$this->Base->_retMsg('Copy backup to $1 successfull', $target);
|
|
return true;
|
|
}
|
|
$this->Base->_retMsg('Unable to copy backup from $1 to $2', $check['tmpfile'], $target);
|
|
return false;
|
|
}
|
|
$this->Base->_retMsg('Backup status is $1, not ready', $check['status']);
|
|
return false;
|
|
}
|
|
|
|
// Restore methods
|
|
function getRestoreToken()
|
|
{
|
|
$token = $this->Base->gb->loadPref($this->Base->sessid, UI_RESTORETOKEN_KEY);
|
|
if (PEAR::isError($token)) {
|
|
return false;
|
|
}
|
|
return $token;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param unknown_type $backupFile
|
|
* @return boolean
|
|
*/
|
|
function backupRestoreOpen($backupFile)
|
|
{
|
|
$token = $this->Base->gb->backupRestoreOpen($this->Base->sessid,$backupFile);
|
|
if (PEAR::isError($token)) {
|
|
$this->Base->_retMsg('Error initializing backup restore: $1', $token->getMessage());
|
|
return false;
|
|
}
|
|
#$this->backupRestoreCheck(); //?
|
|
$this->Base->gb->savePref($this->Base->sessid, UI_RESTORETOKEN_KEY, $token['token']);
|
|
return true;
|
|
}
|
|
|
|
|
|
function backupRestoreCheck()
|
|
{
|
|
$token = $this->getRestoreToken();
|
|
if ($token === false) {
|
|
return false;
|
|
}
|
|
$res = $this->Base->gb->backupRestoreCheck($token);
|
|
if (PEAR::isError($res)) {
|
|
$this->Base->_retMsg('Unable to check backup restore status: $1', $res->getMessage());
|
|
return false;
|
|
}
|
|
return $res;
|
|
}
|
|
|
|
|
|
function backupRestoreClose()
|
|
{
|
|
$token = $this->getRestoreToken();
|
|
if ($token === false) {
|
|
$this->Base->_retMsg('Backup restore token is not available');
|
|
return false;
|
|
}
|
|
$status = $this->Base->gb->backupRestoreClose($token);
|
|
if (PEAR::isError($status)) {
|
|
$this->Base->_retMsg('Error closing restore backup: $1', $status->getMessage());
|
|
return false;
|
|
}
|
|
if ($status === true) {
|
|
$this->Base->gb->delPref($this->Base->sessid, UI_RESTORETOKEN_KEY);
|
|
}
|
|
return $status;
|
|
}
|
|
|
|
// file browser methods
|
|
|
|
function setFolder($subfolder)
|
|
{
|
|
$this->file = false;
|
|
$newfolder = realpath($this->folder.'/'.$subfolder);
|
|
|
|
if (!is_dir($newfolder)) {
|
|
# F5 pressed
|
|
return false;
|
|
}
|
|
|
|
if (!is_executable($newfolder)) {
|
|
$this->errorMsg = tra('$1: cd: permission denied', $newfolder);
|
|
return false;
|
|
}
|
|
|
|
$this->folder = $newfolder;
|
|
}
|
|
|
|
|
|
function setFile($file)
|
|
{
|
|
if (is_writable($this->folder.'/'.$file)) {
|
|
$this->file = $file;
|
|
|
|
return true;
|
|
}
|
|
$this->file = false;
|
|
$this->errorMsg = tra('$1: open: permission denied', $file);
|
|
|
|
return false;
|
|
}
|
|
|
|
function getPath()
|
|
{
|
|
$path = $this->folder.'/'.$this->file;
|
|
|
|
if (is_dir($this->folder)) {
|
|
return str_replace('//', '/', $path);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function checkTarget()
|
|
{
|
|
if (!is_writable($this->folder.'/'.$this->file) && !is_writable($this->folder)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
function completeTarget()
|
|
{
|
|
if (!$this->file) {
|
|
$this->file = 'ls-backup_'.date('Y-m-d');
|
|
}
|
|
}
|
|
|
|
|
|
function listFolder()
|
|
{
|
|
if (!is_readable($this->folder)) {
|
|
$this->errorMsg = tra('$1: ls: permission denied', $this->folder);
|
|
return array('subdirs' => array('..' => array()), 'files' => array());
|
|
}
|
|
|
|
$d = dir($this->folder);
|
|
|
|
while (false !== ($entry = $d->read())) {
|
|
$loc = $this->folder.'/'.$entry;
|
|
|
|
if (is_dir($loc)) {
|
|
$dirs[$entry] = $this->_getFileProperty($loc);
|
|
} else {
|
|
$files[$entry] = $this->_getFileProperty($loc);
|
|
}
|
|
|
|
}
|
|
|
|
@ksort($dirs);
|
|
@ksort($files);
|
|
|
|
return array('subdirs' => $dirs, 'files' => $files);
|
|
}
|
|
|
|
function _getFileProperty($loc)
|
|
{
|
|
$uarr = posix_getpwuid(fileowner($loc));
|
|
$user = $uarr['name'];
|
|
$grarr = posix_getgrgid(filegroup($loc));
|
|
$group = $grarr['name'];
|
|
return array(
|
|
'r' => is_readable($loc),
|
|
'w' => is_writable($loc),
|
|
'x' => is_executable($loc),
|
|
'u' => $user,
|
|
'g' => $group,
|
|
);
|
|
|
|
}
|
|
}
|
|
?>
|