Merge pull request #139 from fabrixxm/update
Experiment with on-line update
This commit is contained in:
commit
f35a61761a
6 changed files with 616 additions and 8 deletions
157
include/jquery.htmlstream.js
Normal file
157
include/jquery.htmlstream.js
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
/* jQuery ajax stream plugin
|
||||||
|
* Version 0.1
|
||||||
|
* Copyright (C) 2009 Chris Tarquini
|
||||||
|
* Licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License (http://creativecommons.org/licenses/by-sa/3.0/)
|
||||||
|
* Permissions beyond the scope of this license may be available by contacting petros000[at]hotmail.com.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function($) {
|
||||||
|
|
||||||
|
// Save the original AJAX function
|
||||||
|
var ajax_old = $.ajax;
|
||||||
|
var get_old = $.get;
|
||||||
|
var post_old = $.post;
|
||||||
|
var active = true;
|
||||||
|
// Add our settings
|
||||||
|
$.ajaxSetup({stream: false,pollInterval: 500/*, onDataRecieved: function(){}*/ });
|
||||||
|
$.enableAjaxStream = function(enable)
|
||||||
|
{
|
||||||
|
if(typeof enable == 'undefined') enable = !active;
|
||||||
|
if(!enable)
|
||||||
|
{
|
||||||
|
$.ajax = ajax_old;
|
||||||
|
$.get = get_old;
|
||||||
|
$.post = post_old;
|
||||||
|
active = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$.ajax = ajax_stream;
|
||||||
|
$.get = ajax_get_stream;
|
||||||
|
$.post = ajax_post_stream;
|
||||||
|
active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
var ajax_stream = $.ajax = function(options)
|
||||||
|
{
|
||||||
|
//copied from original ajax function
|
||||||
|
options = jQuery.extend(true, options, jQuery.extend(true, {}, jQuery.ajaxSettings, options));
|
||||||
|
if(options.stream)
|
||||||
|
{
|
||||||
|
var timer = 0;
|
||||||
|
var offset = 0;
|
||||||
|
var xmlhttp = null;
|
||||||
|
var lastlen = 0;
|
||||||
|
var done = false;
|
||||||
|
var hook = function(xhr)
|
||||||
|
{
|
||||||
|
xmlhttp = xhr;
|
||||||
|
checkagain();
|
||||||
|
}
|
||||||
|
var fix = function(){ check('stream'); };// fixes weird bug with random numbers as arg
|
||||||
|
var checkagain = function(){if(!done) timer = setTimeout(fix,options.pollInterval);}
|
||||||
|
var check = function(status)
|
||||||
|
{
|
||||||
|
if(typeof status == 'undefined') status = "stream";
|
||||||
|
if(xmlhttp.status < 3) return; //only get the latest packet if data has been sent
|
||||||
|
var text = xmlhttp.responseText;
|
||||||
|
if(status == 'stream') //if we arent streaming then just flush the buffer
|
||||||
|
{
|
||||||
|
if(text.length <= lastlen) { checkagain(); return;}
|
||||||
|
lastlength = text.length;
|
||||||
|
if(offset == text.length) { checkagain(); return;}
|
||||||
|
}
|
||||||
|
var pkt = text.substr(offset);
|
||||||
|
offset = text.length;
|
||||||
|
if($.isFunction(options.OnDataRecieved))
|
||||||
|
{
|
||||||
|
options.OnDataRecieved(pkt, status, xmlhttp.responseText, xmlhttp);
|
||||||
|
}
|
||||||
|
if(xmlhttp.status != 4)
|
||||||
|
checkagain();
|
||||||
|
}
|
||||||
|
var complete = function(xhr,s)
|
||||||
|
{
|
||||||
|
clearTimeout(timer);//done..stop polling
|
||||||
|
done = true;
|
||||||
|
// send final call
|
||||||
|
check(s);
|
||||||
|
}
|
||||||
|
// If the complete callback is set create a new callback that calls the users and outs
|
||||||
|
if($.isFunction(options.success))
|
||||||
|
{
|
||||||
|
var oc = options.success;
|
||||||
|
options.success = function(xhr,s){ complete(xhr,s); oc(xhr,s);};
|
||||||
|
|
||||||
|
}
|
||||||
|
else options.success = complete;
|
||||||
|
// Set up our hook on the beforeSend
|
||||||
|
if($.isFunction(options.beforeSend))
|
||||||
|
{
|
||||||
|
var obs = options.beforeSend;
|
||||||
|
options.beforeSend = function(xhr){ obs(xhr); hook(xhr);};
|
||||||
|
}
|
||||||
|
else options.beforeSend = hook;
|
||||||
|
|
||||||
|
}
|
||||||
|
ajax_old(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
var ajax_get_stream = $.get = function(url,data,callback,type,stream)
|
||||||
|
{
|
||||||
|
if($.isFunction(data))
|
||||||
|
{
|
||||||
|
var orgcb = callback;
|
||||||
|
callback = data;
|
||||||
|
if($.isFunction(orgcb))
|
||||||
|
{
|
||||||
|
stream = orgcb;
|
||||||
|
}
|
||||||
|
data = null;
|
||||||
|
}
|
||||||
|
if($.isFunction(type))
|
||||||
|
{
|
||||||
|
stream = type;
|
||||||
|
type = undefined;
|
||||||
|
}
|
||||||
|
var dostream = $.isFunction(stream);
|
||||||
|
return jQuery.ajax({
|
||||||
|
type: "GET",
|
||||||
|
url: url,
|
||||||
|
data: data,
|
||||||
|
success: callback,
|
||||||
|
dataType: type,
|
||||||
|
stream: dostream,
|
||||||
|
OnDataRecieved: stream
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var ajax_post_stream = $.post = function(url,data,callback,type,stream)
|
||||||
|
{
|
||||||
|
if($.isFunction(data))
|
||||||
|
{
|
||||||
|
var orgcb = callback;
|
||||||
|
callback = data;
|
||||||
|
}
|
||||||
|
if($.isFunction(type))
|
||||||
|
{
|
||||||
|
stream = type;
|
||||||
|
type = undefined;
|
||||||
|
}
|
||||||
|
var dostream = $.isFunction(stream);
|
||||||
|
return jQuery.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: url,
|
||||||
|
data: data,
|
||||||
|
success: callback,
|
||||||
|
dataType: type,
|
||||||
|
stream: dostream,
|
||||||
|
OnDataRecieved: stream
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
|
|
261
include/remoteupdate.php
Normal file
261
include/remoteupdate.php
Normal file
|
@ -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.");
|
||||||
|
}
|
|
@ -3,7 +3,7 @@
|
||||||
/**
|
/**
|
||||||
* Friendika admin
|
* Friendika admin
|
||||||
*/
|
*/
|
||||||
|
require_once("include/remoteupdate.php");
|
||||||
|
|
||||||
function admin_init(&$a) {
|
function admin_init(&$a) {
|
||||||
if(!is_site_admin()) {
|
if(!is_site_admin()) {
|
||||||
|
@ -41,6 +41,9 @@ function admin_post(&$a){
|
||||||
case 'logs':
|
case 'logs':
|
||||||
admin_page_logs_post($a);
|
admin_page_logs_post($a);
|
||||||
break;
|
break;
|
||||||
|
case 'update':
|
||||||
|
admin_page_remoteupdate_post($a);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +65,8 @@ function admin_content(&$a) {
|
||||||
$aside = Array(
|
$aside = Array(
|
||||||
'site' => Array($a->get_baseurl()."/admin/site/", t("Site") , "site"),
|
'site' => Array($a->get_baseurl()."/admin/site/", t("Site") , "site"),
|
||||||
'users' => Array($a->get_baseurl()."/admin/users/", t("Users") , "users"),
|
'users' => Array($a->get_baseurl()."/admin/users/", t("Users") , "users"),
|
||||||
'plugins'=> Array($a->get_baseurl()."/admin/plugins/", t("Plugins") , "plugins")
|
'plugins'=> Array($a->get_baseurl()."/admin/plugins/", t("Plugins") , "plugins"),
|
||||||
|
'update' => Array($a->get_baseurl()."/admin/update/", t("Update") , "update")
|
||||||
);
|
);
|
||||||
|
|
||||||
/* get plugins admin page */
|
/* get plugins admin page */
|
||||||
|
@ -107,6 +111,9 @@ function admin_content(&$a) {
|
||||||
case 'logs':
|
case 'logs':
|
||||||
$o = admin_page_logs($a);
|
$o = admin_page_logs($a);
|
||||||
break;
|
break;
|
||||||
|
case 'update':
|
||||||
|
$o = admin_page_remoteupdate($a);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
notice( t("Item not found.") );
|
notice( t("Item not found.") );
|
||||||
}
|
}
|
||||||
|
@ -655,3 +662,54 @@ function admin_page_logs(&$a){
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function admin_page_remoteupdate_post(&$a) {
|
||||||
|
// this function should be called via ajax post
|
||||||
|
if(!is_site_admin()) {
|
||||||
|
return login(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (x($_POST,'remotefile') && $_POST['remotefile']!=""){
|
||||||
|
$remotefile = $_POST['remotefile'];
|
||||||
|
$ftpdata = (x($_POST['ftphost'])?$_POST:false);
|
||||||
|
doUpdate($remotefile, $ftpdata);
|
||||||
|
} else {
|
||||||
|
echo "No remote file to download. Abort!";
|
||||||
|
}
|
||||||
|
|
||||||
|
killme();
|
||||||
|
}
|
||||||
|
|
||||||
|
function admin_page_remoteupdate(&$a) {
|
||||||
|
if(!is_site_admin()) {
|
||||||
|
return login(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
$canwrite = canWeWrite();
|
||||||
|
$canftp = function_exists('ftp_connect');
|
||||||
|
|
||||||
|
$needupdate = true;
|
||||||
|
$u = checkUpdate();
|
||||||
|
if (!is_array($u)){
|
||||||
|
$needupdate = false;
|
||||||
|
$u = array('','','');
|
||||||
|
}
|
||||||
|
|
||||||
|
$tpl = get_markup_template("admin_remoteupdate.tpl");
|
||||||
|
return replace_macros($tpl, array(
|
||||||
|
'$baseurl' => $a->get_baseurl(),
|
||||||
|
'$submit' => t("Update now"),
|
||||||
|
'$close' => t("Close"),
|
||||||
|
'$localversion' => FRIENDIKA_VERSION,
|
||||||
|
'$remoteversion' => $u[1],
|
||||||
|
'$needupdate' => $needupdate,
|
||||||
|
'$canwrite' => $canwrite,
|
||||||
|
'$canftp' => $canftp,
|
||||||
|
'$ftphost' => array('ftphost', t("FTP Host"), '',''),
|
||||||
|
'$ftppath' => array('ftppath', t("FTP Path"), '/',''),
|
||||||
|
'$ftpuser' => array('ftpuser', t("FTP User"), '',''),
|
||||||
|
'$ftppwd' => array('ftppwd', t("FTP Password"), '',''),
|
||||||
|
'$remotefile'=>array('remotefile','', $u['2'],'')
|
||||||
|
));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -17,6 +17,10 @@
|
||||||
<li class='admin link $admin.plugins.2'><a href='$admin.plugins.0'>$admin.plugins.1</a></li>
|
<li class='admin link $admin.plugins.2'><a href='$admin.plugins.0'>$admin.plugins.1</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<ul class='admin linklist'>
|
||||||
|
<li class='admin link $admin.update.2'><a href='$admin.update.0'>$admin.update.1</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
{{ if $admin.plugins_admin }}<h4>Plugins</h4>{{ endif }}
|
{{ if $admin.plugins_admin }}<h4>Plugins</h4>{{ endif }}
|
||||||
<ul class='admin linklist'>
|
<ul class='admin linklist'>
|
||||||
|
@ -30,3 +34,4 @@
|
||||||
<ul class='admin linklist'>
|
<ul class='admin linklist'>
|
||||||
<li class='admin link $admin.logs.2'><a href='$admin.logs.0'>$admin.logs.1</a></li>
|
<li class='admin link $admin.logs.2'><a href='$admin.logs.0'>$admin.logs.1</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
98
view/admin_remoteupdate.tpl
Normal file
98
view/admin_remoteupdate.tpl
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
<script src="include/jquery.htmlstream.js"></script>
|
||||||
|
<script>
|
||||||
|
/* ajax updater */
|
||||||
|
function updateEnd(data){
|
||||||
|
//$("#updatepopup .panel_text").html(data);
|
||||||
|
$("#remoteupdate_form").find("input").removeAttr('disabled');
|
||||||
|
$(".panel_action_close").fadeIn()
|
||||||
|
}
|
||||||
|
function updateOn(data){
|
||||||
|
|
||||||
|
var patt=/§([^§]*)§/g;
|
||||||
|
var matches = data.match(patt);
|
||||||
|
$(matches).each(function(id,data){
|
||||||
|
data = data.replace(/§/g,"");
|
||||||
|
d = data.split("@");
|
||||||
|
console.log(d);
|
||||||
|
elm = $("#updatepopup .panel_text #"+d[0]);
|
||||||
|
html = "<div id='"+d[0]+"' class='progress'>"+d[1]+"<span>"+d[2]+"</span></div>";
|
||||||
|
if (elm.length==0){
|
||||||
|
$("#updatepopup .panel_text").append(html);
|
||||||
|
} else {
|
||||||
|
$(elm).replaceWith(html);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function(){
|
||||||
|
$("#remoteupdate_form").submit(function(){
|
||||||
|
var data={};
|
||||||
|
$(this).find("input").each(function(i, e){
|
||||||
|
name = $(e).attr('name');
|
||||||
|
value = $(e).val();
|
||||||
|
e.disabled = true;
|
||||||
|
data[name]=value;
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#updatepopup .panel_text").html("");
|
||||||
|
$("#updatepopup").show();
|
||||||
|
$("#updatepopup .panel").hide().slideDown(500);
|
||||||
|
$(".panel_action_close").hide().click(function(){
|
||||||
|
$("#updatepopup .panel").slideUp(500, function(){
|
||||||
|
$("#updatepopup").hide();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$.post(
|
||||||
|
$(this).attr('action'),
|
||||||
|
data,
|
||||||
|
updateEnd,
|
||||||
|
'text',
|
||||||
|
updateOn
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
return false;
|
||||||
|
})
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<div id="updatepopup" class="popup">
|
||||||
|
<div class="background"></div>
|
||||||
|
<div class="panel">
|
||||||
|
<div class="panel_in">
|
||||||
|
<h1>Friendika Update</h1>
|
||||||
|
<div class="panel_text"></div>
|
||||||
|
<div class="panel_actions">
|
||||||
|
<input type="button" value="$close" class="panel_action_close">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="adminpage">
|
||||||
|
<dl> <dt>Your version:</dt><dd>$localversion</dd> </dl>
|
||||||
|
{{ if $needupdate }}
|
||||||
|
<dl> <dt>New version:</dt><dd>$remoteversion</dd> </dl>
|
||||||
|
|
||||||
|
<form id="remoteupdate_form" method="POST" action="$baseurl/admin/update">
|
||||||
|
<input type="hidden" name="$remotefile.0" value="$remotefile.2">
|
||||||
|
|
||||||
|
{{ if $canwrite }}
|
||||||
|
<div class="submit"><input type="submit" name="remoteupdate" value="$submit" /></div>
|
||||||
|
{{ else }}
|
||||||
|
<h3>Your friendika installation is not writable by web server.</h3>
|
||||||
|
{{ if $canftp }}
|
||||||
|
<p>You can try to update via FTP</p>
|
||||||
|
{{ inc field_input.tpl with $field=$ftphost }}{{ endinc }}
|
||||||
|
{{ inc field_input.tpl with $field=$ftppath }}{{ endinc }}
|
||||||
|
{{ inc field_input.tpl with $field=$ftpuser }}{{ endinc }}
|
||||||
|
{{ inc field_password.tpl with $field=$ftppwd }}{{ endinc }}
|
||||||
|
<div class="submit"><input type="submit" name="remoteupdate" value="$submit" /></div>
|
||||||
|
{{ endif }}
|
||||||
|
{{ endif }}
|
||||||
|
</form>
|
||||||
|
{{ else }}
|
||||||
|
<h4>No updates</h4>
|
||||||
|
{{ endif }}
|
||||||
|
</div>
|
|
@ -1943,7 +1943,6 @@ a.mail-list-link {
|
||||||
#install-dbuser-label,
|
#install-dbuser-label,
|
||||||
#install-dbpass-label,
|
#install-dbpass-label,
|
||||||
#install-dbdata-label,
|
#install-dbdata-label,
|
||||||
#install-admin-label,
|
|
||||||
#install-tz-desc {
|
#install-tz-desc {
|
||||||
float: left;
|
float: left;
|
||||||
width: 250px;
|
width: 250px;
|
||||||
|
@ -1955,8 +1954,7 @@ a.mail-list-link {
|
||||||
#install-dbhost,
|
#install-dbhost,
|
||||||
#install-dbuser,
|
#install-dbuser,
|
||||||
#install-dbpass,
|
#install-dbpass,
|
||||||
#install-dbdata,
|
#install-dbdata {
|
||||||
#install-admin {
|
|
||||||
float: left;
|
float: left;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
|
@ -1966,7 +1964,6 @@ a.mail-list-link {
|
||||||
#install-dbuser-end,
|
#install-dbuser-end,
|
||||||
#install-dbpass-end,
|
#install-dbpass-end,
|
||||||
#install-dbdata-end,
|
#install-dbdata-end,
|
||||||
#install-admin-end,
|
|
||||||
#install-tz-end {
|
#install-tz-end {
|
||||||
clear: both;
|
clear: both;
|
||||||
}
|
}
|
||||||
|
@ -2573,6 +2570,38 @@ a.mail-list-link {
|
||||||
#adminpage table#users img { width: 16px; height: 16px; }
|
#adminpage table#users img { width: 16px; height: 16px; }
|
||||||
#adminpage table tr:hover { background-color: #bbc7d7; }
|
#adminpage table tr:hover { background-color: #bbc7d7; }
|
||||||
#adminpage .selectall { text-align: right; }
|
#adminpage .selectall { text-align: right; }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* UPDATE
|
||||||
|
*/
|
||||||
|
.popup {
|
||||||
|
width: 100%; height: 100%;
|
||||||
|
top:0px; left:0px;
|
||||||
|
position: absolute;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popup .background {
|
||||||
|
background-color: rgba(0,0,0,128);
|
||||||
|
opacity: 0.5;
|
||||||
|
width: 100%; height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top:0px; left:0px;
|
||||||
|
}
|
||||||
|
.popup .panel {
|
||||||
|
top:25%;left:25%;width:50%;height:50%;
|
||||||
|
padding: 1em;
|
||||||
|
position: absolute;
|
||||||
|
border: 4px solid #000000;
|
||||||
|
background-color: #FFFFFF;
|
||||||
|
}
|
||||||
|
.popup .panel .panel_text { display: block; overflow: auto; height: 80%; }
|
||||||
|
.popup .panel .panel_in { width: 100%; height: 100%; position: relative; }
|
||||||
|
.popup .panel .panel_actions { width: 100%; bottom: 4px; left: 0px; position: absolute; }
|
||||||
|
.panel_text .progress { width: 50%; overflow: hidden; height: auto; border: 1px solid #cccccc; margin-bottom: 5px}
|
||||||
|
.panel_text .progress span {float: right; display: block; width: 25%; background-color: #eeeeee; text-align: right;}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ICONS
|
* ICONS
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue