Файл: adultscript-2.0.3-pro/files/modules/photo/helpers/server.php
Строк: 179
<?php
defined('_VALID') or die('Restricted Access!');
class VHelper_photo_server
{
private static $servers;
public static function get($server_id=NULL, $status=NULL)
{
if (isset(self::$servers[$server_id])) {
return self::$servers[$server_id];
}
self::log('Initializing multi-server...');
$sql = array();
if ($server_id) {
$sql[] = "server_id = ".(int) $server_id;
}
if ($status) {
$sql[] = "status = '".$status."'";
}
$add = ($sql) ? " WHERE ".implode(' AND ', $sql) : '';
VF::factory_remove('database');
$db = VF::factory('database');
$db->query("SELECT server_id, server_name, ftp_host, ftp_port,
ftp_username, ftp_password, ftp_root,
url
FROM #__photo_servers".$add."
ORDER BY last_used ASC
LIMIT 1");
if ($db->affected_rows()) {
$server = $db->fetch_assoc();
if ($server_id) {
self::$servers[$server_id] = $server;
}
return $server;
}
return FALSE;
}
public static function update($server_id)
{
VF::factory('database')->query("
UPDATE #__photo_servers
SET last_used = ".time()."
WHERE server_id = ".$server_id."
LIMIT 1
");
}
public static function upload_photo($server, $photo_id, $ext)
{
if (!is_array($server)) {
$server = self::get($server);
}
if (!$server) {
return false;
}
$conn_id = self::connect($server);
if (!$conn_id) {
return false;
}
$base = ftp_pwd($conn_id);
$files = array(
$photo_id.'.'.$ext,
'orig/'.$photo_id.'.'.$ext,
'mobile/'.$photo_id.'.'.$ext
);
foreach ($files as $file) {
$src = MEDIA_DIR.'/photos/'.$file;
$dst = $file;
if (VFile::exists($src)) {
$dir = dirname($dst);
if ($dir) {
if ($dir{0} == '/') {
$dir = substr($dir, 1);
}
if (!ftp_chdir($conn_id, $dir)) {
self::log('Failed to change directory to: '.$dir);
return false;
}
}
$filename = basename($dst);
ftp_pasv($conn_id, true);
// when you have a lot of videos ftp_nlist is slow
@ftp_delete($conn_id, $filename);
if (!ftp_put($conn_id, $filename, $src, FTP_BINARY)) {
self::log('Failed to upload '.$src.' to '.$filename);
return false;
}
if (!ftp_site($conn_id, sprintf('CHMOD %u %s', 777, $filename))) {
self::log('Failed to change permissions for '.$filename);
return false;
}
ftp_chdir($conn_id, $base);
}
}
ftp_close($conn_id);
return true;
}
public static function upload_album($album_id)
{
$db = VF::factory('database');
$db->query("SELECT photo_id, ext
FROM #__photo
WHERE album_id = ".$album_id);
if (!$db->affected_rows()) {
return false;
}
$photos = $db->fetch_rows();
$success = true;
foreach ($photos as $photo) {
if (!static::upload_photo(false, $photo['photo_id'], $photo['ext'])) {
$success = false;
}
}
return $success;
}
public static function upload($server, $src, $dst)
{
if (!is_array($server)) {
$server = self::get($server);
}
if ($server) {
$conn_id = self::connect($server);
if ($conn_id) {
$dir = dirname($dst);
if ($dir{0} == '/') {
$dir = substr($dir, 1);
}
if (!ftp_chdir($conn_id, $dir)) {
return FALSE;
}
$filename = basename($dst);
ftp_pasv($conn_id, TRUE);
// when you have a lot of videos ftp_nlist is slow
@ftp_delete($conn_id, $filename);
if (ftp_put($conn_id, $filename, $src, FTP_BINARY)) {
ftp_site($conn_id, sprintf('CHMOD %u %s', 777, $filename));
return TRUE;
}
}
}
return FALSE;
}
public static function delete($server, $file)
{
if (!is_array($server)) {
$server = self::get($server);
}
if ($server) {
$conn_id = self::connect($server);
if ($conn_id) {
$dir = dirname($file);
if ($dir{0} == '/') {
$dir = substr($dir, 1);
}
if (!ftp_chdir($conn_id, $dir)) {
return FALSE;
}
$filename = basename($file);
ftp_pasv($conn_id, TRUE);
@ftp_delete($conn_id, $filename);
if (ftp_size($conn_id, $filename) === -1) {
return TRUE;
}
}
}
return FALSE;
}
public static function exists($server, $file)
{
if (!is_array($server)) {
$server = self::get($server);
}
if ($server) {
$conn_id = self::connect($server);
if ($conn_id) {
if ($file{0} == '/') {
$file = substr($file, 1);
}
if (ftp_size($conn_id, $file) !== -1) {
return TRUE;
}
}
}
return FALSE;
}
public static function download($server, $file, $dst)
{
if (!is_array($server)) {
$server = self::get($server);
}
if ($server) {
$conn_id = self::connect($server);
if ($conn_id) {
if ($file{0} == '/') {
$file = substr($file, 1);
}
if (ftp_get($conn_id, $dst, $file, FTP_BINARY)) {
chmod($dst, 0777);
return TRUE;
}
}
}
return FALSE;
}
private static function connect($server)
{
$conn_id = ftp_connect($server['ftp_host'], $server['ftp_port']);
if (!$conn_id) {
self::log('Failed to connect to FTP server!');
return FALSE;
}
if (!ftp_login($conn_id, $server['ftp_username'], $server['ftp_password'])) {
self::log('Failed to login to FTP server!');
return FALSE;
}
// lets make sure base root does not contain a /
$root = $server['ftp_root'];
if (substr($root, -1) == '/') {
$root = substr($root, 0, -1);
}
if ($root{0} == '/') {
$root = substr($root, 1);
}
if (!ftp_chdir($conn_id, $root)) {
self::log('Failed to change folder to base root: '.$root);
return FALSE;
}
if (!ftp_chdir($conn_id, 'media/photos')) {
self::log('Failed to change folder to media/photos!');
return false;
}
return $conn_id;
}
public static function log($message)
{
file_put_contents(TMP_DIR.'/logs/photos-'.md5(VF::cfg_item('secret')).'.log', $message."n", FILE_APPEND);
}
}