vesta/web/file_manager/fm_core.php
2016-08-25 19:33:06 +03:00

374 lines
10 KiB
PHP

<?php
class FileManager {
protected $delimeter = '|';
protected $info_positions = array(
'TYPE' => 0,
'PERMISSIONS' => 1,
'DATE' => 2,
'TIME' => 3,
'OWNER' => 4,
'GROUP' => 5,
'SIZE' => 6,
'NAME' => 7
);
protected $user = null;
public $ROOT_DIR = null;
public function setRootDir($root = null) {
if (null != $root) {
$root = realpath($root);
}
$this->ROOT_DIR = $root;
}
public function __construct($user) {
$this->user = $user;
}
public function checkFileType($dir) {
$dir = $this->formatFullPath($dir);
exec(VESTA_CMD . "v-get-fs-file-type {$this->user} {$dir}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true,
'data' => implode('', $output)
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
public function formatFullPath($path_part = '') {
if (substr($path_part, 0, strlen($this->ROOT_DIR)) === $this->ROOT_DIR) {
$path = $path_part;
}
else {
$path = $this->ROOT_DIR . '/' . $path_part;
}
//var_dump($path);die();
//$path = str_replace(' ', '\ ', $path);
return escapeshellarg($path);
}
function deleteItem($dir, $item) {
$dir = $this->formatFullPath($item);
exec (VESTA_CMD . "v-delete-fs-directory {$this->user} {$dir}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
function copyFile($item, $dir, $target_dir, $filename) {
$src = $this->formatFullPath($item);
$dst = $this->formatFullPath($target_dir);
exec (VESTA_CMD . "v-copy-fs-file {$this->user} {$src} {$dst}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
function copyDirectory($item, $dir, $target_dir, $filename) {
$src = $this->formatFullPath($item);
$dst = $this->formatFullPath($target_dir);
exec (VESTA_CMD . "v-copy-fs-directory {$this->user} {$src} {$dst}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
static function check_return_code($return_var, $output) {
if ($return_var != 0) {
$error = implode('<br>', $output);
return $error;
}
return null;
}
function createFile($dir, $filename) {
$dir = $this->formatFullPath($dir . '/' . $filename);
exec (VESTA_CMD . "v-add-fs-file {$this->user} {$dir}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
function packItem($items, $dst_item) {
$items_arr = explode(',', $items);
foreach($items_arr as $key => $item){
$items_arr[$key] = $this->formatFullPath($item);
}
$items = implode(' ', $items_arr);
$dst_item = $this->formatFullPath($dst_item);
exec (VESTA_CMD . "v-add-fs-archive {$this->user} {$dst_item} {$items}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
function backupItem($item) {
$src_item = $this->formatFullPath($item);
$dst_item_name = $item . '~' . date('Ymd_His');
$dst_item = $this->formatFullPath($dst_item_name);
exec (VESTA_CMD . "v-copy-fs-file {$this->user} {$src_item} {$dst_item}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true,
'filename' => $dst_item_name
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
function unpackItem($item, $dir, $target_dir, $filename) {
$item = $this->formatFullPath($item);
$dst_item = $this->formatFullPath($target_dir);
exec (VESTA_CMD . "v-extract-fs-archive {$this->user} {$item} {$dst_item}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
function renameFile($item, $target_name) {
$item = $this->formatFullPath($item);
$dst_item = $this->formatFullPath($target_name);
exec (VESTA_CMD . "v-move-fs-file {$this->user} {$item} {$dst_item}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
function renameDirectory($item, $target_name) {
$item = $this->formatFullPath($item);
$dst_item = $this->formatFullPath($target_name);
if ($item == $dst_item) {
return array(
'result' => true
);
}
exec (VESTA_CMD . "v-move-fs-directory {$this->user} {$item} {$dst_item}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
function createDir($dir, $dirname) {
$dir = $this->formatFullPath($dir . '/' . $dirname);
exec (VESTA_CMD . "v-add-fs-directory {$this->user} {$dir}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
function chmodItem($dir, $item, $permissions) {
$item = $this->formatFullPath($dir . $item);
$permissions = escapeshellarg($permissions);
exec (VESTA_CMD . "v-change-fs-file-permission {$this->user} {$item} {$permissions}", $output, $return_var);
$error = self::check_return_code($return_var, $output);
if (empty($error)) {
return array(
'result' => true
);
}
else {
return array(
'result' => false,
'message' => $error
);
}
}
function getDirectoryListing($dir = '') {
$dir = $this->formatFullPath($dir);
exec (VESTA_CMD . "v-list-fs-directory {$this->user} {$dir}", $output, $return_var);
return $this->parseListing($output);
}
public function ls($dir = '') {
$listing = $this->getDirectoryListing($dir);
return $data = array(
'result' => true,
'listing' => $listing
);
}
public function open_file($dir = '') {
$listing = $this->getDirectoryListing($dir);
return $data = array(
'result' => true,
'listing' => $listing
);
}
public function parseListing($raw) {
$data = array();
foreach ($raw as $o) {
$info = explode($this->delimeter, $o);
$data[] = array(
'type' => $info[$this->info_positions['TYPE']],
'permissions' => str_pad($info[$this->info_positions['PERMISSIONS']], 3, "0", STR_PAD_LEFT),
'date' => $info[$this->info_positions['DATE']],
'time' => $info[$this->info_positions['TIME']],
'owner' => $info[$this->info_positions['OWNER']],
'group' => $info[$this->info_positions['GROUP']],
'size' => $info[$this->info_positions['SIZE']],
'name' => htmlspecialchars($info[$this->info_positions['NAME']], ENT_QUOTES)
);
}
return $data;
}
}