262 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /* update friendika */
 | |
| define('APIBASE', 'http://github.com/api/v2/');
 | |
| define('F9KREPO', 'friendika/friendika');
 | |
| 
 | |
| $up_totalfiles = 0;
 | |
| $up_countfiles = 0;
 | |
| $up_lastp = -1;
 | |
| 
 | |
| function checkUpdate(){
 | |
| 	$r = fetch_url( APIBASE."json/repos/show/".F9KREPO."/tags" );
 | |
| 	$tags = json_decode($r);
 | |
| 	
 | |
| 	$tag = 0.0;
 | |
| 	foreach ($tags->tags as $i=>$v){
 | |
| 		$i = (float)$i;
 | |
| 		if ($i>$tag) $tag=$i;
 | |
| 	}
 | |
| 	
 | |
| 	if ($tag==0.0) return false;
 | |
| 	$f = fetch_url("https://raw.github.com/".F9KREPO."/".$tag."/boot.php","r");
 | |
| 	preg_match("|'FRIENDIKA_VERSION', *'([^']*)'|", $f, $m);
 | |
| 	$version =  $m[1];
 | |
| 	
 | |
| 	$lv = explode(".", FRIENDIKA_VERSION);
 | |
| 	$rv = explode(".",$version);
 | |
| 	foreach($lv as $i=>$v){
 | |
| 		if ((int)$lv[$i] < (int)$rv[$i]) {
 | |
| 			return array($tag, $version, "https://github.com/friendika/friendika/zipball/".$tag);
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 	return false;
 | |
| }
 | |
| function canWeWrite(){
 | |
| 	$bd = dirname(dirname(__file__));
 | |
| 	return is_writable( $bd."/boot.php" );
 | |
| }
 | |
| 
 | |
| function out($txt){ echo "§".$txt."§"; ob_end_flush(); flush();}
 | |
| 
 | |
| function up_count($path){
 | |
|  
 | |
|     $file_count = 0;
 | |
|  
 | |
|     $dir_handle = opendir($path);
 | |
|  
 | |
|     if (!$dir_handle) return -1;
 | |
|  
 | |
|     while ($file = readdir($dir_handle)) {
 | |
|  
 | |
|         if ($file == '.' || $file == '..') continue;
 | |
| 		$file_count++;
 | |
|         
 | |
|         if (is_dir($path . $file)){      
 | |
|             $file_count += up_count($path . $file . DIRECTORY_SEPARATOR);
 | |
|         }
 | |
|         
 | |
|     }
 | |
|  
 | |
|     closedir($dir_handle);
 | |
|  
 | |
|     return $file_count;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| function up_unzip($file, $folder="/tmp"){
 | |
| 	$folder.="/";
 | |
| 	$zip = zip_open($file);
 | |
| 	if ($zip) {
 | |
| 	  while ($zip_entry = zip_read($zip)) {
 | |
| 		$zip_entry_name = zip_entry_name($zip_entry);
 | |
| 		if (substr($zip_entry_name,strlen($zip_entry_name)-1,1)=="/"){
 | |
| 			mkdir($folder.$zip_entry_name,0777, true);
 | |
| 		} else {
 | |
| 			$fp = fopen($folder.$zip_entry_name, "w");
 | |
| 			if (zip_entry_open($zip, $zip_entry, "r")) {
 | |
| 			  $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
 | |
| 			  fwrite($fp,"$buf");
 | |
| 			  zip_entry_close($zip_entry);
 | |
| 			  fclose($fp);
 | |
| 			}
 | |
| 		}
 | |
| 	  }
 | |
| 	  zip_close($zip);
 | |
| 	}	
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Walk recoursively in a folder and call a callback function on every
 | |
|  * dir entry.
 | |
|  * args:
 | |
|  * 	$dir		string		base dir to walk
 | |
|  * 	$callback	function	callback function
 | |
|  *  $sort		int			0: ascending, 1: descending
 | |
|  * 	$cb_argv	any			extra value passed to callback
 | |
|  * 
 | |
|  * callback signature:
 | |
|  * function name($fn, $dir [, $argv])
 | |
|  * 	$fn		string		full dir entry name
 | |
|  * 	$dir	string		start dir path
 | |
|  *  $argv	any			user value to callback
 | |
|  * 
 | |
|  */
 | |
| function up_walktree($dir, $callback=Null, $sort=0, $cb_argv=Null ,  $startdir=Null){
 | |
| 	if (is_null($callback)) return;
 | |
| 	if (is_null($startdir)) $startdir = $dir;
 | |
| 	$res = scandir($dir, $sort);
 | |
| 	foreach($res as $i=>$v){
 | |
| 		if ($v!="." && $v!=".."){
 | |
| 			$fn = $dir."/".$v;
 | |
| 			if ($sort==0) $callback($fn, $startdir, $cb_argv);	
 | |
| 			if (is_dir($fn)) up_walktree($fn, $callback, $sort, $cb_argv, $startdir);
 | |
| 			if ($sort==1) $callback($fn, $startdir, $cb_argv);	
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| }
 | |
| 
 | |
| function up_copy($fn, $dir){
 | |
| 	global $up_countfiles, $up_totalfiles, $up_lastp;
 | |
| 	$up_countfiles++; $prc=(int)(((float)$up_countfiles/(float)$up_totalfiles)*100);
 | |
| 	
 | |
| 	if (strpos($fn, ".gitignore")>-1 || strpos($fn, ".htaccess")>-1) return;  
 | |
| 	$ddest = dirname(dirname(__file__));
 | |
| 	$fd = str_replace($dir, $ddest, $fn);
 | |
| 	
 | |
| 	if (is_dir($fn) && !is_dir($fd)) {
 | |
| 		$re=mkdir($fd,0777,true);
 | |
| 	}
 | |
| 	if (!is_dir($fn)){
 | |
| 		$re=copy($fn, $fd);
 | |
| 	}
 | |
| 	
 | |
| 	if ($re===false) { 
 | |
| 		out("ERROR. Abort."); 
 | |
| 		killme();
 | |
| 	}
 | |
| 	out("copy@Copy@$prc%");
 | |
| }
 | |
| 
 | |
| function up_ftp($fn, $dir, $argv){
 | |
| 	global $up_countfiles, $up_totalfiles, $up_lastp;
 | |
| 	$up_countfiles++; $prc=(int)(((float)$up_countfiles/(float)$up_totalfiles)*100);
 | |
| 
 | |
| 	if (strpos($fn, ".gitignore")>-1 || strpos($fn, ".htaccess")>-1) return;
 | |
| 	
 | |
| 	list($ddest, $conn_id) = $argv;
 | |
| 	$l = strlen($ddest)-1;
 | |
| 	if (substr($ddest,$l,1)=="/") $ddest = substr($ddest,0,$l);
 | |
| 	$fd = str_replace($dir, $ddest, $fn);
 | |
| 	
 | |
| 	if (is_dir($fn)){
 | |
| 		if (ftp_nlist($conn_id, $fd)===false) { 
 | |
| 			$ret = ftp_mkdir($conn_id, $fd);
 | |
| 		} else {
 | |
| 			$ret=true;
 | |
| 		}
 | |
| 	} else {
 | |
| 		$ret = ftp_put($conn_id, $fd, $fn, FTP_BINARY); 
 | |
| 	}
 | |
| 	if (!$ret) { 
 | |
| 		out("ERROR. Abort."); 
 | |
| 		killme();
 | |
| 	} 
 | |
| 	out("copy@Copy@$prc%");
 | |
| }
 | |
| 
 | |
| function up_rm($fn, $dir){
 | |
| 	if (is_dir($fn)){
 | |
| 		rmdir($fn);
 | |
| 	} else {
 | |
| 		unlink($fn);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| function up_dlfile($url, $file) {
 | |
| 	$in = fopen ($url, "r");
 | |
| 	$out = fopen ($file, "w");
 | |
| 	
 | |
| 	$fs = filesize($url);
 | |
| 	
 | |
| 
 | |
| 	if (!$in || !$out) return false;
 | |
| 	
 | |
| 	$s=0; $count=0;
 | |
| 	while (!feof ($in)) {
 | |
| 		$line = fgets ($in, 1024);
 | |
| 		fwrite( $out, $line);
 | |
| 		
 | |
| 		$count++; $s += strlen($line);
 | |
| 		if ($count==50){
 | |
| 			$count=0;
 | |
| 			$sp=$s/1024.0; $ex="Kb";
 | |
| 			if ($sp>1024) { $sp=$sp/1024; $ex="Mb"; }
 | |
| 			if ($sp>1024) { $sp=$sp/1024; $ex="Gb"; }
 | |
| 			$sp = ((int)($sp*100))/100;
 | |
| 			out("dwl@Download@".$sp.$ex);
 | |
| 		}
 | |
| 	}
 | |
| 	fclose($in);
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| function doUpdate($remotefile, $ftpdata=false){
 | |
| 	global $up_totalfiles;
 | |
| 	
 | |
| 	
 | |
| 	$localtmpfile = tempnam("/tmp", "fk");
 | |
| 	out("dwl@Download@starting...");
 | |
| 	$rt= up_dlfile($remotefile, $localtmpfile);
 | |
| 	if ($rt==false || filesize($localtmpfile)==0){
 | |
| 		out("dwl@Download@ERROR.");
 | |
| 		unlink($localtmpfile);
 | |
| 		return;
 | |
| 	}
 | |
| 	out("dwl@Download@Ok.");
 | |
| 	
 | |
| 	out("unzip@Unzip@");
 | |
| 	$tmpdirname = $localfile."ex";
 | |
| 	mkdir($tmpdirname);
 | |
| 	up_unzip($localtmpfile, $tmpdirname);
 | |
| 	$basedir = glob($tmpdirname."/*"); $basedir=$basedir[0];
 | |
| 	out ("unzip@Unzip@Ok.");
 | |
| 	
 | |
| 	$up_totalfiles = up_count($basedir."/");
 | |
| 	
 | |
| 	if (canWeWrite()){
 | |
| 		out("copy@Copy@");
 | |
| 		up_walktree($basedir, 'up_copy');
 | |
| 	}
 | |
| 	if ($ftpdata!==false && is_array($ftpdata) && $ftpdata['ftphost']!="" ){
 | |
| 		out("ftpcon@Connect to FTP@");
 | |
| 		$conn_id = ftp_connect($ftpdata['ftphost']);
 | |
| 		$login_result = ftp_login($conn_id, $ftpdata['ftpuser'], $ftpdata['ftppwd']);
 | |
| 		
 | |
| 		if ((!$conn_id) || (!$login_result)) { 
 | |
| 			out("ftpcon@Connect to FTP@FAILED");
 | |
| 			up_clean($tmpdirname, $localtmpfile); 
 | |
| 			return;
 | |
| 		} else {
 | |
| 			out("ftpcon@Connect to FTP@Ok.");
 | |
| 		}
 | |
| 		out("copy@Copy@");
 | |
| 		up_walktree($basedir, 'up_ftp', 0, array( $ftpdata['ftppath'], $conn_id));
 | |
|  
 | |
| 		ftp_close($conn_id);
 | |
| 	}
 | |
| 
 | |
| 	up_clean($tmpdirname, $localtmpfile); 
 | |
| 	
 | |
| }
 | |
| 
 | |
| function up_clean($tmpdirname, $localtmpfile){
 | |
| 	out("clean@Clean up@");
 | |
| 	unlink($localtmpfile);
 | |
| 	up_walktree($tmpdirname, 'up_rm', 1);
 | |
| 	rmdir($tmpdirname);
 | |
| 	out("clean@Clean up@Ok.");
 | |
| }
 |