'Понедельник',
'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;
}
}
?>