fm_core.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <?php
  2. class FileManager {
  3. protected $delimeter = '|';
  4. protected $info_positions = array(
  5. 'TYPE' => 0,
  6. 'PERMISSIONS' => 1,
  7. 'DATE' => 2,
  8. 'TIME' => 3,
  9. 'OWNER' => 4,
  10. 'GROUP' => 5,
  11. 'SIZE' => 6,
  12. 'NAME' => 7
  13. );
  14. protected $user = null;
  15. public $ROOT_DIR = null;
  16. public function setRootDir($root = null) {
  17. if (null != $root) {
  18. $root = realpath($root);
  19. }
  20. $this->ROOT_DIR = $root;
  21. }
  22. public function __construct($user) {
  23. $this->user = $user;
  24. }
  25. /*public function init() {
  26. $path = !empty($_REQUEST['dir']) ? $_REQUEST['dir'] : '';
  27. $start_url = !empty($path) ? $this->ROOT_DIR . '/' . $path : $this->ROOT_DIR;
  28. $listing = $this->getDirectoryListing($path);
  29. return $data = array(
  30. 'result' => true,
  31. 'ROOT_DIR' => $this->ROOT_DIR,
  32. 'TAB_A_PATH' => $start_url,
  33. 'TAB_B_PATH' => $this->ROOT_DIR, // second tab always loads home dir
  34. 'listing' => $listing
  35. );
  36. }*/
  37. public function checkFileType($dir) {
  38. $dir = $this->formatFullPath($dir);
  39. exec(VESTA_CMD . "v-delete-fs-file {$this->user} {$dir}", $output, $return_var);
  40. $error = self::check_return_code($return_var, $output);
  41. if (empty($error)) {
  42. return array(
  43. 'result' => true
  44. );
  45. }
  46. else {
  47. return array(
  48. 'result' => false,
  49. 'message' => $error
  50. );
  51. }
  52. }
  53. public function formatFullPath($path_part = '') {
  54. if (substr($path_part, 0, strlen($this->ROOT_DIR)) === $this->ROOT_DIR) {
  55. $path = $path_part;
  56. }
  57. else {
  58. $path = $this->ROOT_DIR . '/' . $path_part;
  59. }
  60. //var_dump($path);die();
  61. //$path = str_replace(' ', '\ ', $path);
  62. return escapeshellarg($path);
  63. }
  64. function deleteItem($dir, $item) {
  65. $dir = $this->formatFullPath($item);
  66. if (is_dir($item)) {
  67. exec (VESTA_CMD . "v-delete-fs-directory {$this->user} {$dir}", $output, $return_var);
  68. }
  69. else {
  70. exec (VESTA_CMD . "v-delete-fs-file {$this->user} {$dir}", $output, $return_var);
  71. }
  72. $error = self::check_return_code($return_var, $output);
  73. if (empty($error)) {
  74. return array(
  75. 'result' => true
  76. );
  77. }
  78. else {
  79. return array(
  80. 'result' => false,
  81. 'message' => $error
  82. );
  83. }
  84. /*if (is_readable($item)) {
  85. unlink($item);
  86. }
  87. if (is_readable($item)) {
  88. return array(
  89. 'result' => false,
  90. 'message' => 'item was not deleted'
  91. );
  92. }
  93. return array(
  94. 'result' => true
  95. );*/
  96. }
  97. function copyFile($item, $dir, $target_dir, $filename) {
  98. $src = $this->formatFullPath($item);
  99. $dst = $this->formatFullPath($target_dir);
  100. exec (VESTA_CMD . "v-copy-fs-file {$this->user} {$src} {$dst}", $output, $return_var);
  101. $error = self::check_return_code($return_var, $output);
  102. if (empty($error)) {
  103. return array(
  104. 'result' => true
  105. );
  106. }
  107. else {
  108. return array(
  109. 'result' => false,
  110. 'message' => $error
  111. );
  112. }
  113. }
  114. function copyDirectory($item, $dir, $target_dir, $filename) {
  115. $src = $this->formatFullPath($item);
  116. $dst = $this->formatFullPath($target_dir);
  117. exec (VESTA_CMD . "v-copy-fs-directory {$this->user} {$src} {$dst}", $output, $return_var);
  118. $error = self::check_return_code($return_var, $output);
  119. if (empty($error)) {
  120. return array(
  121. 'result' => true
  122. );
  123. }
  124. else {
  125. return array(
  126. 'result' => false,
  127. 'message' => $error
  128. );
  129. }
  130. }
  131. static function check_return_code($return_var, $output) {
  132. if ($return_var != 0) {
  133. $error = implode('<br>', $output);
  134. return $error;
  135. //if (empty($error)) $error = __('Error code:',$return_var);
  136. //$_SESSION['error_msg'] = $error;
  137. }
  138. return null;
  139. }
  140. function createFile($dir, $filename) {
  141. $dir = $this->formatFullPath($dir . '/' . $filename);
  142. exec (VESTA_CMD . "v-add-fs-file {$this->user} {$dir}", $output, $return_var);
  143. $error = self::check_return_code($return_var, $output);
  144. if (empty($error)) {
  145. return array(
  146. 'result' => true
  147. );
  148. }
  149. else {
  150. return array(
  151. 'result' => false,
  152. 'message' => $error
  153. );
  154. }
  155. }
  156. function packItem($item, $dir, $target_dir, $filename) {
  157. $item = $this->formatFullPath($item);
  158. $dst_item = $this->formatFullPath($target_dir);
  159. //print VESTA_CMD . "v-add-fs-archive {$this->user} {$item} {$dst_item}";die();
  160. exec (VESTA_CMD . "v-add-fs-archive {$this->user} {$item} {$dst_item}", $output, $return_var);
  161. $error = self::check_return_code($return_var, $output);
  162. if (empty($error)) {
  163. return array(
  164. 'result' => true
  165. );
  166. }
  167. else {
  168. return array(
  169. 'result' => false,
  170. 'message' => $error
  171. );
  172. }
  173. }
  174. function unpackItem($item, $dir, $target_dir, $filename) {
  175. $item = $this->formatFullPath($item);
  176. $dst_item = $this->formatFullPath($target_dir);
  177. exec (VESTA_CMD . "v-extract-fs-archive {$this->user} {$item} {$dst_item}", $output, $return_var);
  178. $error = self::check_return_code($return_var, $output);
  179. if (empty($error)) {
  180. return array(
  181. 'result' => true
  182. );
  183. }
  184. else {
  185. return array(
  186. 'result' => false,
  187. 'message' => $error
  188. );
  189. }
  190. }
  191. function renameFile($dir, $item, $target_name) {
  192. $item = $this->formatFullPath($dir . '/' . $item);
  193. $dst_item = $this->formatFullPath($dir . '/' . $target_name);
  194. // var_dump(VESTA_CMD . "v-move-fs-file {$this->user} {$item} {$dst_item}");die();
  195. exec (VESTA_CMD . "v-move-fs-file {$this->user} {$item} {$dst_item}", $output, $return_var);
  196. $error = self::check_return_code($return_var, $output);
  197. if (empty($error)) {
  198. return array(
  199. 'result' => true
  200. );
  201. }
  202. else {
  203. return array(
  204. 'result' => false,
  205. 'message' => $error
  206. );
  207. }
  208. }
  209. function renameDirectory($dir, $item, $target_name) {
  210. $item = $this->formatFullPath($dir . $item);
  211. $dst_item = $this->formatFullPath($dir . $target_name);
  212. if ($item == $dst_item) {
  213. return array(
  214. 'result' => true
  215. );
  216. }
  217. exec (VESTA_CMD . "v-move-fs-directory {$this->user} {$item} {$dst_item}", $output, $return_var);
  218. $error = self::check_return_code($return_var, $output);
  219. if (empty($error)) {
  220. return array(
  221. 'result' => true
  222. );
  223. }
  224. else {
  225. return array(
  226. 'result' => false,
  227. 'message' => $error
  228. );
  229. }
  230. }
  231. function createDir($dir, $dirname) {
  232. $dir = $this->formatFullPath($dir . '/' . $dirname);
  233. exec (VESTA_CMD . "v-add-fs-directory {$this->user} {$dir}", $output, $return_var);
  234. $error = self::check_return_code($return_var, $output);
  235. if (empty($error)) {
  236. return array(
  237. 'result' => true
  238. );
  239. }
  240. else {
  241. return array(
  242. 'result' => false,
  243. 'message' => $error
  244. );
  245. }
  246. }
  247. function getDirectoryListing($dir = '') {
  248. $dir = $this->formatFullPath($dir);
  249. exec (VESTA_CMD . "v-list-fs-directory {$this->user} {$dir}", $output, $return_var);
  250. return $this->parseListing($output);
  251. }
  252. public function ls($dir = '') {
  253. $listing = $this->getDirectoryListing($dir);
  254. return $data = array(
  255. 'result' => true,
  256. 'listing' => $listing
  257. );
  258. }
  259. public function open_file($dir = '') {
  260. $listing = $this->getDirectoryListing($dir);
  261. return $data = array(
  262. 'result' => true,
  263. 'listing' => $listing
  264. );
  265. }
  266. public function parseListing($raw) {
  267. $data = array();
  268. foreach ($raw as $o) {
  269. $info = explode($this->delimeter, $o);
  270. $data[] = array(
  271. 'type' => $info[$this->info_positions['TYPE']],
  272. 'permissions' => $info[$this->info_positions['PERMISSIONS']],
  273. 'date' => $info[$this->info_positions['DATE']],
  274. 'time' => $info[$this->info_positions['TIME']],
  275. 'owner' => $info[$this->info_positions['OWNER']],
  276. 'group' => $info[$this->info_positions['GROUP']],
  277. 'size' => $info[$this->info_positions['SIZE']],
  278. 'name' => $info[$this->info_positions['NAME']]
  279. );
  280. }
  281. return $data;
  282. }
  283. }