EngineGP/system/library/ftp.php

516 lines
11 KiB
PHP
Raw Normal View History

2023-03-04 23:45:46 +00:00
<?php
if(!DEFINED('EGP'))
exit(header('Refresh: 0; URL=http://'.$_SERVER['SERVER_NAME'].'/404'));
class ftp
{
var $steck = false;
var $dayru = array(
'Mon' => 'Понедельник',
'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' => '<i class="fa fa-upload"></i>', 'o' => '<i class="fa fa-download"></i>', 'd' => '<i class="fa fa-times"></i>');
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;
}
}
?>