|
|
@@ -73,6 +73,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
sleep($this->timeout); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private function cleanKey($path) { |
|
|
|
if ($path === '.') { |
|
|
|
return '/'; |
|
|
@@ -90,13 +91,13 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
$this->bucket = $params['bucket']; |
|
|
|
$scheme = ($params['use_ssl'] === 'false') ? 'http' : 'https'; |
|
|
|
$this->test = isset($params['test']); |
|
|
|
$this->timeout = ( ! isset($params['timeout'])) ? 15 : $params['timeout']; |
|
|
|
$params['region'] = ( ! isset($params['region']) || $params['region'] === '' ) ? 'eu-west-1' : $params['region']; |
|
|
|
$params['hostname'] = ( !isset($params['hostname']) || $params['hostname'] === '' ) ? 's3.amazonaws.com' : $params['hostname']; |
|
|
|
$this->timeout = (!isset($params['timeout'])) ? 15 : $params['timeout']; |
|
|
|
$params['region'] = (!isset($params['region']) || $params['region'] === '') ? 'eu-west-1' : $params['region']; |
|
|
|
$params['hostname'] = (!isset($params['hostname']) || $params['hostname'] === '') ? 's3.amazonaws.com' : $params['hostname']; |
|
|
|
if (!isset($params['port']) || $params['port'] === '') { |
|
|
|
$params['port'] = ($params['use_ssl'] === 'false') ? 80 : 443; |
|
|
|
} |
|
|
|
$base_url = $scheme.'://'.$params['hostname'].':'.$params['port'].'/'; |
|
|
|
$base_url = $scheme . '://' . $params['hostname'] . ':' . $params['port'] . '/'; |
|
|
|
|
|
|
|
$this->connection = S3Client::factory(array( |
|
|
|
'key' => $params['key'], |
|
|
@@ -119,7 +120,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
'waiter.interval' => 1, |
|
|
|
'waiter.max_attempts' => 15 |
|
|
|
)); |
|
|
|
$this->testTimeout(); |
|
|
|
$this->testTimeout(); |
|
|
|
} catch (S3Exception $e) { |
|
|
|
\OCP\Util::writeLog('files_external', $e->getMessage(), \OCP\Util::ERROR); |
|
|
|
throw new \Exception("Creation of bucket failed."); |
|
|
@@ -128,8 +129,8 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
if (!$this->file_exists('.')) { |
|
|
|
$result = $this->connection->putObject(array( |
|
|
|
'Bucket' => $this->bucket, |
|
|
|
'Key' => $this->cleanKey('.'), |
|
|
|
'Body' => '', |
|
|
|
'Key' => $this->cleanKey('.'), |
|
|
|
'Body' => '', |
|
|
|
'ContentType' => 'httpd/unix-directory', |
|
|
|
'ContentLength' => 0 |
|
|
|
)); |
|
|
@@ -145,10 +146,10 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
$result = $this->connection->putObject(array( |
|
|
|
$this->connection->putObject(array( |
|
|
|
'Bucket' => $this->bucket, |
|
|
|
'Key' => $path . '/', |
|
|
|
'Body' => '', |
|
|
|
'Key' => $path . '/', |
|
|
|
'Body' => '', |
|
|
|
'ContentType' => 'httpd/unix-directory', |
|
|
|
'ContentLength' => 0 |
|
|
|
)); |
|
|
@@ -187,6 +188,10 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
public function rmdir($path) { |
|
|
|
$path = $this->normalizePath($path); |
|
|
|
|
|
|
|
if ($path === '.') { |
|
|
|
return $this->clearBucket(); |
|
|
|
} |
|
|
|
|
|
|
|
if (!$this->file_exists($path)) { |
|
|
|
return false; |
|
|
|
} |
|
|
@@ -199,7 +204,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
)); |
|
|
|
|
|
|
|
try { |
|
|
|
$result = $this->connection->deleteObjects(array( |
|
|
|
$this->connection->deleteObjects(array( |
|
|
|
'Bucket' => $this->bucket, |
|
|
|
'Objects' => $objects['Contents'] |
|
|
|
)); |
|
|
@@ -212,6 +217,28 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
protected function clearBucket() { |
|
|
|
try { |
|
|
|
$this->connection->clearBucket($this->bucket); |
|
|
|
// clearBucket() is not working with Ceph, so if it fails we try the slower approach |
|
|
|
} catch (\Exception $e) { |
|
|
|
try { |
|
|
|
$iterator = $this->connection->getIterator('ListObjects', array( |
|
|
|
'Bucket' => $this->bucket |
|
|
|
)); |
|
|
|
|
|
|
|
foreach ($iterator as $object) { |
|
|
|
$this->connection->deleteObject(array( |
|
|
|
'Bucket' => $this->bucket, |
|
|
|
'Key' => $object['Key'] |
|
|
|
)); |
|
|
|
} |
|
|
|
} catch (S3Exception $e) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public function opendir($path) { |
|
|
|
$path = $this->normalizePath($path); |
|
|
|
|
|
|
@@ -271,7 +298,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
$stat['atime'] = time(); |
|
|
|
|
|
|
|
return $stat; |
|
|
|
} catch(S3Exception $e) { |
|
|
|
} catch (S3Exception $e) { |
|
|
|
\OCP\Util::writeLog('files_external', $e->getMessage(), \OCP\Util::ERROR); |
|
|
|
return false; |
|
|
|
} |
|
|
@@ -302,7 +329,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
public function unlink($path) { |
|
|
|
$path = $this->normalizePath($path); |
|
|
|
|
|
|
|
if ( $this->is_dir($path) ) { |
|
|
|
if ($this->is_dir($path)) { |
|
|
|
return $this->rmdir($path); |
|
|
|
} |
|
|
|
|
|
|
@@ -446,8 +473,10 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
return false; |
|
|
|
} |
|
|
|
} else { |
|
|
|
if ($this->file_exists($path2)) { |
|
|
|
return false; |
|
|
|
if ($this->is_dir($path2)) { |
|
|
|
$this->rmdir($path2); |
|
|
|
} else if ($this->file_exists($path2)) { |
|
|
|
$this->unlink($path2); |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
@@ -463,7 +492,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
} |
|
|
|
|
|
|
|
$dh = $this->opendir($path1); |
|
|
|
if(is_resource($dh)) { |
|
|
|
if (is_resource($dh)) { |
|
|
|
while (($file = readdir($dh)) !== false) { |
|
|
|
if ($file === '.' || $file === '..') { |
|
|
|
continue; |
|
|
@@ -484,6 +513,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
$path2 = $this->normalizePath($path2); |
|
|
|
|
|
|
|
if ($this->is_file($path1)) { |
|
|
|
|
|
|
|
if ($this->copy($path1, $path2) === false) { |
|
|
|
return false; |
|
|
|
} |
|
|
@@ -493,9 +523,6 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
return false; |
|
|
|
} |
|
|
|
} else { |
|
|
|
if ($this->file_exists($path2)) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
if ($this->copy($path1, $path2) === false) { |
|
|
|
return false; |
|
|
@@ -534,7 +561,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
$result= $this->connection->putObject(array( |
|
|
|
$result = $this->connection->putObject(array( |
|
|
|
'Bucket' => $this->bucket, |
|
|
|
'Key' => $this->cleanKey(self::$tmpFiles[$tmpFile]), |
|
|
|
'SourceFile' => $tmpFile, |