'Понедельник', 'Tue' => 'Вторник', 'Wed' => 'Среда', 'Thu' => 'Четверг', 'Fri' => 'Пятница', 'Sat' => 'Суббота', 'Sun' => 'Воскресенье' ); var $mounthint = array( 'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04', 'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08', 'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12' ); var $mounthru = array( 'Jan' => 'Янв', 'Feb' => 'Фев', 'Mar' => 'Мар', 'Apr' => 'Апр', 'May' => 'Май', 'Jun' => 'Июн', 'Jul' => 'Июл', 'Aug' => 'Авг', 'Sep' => 'Сен', 'Oct' => 'Окт', 'Nov' => 'Ноя', 'Dec' => 'Дек' ); var $aEdits = array( 'txt', 'cfg', 'conf', 'json', 'xml', 'ini', 'gam', 'php', 'html', 'inf', 'js', 'css', 'sma', 'log' ); public function auth($host, $user, $password, $port = 21) { $ftp_connect = @ftp_connect($host, $port); if (!$ftp_connect) return false; if (!@ftp_login($ftp_connect, $user, $password)) return false; @ftp_pasv($ftp_connect, true); $this->steck = $ftp_connect; return true; } public function read($path) { $path = ($path == '') ? '/' : $path; $path = str_replace('//', '/', $path); $aDir = array(); $aFile = array(); $aInfo = array(); $rawlist = array(); $data = ftp_rawlist($this->steck, $path); if (is_array($data)) foreach ($data as $index) { $vinfo = preg_split('/[\s]+/', $index, 9); if ($vinfo[0] !== 'total') { $aInfo['chmod'] = $vinfo[0]; $aInfo['num'] = $vinfo[1]; $aInfo['owner'] = $vinfo[2]; $aInfo['group'] = $vinfo[3]; $aInfo['size'] = $vinfo[4]; $aInfo['month'] = $vinfo[5]; $aInfo['day'] = $vinfo[6]; $aInfo['time'] = $vinfo[7]; $aInfo['name'] = $vinfo[8]; $rawlist[$aInfo['name']] = $aInfo; } } foreach ($rawlist as $name => $data) { if ($data['chmod'][0] == 'd') $aDir[$name] = $data; elseif ($data['chmod'][0] == '-') $aFile[$name] = $data; } $aData = array( 'folder' => $aDir, 'file' => $aFile, 'path' => $path ); return $aData; } public function view($view, $server) { global $html; if ($view['path'] != '/') { $html->get('filetp_back', 'sections/servers/games/filetp'); $html->set('back', $this->path($view['path'])); $html->pack('list'); } foreach ($view as $type => $aVal) { if (!is_array($aVal)) continue; foreach ($aVal as $name => $info) { $html->get('filetp_list', 'sections/servers/games/filetp'); $html->set('id', $server); $html->set('name', $name); $path = $view['path']; if ($path[0] != '/') $path = '/' . $path; if ($path != '/') $path = $path . '/'; $html->set('path', $path); $html->set('chmod', $this->cti($info['chmod']) . ' ' . $info['chmod']); $html->set('owner', $info['owner']); $html->set('group', $info['group']); if ($type == 'folder') { $html->unit('folder', 1); $html->unit('file'); $html->set('size', ''); } else { $type = explode('.', $name); if (in_array(end($type), $this->aEdits)) $html->unit('edit', 1); else $html->unit('edit'); $html->unit('file', 1); $html->unit('folder'); $html->set('size', sys::size($info['size'])); } $html->set('month', $this->mounthru[$info['month']]); $html->set('day', $info['day']); $html->set('time', $info['time']); $html->pack('list'); } } return isset($html->arr['list']) ? $html->arr['list'] : ''; } public function mkdir($path, $folders) { if (!@ftp_chdir($this->steck, $path)) sys::outjs(array('e' => 'Ошибка: не удалось создать папку')); $aFolder = explode('/', $folders); foreach ($aFolder as $folder) { if ($folder == '') continue; if (!@ftp_chdir($this->steck, $folder)) { if (!@ftp_mkdir($this->steck, $folder)) sys::outjs(array('e' => 'Ошибка: не удалось создать папку ' . $folder)); @ftp_chdir($this->steck, $folder); } } sys::outjs(array('s' => 'ok')); } public function touch($path, $file, $text) { $aData = explode('/', $file); $path_file = ''; if (count($aData)) { $file = end($aData); unset($aData[count($aData) - 1]); foreach ($aData as $val) $path_file .= $val . '/'; } $dir = str_replace('//', '', $path . '/' . $path_file); $dir = ($dir == '') ? '/' : $dir; if (!@ftp_chdir($this->steck, $dir)) sys::outjs(array('e' => 'Ошибка: не удалось создать файл')); $temp = sys::temp($text); if (@ftp_put($this->steck, $file, $temp, FTP_BINARY)) { unlink($temp); sys::outjs(array('s' => 'ok')); } unlink($temp); sys::outjs(array('e' => 'Ошибка: не удалось создать файл')); } public function edit_file($path, $file) { $name = md5(time() . $file . 'ftp'); if (@ftp_get($this->steck, TEMP . $name, $path . '/' . $file, FTP_BINARY)) { $data = file_get_contents(TEMP . $name); unlink(TEMP . $name); sys::outjs(array('s' => $data)); } sys::outjs(array('e' => 'Не удалось открыть файл')); } public function rename($path, $oldname, $newname) { if (@ftp_rename($this->steck, $path . '/' . $oldname, $path . '/' . $newname)) sys::outjs(array('s' => 'ok')); sys::outjs(array('e' => 'Не удалось сменить имя')); } public function rmdir($path, $folder) { if (@ftp_rmdir($this->steck, $path . '/' . $folder)) sys::outjs(array('s' => 'ok')); sys::outjs(array('e' => 'Ошибка: не удалось удалить папку.')); } public function rmfile($file) { if (@ftp_delete($this->steck, $file)) sys::outjs(array('s' => 'ok')); sys::outjs(array('e' => 'Ошибка: не удалось удалить файл')); } public function chmod($path, $name, $chmod) { if (ftp_site($this->steck, 'CHMOD 0' . $chmod . ' ' . $path . '/' . $name)) sys::outjs(array('s' => 'ok')); sys::outjs(array('e' => 'Ошибка: не удалось изменить права.')); } public function search($str, $server) { global $html, $mcache; $nmch = md5($str . $server); $cache = $mcache->get($nmch); if (!is_array($cache)) { $aData = ftp_rawlist($this->steck, '/', true); if (!is_array($aData)) sys::out('Ничего не найдено'); // Файлы $aFile = array(); // Файлы в корне $end = array_search('', $aData); for ($i = 0; $i < $end; $i += 1) { $aInfo = preg_split('/[\s]+/', $aData[$i], 9); $info = ''; for ($n = 0; $n < 8; $n += 1) $info .= $aInfo[$n] . ' '; $aFile['/'][] = array('info' => $info, 'name' => $aInfo[8]); } // Перебор директорий и файлов в них foreach ($aData as $index) { $begin = array_search('', $aData); unset($aData[$begin]); $end = array_search('', $aData); if (!$begin) break; $dir = substr($aData[$begin + 1], 0, -1); for ($i = $begin + 2; $i < $end; $i += 1) { $aInfo = preg_split('/[\s]+/', $aData[$i], 9); $info = ''; for ($n = 0; $n < 8; $n += 1) $info .= $aInfo[$n] . ' '; $aFile[$dir][] = array('info' => $info, 'name' => $aInfo[8]); } } $mcache->set($nmch, $aFile, false, 20); } else $aFile = $cache; $aFind = array(); // Поиск foreach ($aFile as $dir => $files) { foreach ($files as $file) { $find = sys::first(explode('.', $file['name'])); if (preg_match('/' . $str . '/i', $find)) $aFind[] = array('dir' => $dir, 'info' => $file['info'], 'file' => $file['name'], 'find' => sys::find($file['name'], $str)); } } unset($aFile); foreach ($aFind as $data) { $info = preg_split('/[\s]+/', trim($data['info']), 8); $html->get('filetp_find', 'sections/servers/games/filetp'); $html->set('id', $server); $html->set('find', $data['find']); $html->set('name', $data['file']); $path = $data['dir']; if ($path[0] != '/') $path = '/' . $path; if ($path != '/') $path = $path . '/'; $html->set('path', $path); $html->set('chmod', $this->cti($info[0]) . ' ' . $info[0]); $html->set('owner', $info[2]); $html->set('group', $info[3]); if ($info[0][0] == 'd') { $html->unit('folder', 1); $html->unit('file'); $html->set('size', ''); } else { $type = explode('.', $data['file']); if (in_array(end($type), $this->aEdits)) $html->unit('edit', 1); else $html->unit('edit'); $html->unit('file', 1); $html->unit('folder'); $html->set('size', sys::size($info[4])); } $html->set('month', $this->mounthru[$info[5]]); $html->set('day', $info[6]); $html->set('time', $info[7]); $html->pack('list'); } if (isset($html->arr['list'])) sys::out($html->arr['list']); sys::out('Ничего не найдено'); } public function logs($data, $uid) { global $html; $aLine = explode("\n", $data); $actions = array('i' => 'загрузка', 'o' => 'скачивание', 'd' => 'удаление'); $acticon = array('i' => '', 'o' => '', 'd' => ''); unset($aLine[count($aLine) - 1]); rsort($aLine); foreach ($aLine as $line) { $aData = explode('\\', $line); $html->get('filetp_logs', 'sections/servers/games/filetp'); $html->set('month', $this->mounthint[$aData[0]]); $html->set('day', $aData[1]); $html->set('time', $aData[2]); $html->set('year', $aData[3]); $html->set('who', $this->who($aData[4])); $html->set('size', sys::size($aData[5])); $html->set('file', str_replace('/servers/' . $uid . '/', '', $aData[6])); $html->set('action', $actions[$aData[7]]); $html->set('acticon', $acticon[$aData[7]]); $html->pack('logs'); } return isset($html->arr['logs']) ? $html->arr['logs'] : 'Список логов отсутствует'; } private function path($path) { $path = str_replace('//', '/', $path); $path = explode('/', $path); unset($path[count($path) - 1]); $newpath = '/'; foreach ($path as $index => $val) if (count($path) - 1 == $index) $newpath .= $val; else $newpath .= $val . '/'; return str_replace('//', '/', $newpath); } private function cti($chmod) { $intchmod = array('-' => '0', 'r' => '4', 'w' => '2', 'x' => '1'); $chmod = substr(strtr($chmod, $intchmod), 1); $split = str_split($chmod, 3); return array_sum(str_split($split[0])) . array_sum(str_split($split[1])) . array_sum(str_split($split[2])); } private function who($address) { global $cfg, $uip; if ($address == $cfg['ip']) return 'панель управления'; if ($address == $uip) return 'вы'; return $address; } } ?>