diff options
Diffstat (limited to 'include/remoteupdate.php')
-rw-r--r-- | include/remoteupdate.php | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/include/remoteupdate.php b/include/remoteupdate.php new file mode 100644 index 000000000..aa30da06f --- /dev/null +++ b/include/remoteupdate.php @@ -0,0 +1,261 @@ +<?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."); +} |