commit
f7d8a8c571
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,277 @@ |
||||
<?php |
||||
/** |
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
|
||||
class OC_Archive_TAR extends OC_Archive{ |
||||
const PLAIN=0; |
||||
const GZIP=1; |
||||
const BZIP=2; |
||||
|
||||
/** |
||||
* @var Archive_Tar tar |
||||
*/ |
||||
private $tar=null; |
||||
private $path; |
||||
|
||||
function __construct($source){ |
||||
$types=array(null,'gz','bz'); |
||||
$this->path=$source; |
||||
$this->tar=new Archive_Tar($source,$types[self::getTarType($source)]); |
||||
} |
||||
|
||||
/** |
||||
* try to detect the type of tar compression |
||||
* @param string file |
||||
* @return str |
||||
*/ |
||||
static public function getTarType($file){ |
||||
if(strpos($file,'.')){ |
||||
$extention=substr($file,strrpos($file,'.')); |
||||
switch($extention){ |
||||
case 'gz': |
||||
case 'tgz': |
||||
return self::GZIP; |
||||
case 'bz': |
||||
case 'bz2': |
||||
return self::BZIP; |
||||
default: |
||||
return self::PLAIN; |
||||
} |
||||
}else{ |
||||
return self::PLAIN; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* add an empty folder to the archive |
||||
* @param string path |
||||
* @return bool |
||||
*/ |
||||
function addFolder($path){ |
||||
$tmpBase=get_temp_dir().'/'; |
||||
if(substr($path,-1,1)!='/'){ |
||||
$path.='/'; |
||||
} |
||||
if($this->fileExists($path)){ |
||||
return false; |
||||
} |
||||
mkdir($tmpBase.$path); |
||||
$result=$this->tar->addModify(array($tmpBase.$path),'',$tmpBase); |
||||
rmdir($tmpBase.$path); |
||||
return $result; |
||||
} |
||||
/** |
||||
* add a file to the archive |
||||
* @param string path |
||||
* @param string source either a local file or string data |
||||
* @return bool |
||||
*/ |
||||
function addFile($path,$source=''){ |
||||
if($this->fileExists($path)){ |
||||
$this->remove($path); |
||||
} |
||||
if(file_exists($source)){ |
||||
$header=array(); |
||||
$dummy=''; |
||||
$this->tar->_openAppend(); |
||||
$result=$this->tar->_addfile($source,$header,$dummy,$dummy,$path); |
||||
}else{ |
||||
$result=$this->tar->addString($path,$source); |
||||
} |
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* rename a file or folder in the archive |
||||
* @param string source |
||||
* @param string dest |
||||
* @return bool |
||||
*/ |
||||
function rename($source,$dest){ |
||||
//no proper way to delete, rename entire archive, rename file and remake archive |
||||
$tmp=OC_Helper::tmpFolder(); |
||||
$this->tar->extract($tmp); |
||||
rename($tmp.$source,$tmp.$dest); |
||||
$this->tar=null; |
||||
unlink($this->path); |
||||
$types=array(null,'gz','bz'); |
||||
$this->tar=new Archive_Tar($this->path,$types[self::getTarType($this->path)]); |
||||
$this->tar->createModify(array($tmp),'',$tmp.'/'); |
||||
} |
||||
|
||||
private function getHeader($file){ |
||||
$headers=$this->tar->listContent(); |
||||
foreach($headers as $header){ |
||||
if($file==$header['filename'] or $file.'/'==$header['filename']){ |
||||
return $header; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* get the uncompressed size of a file in the archive |
||||
* @param string path |
||||
* @return int |
||||
*/ |
||||
function filesize($path){ |
||||
$stat=$this->getHeader($path); |
||||
return $stat['size']; |
||||
} |
||||
/** |
||||
* get the last modified time of a file in the archive |
||||
* @param string path |
||||
* @return int |
||||
*/ |
||||
function mtime($path){ |
||||
$stat=$this->getHeader($path); |
||||
return $stat['mtime']; |
||||
} |
||||
|
||||
/** |
||||
* get the files in a folder |
||||
* @param path |
||||
* @return array |
||||
*/ |
||||
function getFolder($path){ |
||||
$files=$this->getFiles(); |
||||
$folderContent=array(); |
||||
$pathLength=strlen($path); |
||||
foreach($files as $file){ |
||||
if(substr($file,0,$pathLength)==$path and $file!=$path){ |
||||
if(strrpos(substr($file,0,-1),'/')<=$pathLength){ |
||||
$folderContent[]=substr($file,$pathLength); |
||||
} |
||||
} |
||||
} |
||||
return $folderContent; |
||||
} |
||||
/** |
||||
*get all files in the archive |
||||
* @return array |
||||
*/ |
||||
function getFiles(){ |
||||
$headers=$this->tar->listContent(); |
||||
$files=array(); |
||||
foreach($headers as $header){ |
||||
$files[]=$header['filename']; |
||||
} |
||||
return $files; |
||||
} |
||||
/** |
||||
* get the content of a file |
||||
* @param string path |
||||
* @return string |
||||
*/ |
||||
function getFile($path){ |
||||
return $this->tar->extractInString($path); |
||||
} |
||||
/** |
||||
* extract a single file from the archive |
||||
* @param string path |
||||
* @param string dest |
||||
* @return bool |
||||
*/ |
||||
function extractFile($path,$dest){ |
||||
$tmp=OC_Helper::tmpFolder(); |
||||
if(!$this->fileExists($path)){ |
||||
return false; |
||||
} |
||||
$success=$this->tar->extractList(array($path),$tmp); |
||||
if($success){ |
||||
rename($tmp.$path,$dest); |
||||
} |
||||
OC_Helper::rmdirr($tmp); |
||||
return $success; |
||||
} |
||||
/** |
||||
* extract the archive |
||||
* @param string path |
||||
* @param string dest |
||||
* @return bool |
||||
*/ |
||||
function extract($dest){ |
||||
return $this->tar->extract($dest); |
||||
} |
||||
/** |
||||
* check if a file or folder exists in the archive |
||||
* @param string path |
||||
* @return bool |
||||
*/ |
||||
function fileExists($path){ |
||||
return $this->getHeader($path)!==null; |
||||
} |
||||
|
||||
/** |
||||
* remove a file or folder from the archive |
||||
* @param string path |
||||
* @return bool |
||||
*/ |
||||
function remove($path){ |
||||
if(!$this->fileExists($path)){ |
||||
return false; |
||||
} |
||||
//no proper way to delete, extract entire archive, delete file and remake archive |
||||
$tmp=OC_Helper::tmpFolder(); |
||||
$this->tar->extract($tmp); |
||||
OC_Helper::rmdirr($tmp.$path); |
||||
$this->tar=null; |
||||
unlink($this->path); |
||||
$this->reopen(); |
||||
$this->tar->createModify(array($tmp),'',$tmp); |
||||
return true; |
||||
} |
||||
/** |
||||
* get a file handler |
||||
* @param string path |
||||
* @param string mode |
||||
* @return resource |
||||
*/ |
||||
function getStream($path,$mode){ |
||||
if(strrpos($path,'.')!==false){ |
||||
$ext=substr($path,strrpos($path,'.')); |
||||
}else{ |
||||
$ext=''; |
||||
} |
||||
$tmpFile=OC_Helper::tmpFile($ext); |
||||
if($this->fileExists($path)){ |
||||
$this->extractFile($path,$tmpFile); |
||||
}elseif($mode=='r' or $mode=='rb'){ |
||||
return false; |
||||
} |
||||
if($mode=='r' or $mode=='rb'){ |
||||
return fopen($tmpFile,$mode); |
||||
}else{ |
||||
OC_CloseStreamWrapper::$callBacks[$tmpFile]=array($this,'writeBack'); |
||||
self::$tempFiles[$tmpFile]=$path; |
||||
return fopen('close://'.$tmpFile,$mode); |
||||
} |
||||
} |
||||
|
||||
private static $tempFiles=array(); |
||||
/** |
||||
* write back temporary files |
||||
*/ |
||||
function writeBack($tmpFile){ |
||||
if(isset(self::$tempFiles[$tmpFile])){ |
||||
$this->addFile(self::$tempFiles[$tmpFile],$tmpFile); |
||||
unlink($tmpFile); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* reopen the archive to ensure everything is written |
||||
*/ |
||||
private function reopen(){ |
||||
if($this->tar){ |
||||
$this->tar->_close(); |
||||
$this->tar=null; |
||||
} |
||||
$types=array(null,'gz','bz'); |
||||
$this->tar=new Archive_Tar($this->path,$types[self::getTarType($this->path)]); |
||||
} |
||||
} |
@ -0,0 +1,20 @@ |
||||
<?php |
||||
/** |
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
|
||||
require_once('archive.php'); |
||||
|
||||
class Test_Archive_TAR extends Test_Archive{ |
||||
protected function getExisting(){ |
||||
$dir=OC::$SERVERROOT.'/apps/files_archive/tests/data'; |
||||
return new OC_Archive_TAR($dir.'/data.tar.gz'); |
||||
} |
||||
|
||||
protected function getNew(){ |
||||
return new OC_Archive_TAR(OC_Helper::tmpFile('.tar.gz')); |
||||
} |
||||
} |
@ -0,0 +1,11 @@ |
||||
<?php |
||||
/** |
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
|
||||
OC::$CLASSPATH['OC_Filestorage_FTP']='apps/files_external/lib/ftp.php'; |
||||
OC::$CLASSPATH['OC_Filestorage_DAV']='apps/files_external/lib/webdav.php'; |
||||
OC::$CLASSPATH['OC_Filestorage_Google']='apps/files_external/lib/google.php'; |
@ -0,0 +1,13 @@ |
||||
<?xml version="1.0"?> |
||||
<info> |
||||
<id>files_external</id> |
||||
<name>External storage support</name> |
||||
<description>Mount external storage sources</description> |
||||
<version>0.1</version> |
||||
<licence>AGPL</licence> |
||||
<author>Robin Appelman</author> |
||||
<require>3</require> |
||||
<types> |
||||
<filesystem/> |
||||
</types> |
||||
</info> |
@ -1,11 +0,0 @@ |
||||
<?php |
||||
/** |
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
|
||||
OC::$CLASSPATH['OC_Filestorage_FTP']='apps/files_remote/lib/ftp.php'; |
||||
OC::$CLASSPATH['OC_Filestorage_DAV']='apps/files_remote/lib/webdav.php'; |
||||
OC::$CLASSPATH['OC_Filestorage_Google']='apps/files_remote/lib/google.php'; |
@ -1,10 +0,0 @@ |
||||
<?xml version="1.0"?> |
||||
<info> |
||||
<id>files_remote</id> |
||||
<name>Remote storage support</name> |
||||
<description>Mount remote storage sources</description> |
||||
<version>0.1</version> |
||||
<licence>AGPL</licence> |
||||
<author>Robin Appelman</author> |
||||
<require>3</require> |
||||
</info> |
@ -1,11 +1,11 @@ |
||||
<?xml version="1.0"?> |
||||
<info> |
||||
<id>gallery</id> |
||||
<name>Gallery</name> |
||||
<name>Pictures</name> |
||||
<version>0.4</version> |
||||
<licence>AGPL</licence> |
||||
<author>Bartek Przybylski</author> |
||||
<require>2</require> |
||||
<description>Gallery application for ownCloud</description> |
||||
<description>Dedicated pictures application</description> |
||||
<default_enable/> |
||||
</info> |
||||
|
@ -1,78 +1,39 @@ |
||||
<?php |
||||
/** |
||||
* ownCloud |
||||
* |
||||
* @author Robin Appelman |
||||
* @copyright 2012 Robin Appelman icewind1991@gmail.com |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
* License as published by the Free Software Foundation; either |
||||
* version 3 of the License, or any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public |
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
* Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl> |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
|
||||
/** |
||||
*logging utilities |
||||
* logging utilities |
||||
* |
||||
* Log is saved at data/owncloud.log (on default) |
||||
* Log is saved by default at data/owncloud.log using OC_Log_Owncloud. |
||||
* Selecting other backend is done with a config option 'log_type'. |
||||
*/ |
||||
|
||||
class OC_Log{ |
||||
class OC_Log { |
||||
const DEBUG=0; |
||||
const INFO=1; |
||||
const WARN=2; |
||||
const ERROR=3; |
||||
const FATAL=4; |
||||
|
||||
static protected $class = null; |
||||
|
||||
/** |
||||
* write a message in the log |
||||
* @param string $app |
||||
* @param string $message |
||||
* @param int level |
||||
*/ |
||||
public static function write($app,$message,$level){ |
||||
$minLevel=OC_Config::getValue( "loglevel", 2 ); |
||||
if($level>=$minLevel){ |
||||
$datadir=OC_Config::getValue( "datadirectory", OC::$SERVERROOT.'/data' ); |
||||
$logFile=OC_Config::getValue( "logfile", $datadir.'/owncloud.log' ); |
||||
$entry=array('app'=>$app,'message'=>$message,'level'=>$level,'time'=>time()); |
||||
$fh=fopen($logFile,'a'); |
||||
fwrite($fh,json_encode($entry)."\n"); |
||||
fclose($fh); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* get entries from the log in reverse chronological order |
||||
* @param int limit |
||||
* @param int offset |
||||
* @return array |
||||
*/ |
||||
public static function getEntries($limit=50,$offset=0){ |
||||
$datadir=OC_Config::getValue( "datadirectory", OC::$SERVERROOT.'/data' ); |
||||
$logFile=OC_Config::getValue( "logfile", $datadir.'/owncloud.log' ); |
||||
$entries=array(); |
||||
if(!file_exists($logFile)){ |
||||
return array(); |
||||
} |
||||
$contents=file($logFile); |
||||
if(!$contents){//error while reading log |
||||
return array(); |
||||
} |
||||
$end=max(count($contents)-$offset-1,0); |
||||
$start=max($end-$limit,0); |
||||
for($i=$end;$i>$start;$i--){ |
||||
$entries[]=json_decode($contents[$i]); |
||||
public static function write($app, $message, $level) { |
||||
if (!self::$class) { |
||||
self::$class = 'OC_Log_'.ucfirst(OC_Config::getValue('log_type', 'owncloud')); |
||||
call_user_func(array(self::$class, 'init')); |
||||
} |
||||
return $entries; |
||||
$log_class=self::$class; |
||||
$log_class::write($app, $message, $level); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,79 @@ |
||||
<?php |
||||
/** |
||||
* ownCloud |
||||
* |
||||
* @author Robin Appelman |
||||
* @copyright 2012 Robin Appelman icewind1991@gmail.com |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
* License as published by the Free Software Foundation; either |
||||
* version 3 of the License, or any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public |
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
/** |
||||
* logging utilities |
||||
* |
||||
* Log is saved at data/owncloud.log (on default) |
||||
*/ |
||||
|
||||
class OC_Log_Owncloud { |
||||
static protected $logFile; |
||||
|
||||
/** |
||||
* Init class data |
||||
*/ |
||||
public static function init() { |
||||
$datadir=OC_Config::getValue( "datadirectory", OC::$SERVERROOT.'/data' ); |
||||
self::$logFile=OC_Config::getValue( "logfile", $datadir.'/owncloud.log' ); |
||||
} |
||||
|
||||
/** |
||||
* write a message in the log |
||||
* @param string $app |
||||
* @param string $message |
||||
* @param int level |
||||
*/ |
||||
public static function write($app, $message, $level) { |
||||
$minLevel=OC_Config::getValue( "loglevel", 2 ); |
||||
if($level>=$minLevel){ |
||||
$entry=array('app'=>$app, 'message'=>$message, 'level'=>$level,'time'=>time()); |
||||
$fh=fopen(self::$logFile, 'a'); |
||||
fwrite($fh, json_encode($entry)."\n"); |
||||
fclose($fh); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* get entries from the log in reverse chronological order |
||||
* @param int limit |
||||
* @param int offset |
||||
* @return array |
||||
*/ |
||||
public static function getEntries($limit=50, $offset=0){ |
||||
self::init(); |
||||
$entries=array(); |
||||
if(!file_exists(self::$logFile)) { |
||||
return array(); |
||||
} |
||||
$contents=file($logFile); |
||||
if(!$contents) {//error while reading log |
||||
return array(); |
||||
} |
||||
$end=max(count($contents)-$offset-1, 0); |
||||
$start=max($end-$limit,0); |
||||
for($i=$end;$i>$start;$i--) { |
||||
$entries[]=json_decode($contents[$i]); |
||||
} |
||||
return $entries; |
||||
} |
||||
} |
@ -0,0 +1,37 @@ |
||||
<?php |
||||
/** |
||||
* Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl> |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
|
||||
class OC_Log_Syslog { |
||||
static protected $levels = array( |
||||
OC_Log::DEBUG => LOG_DEBUG, |
||||
OC_Log::INFO => LOG_INFO, |
||||
OC_Log::WARN => LOG_WARNING, |
||||
OC_Log::ERROR => LOG_ERR, |
||||
OC_Log::FATAL => LOG_CRIT, |
||||
); |
||||
|
||||
/** |
||||
* Init class data |
||||
*/ |
||||
public static function init() { |
||||
openlog('ownCloud', LOG_PID | LOG_CONS, LOG_USER); |
||||
// Close at shutdown |
||||
register_shutdown_function('closelog'); |
||||
} |
||||
|
||||
/** |
||||
* write a message in the log |
||||
* @param string $app |
||||
* @param string $message |
||||
* @param int level |
||||
*/ |
||||
public static function write($app, $message, $level) { |
||||
$syslog_level = self::$levels[$level]; |
||||
syslog($syslog_level, '{'.$app.'} '.$message); |
||||
} |
||||
} |
Loading…
Reference in new issue