]> git.mxchange.org Git - friendica.git/blobdiff - include/remoteupdate.php
First test for friendika "live" update
[friendica.git] / include / remoteupdate.php
diff --git a/include/remoteupdate.php b/include/remoteupdate.php
new file mode 100644 (file)
index 0000000..aa30da0
--- /dev/null
@@ -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.");
+}