|
|
@@ -1,435 +0,0 @@ |
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* 本文件用于从镜像服务器获取升级信息与文件
|
|
|
|
* 并由用户自行控制升级
|
|
|
|
*
|
|
|
|
* @version $Id: update_guide.php 1 23:54 2010年7月20日Z tianya $
|
|
|
|
* @package DedeCMS.Administrator
|
|
|
|
* @copyright Copyright (c) 2020, DedeBIZ.COM
|
|
|
|
* @license https://www.dedebiz.com/license
|
|
|
|
* @link https://www.dedebiz.com
|
|
|
|
*/
|
|
|
|
require(dirname(__FILE__).'/config.php');
|
|
|
|
CheckPurview('sys_Edit');
|
|
|
|
@set_time_limit(0);
|
|
|
|
require(DEDEINC.'/inc/inc_fun_funAdmin.php');
|
|
|
|
require(DEDEINC.'/dedehttpdown.class.php');
|
|
|
|
|
|
|
|
function TestWriteAble($d)
|
|
|
|
{
|
|
|
|
$tfile = '_dedet.txt';
|
|
|
|
$fp = @fopen($d.$tfile,'w');
|
|
|
|
if(!$fp) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
fclose($fp);
|
|
|
|
$rs = @unlink($d.'/'.$tfile);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function GetDirName($filename)
|
|
|
|
{
|
|
|
|
$dirname = '../'.preg_replace("#[\\\\\/]{1,}#", '/', $filename);
|
|
|
|
$dirname = preg_replace("#([^\/]*)$#", '', $dirname);
|
|
|
|
return $dirname;
|
|
|
|
}
|
|
|
|
|
|
|
|
function TestIsFileDir($dirname)
|
|
|
|
{
|
|
|
|
$dirs = array('name'=>'', 'isdir'=>FALSE, 'writeable'=>FALSE);
|
|
|
|
$dirs['name'] = $dirname;
|
|
|
|
if(is_dir($dirname))
|
|
|
|
{
|
|
|
|
$dirs['isdir'] = TRUE;
|
|
|
|
$dirs['writeable'] = TestWriteAble($dirname);
|
|
|
|
}
|
|
|
|
return $dirs;
|
|
|
|
}
|
|
|
|
|
|
|
|
function MkTmpDir($tmpdir,$filename)
|
|
|
|
{
|
|
|
|
$basedir = DEDEDATA.'/'.$tmpdir;
|
|
|
|
$dirname = trim(preg_replace("#[\\\\\/]{1,}#", '/', $filename));
|
|
|
|
$dirname = preg_replace("#([^\/]*)$#","",$dirname);
|
|
|
|
if(!is_dir($basedir))
|
|
|
|
{
|
|
|
|
mkdir($basedir,0777);
|
|
|
|
}
|
|
|
|
if($dirname=='')
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
$dirs = explode('/', $dirname);
|
|
|
|
$curdir = $basedir;
|
|
|
|
foreach($dirs as $d)
|
|
|
|
{
|
|
|
|
$d = trim($d);
|
|
|
|
if(empty($d)) continue;
|
|
|
|
$curdir = $curdir.'/'.$d;
|
|
|
|
if(!is_dir($curdir))
|
|
|
|
{
|
|
|
|
mkdir($curdir, 0777) or die($curdir);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(empty($dopost)) $dopost = 'test';
|
|
|
|
|
|
|
|
//当前软件版本锁定文件
|
|
|
|
$verLockFile = DEDEDATA.'/admin/ver.txt';
|
|
|
|
|
|
|
|
$fp = fopen($verLockFile,'r');
|
|
|
|
$upTime = trim(fread($fp,64));
|
|
|
|
fclose($fp);
|
|
|
|
$oktime = substr($upTime,0,4).'-'.substr($upTime,4,2).'-'.substr($upTime,6,2);
|
|
|
|
|
|
|
|
/**
|
|
|
|
用AJAX获取最新版本信息
|
|
|
|
function _Test() { }
|
|
|
|
*/
|
|
|
|
if($dopost=='test')
|
|
|
|
{
|
|
|
|
AjaxHead();
|
|
|
|
//下载远程数据
|
|
|
|
$dhd = new DedeHttpDown();
|
|
|
|
$dhd->OpenUrl(DEDECDNURL.'/release/latest.txt');
|
|
|
|
$verlatest = trim($dhd->GetHtml());
|
|
|
|
$dhd->Close();
|
|
|
|
|
|
|
|
|
|
|
|
//echo "<xmp>";
|
|
|
|
//判断是否需要更新,并返回适合的结果
|
|
|
|
|
|
|
|
if(version_compare($verlatest, $cfg_version_detail,"<="))
|
|
|
|
{
|
|
|
|
$offUrl = SpGetNewInfo();
|
|
|
|
echo "<div class='updatedvt'><b>你系统版本最后更新时间为:{$oktime},当前没有可用的更新</b></div>\r\n";
|
|
|
|
echo "<iframe name='stafrm' src='{$offUrl}&uptime={$oktime}' frameborder='0' id='stafrm' width='100%' height='50'></iframe>";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
echo "<div style='width:98%'><form name='fup' action='update_guide.php' method='post' onsubmit='ShowWaitDiv()'>\r\n";
|
|
|
|
echo "<input type='hidden' name='dopost' value='getlist' />\r\n";
|
|
|
|
echo "<div class='upinfotitle'>当前有可用的更新,可以通过<a href='$cfg_biz_gitUrl' target='_blank'>代码托管</a>查看更新记录:</div>\r\n";
|
|
|
|
echo "<div style='line-height:32px'><button type='submit' name='sb1' class='btn btn-success btn-sm' style='cursor:pointer'>获取并安装</button>\r\n";
|
|
|
|
echo " </div>\r\n";
|
|
|
|
echo "</form></div>";
|
|
|
|
}
|
|
|
|
//echo "</xmp>";
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
忽略某个日期前的升级
|
|
|
|
function _Skip() { }
|
|
|
|
*/
|
|
|
|
else if($dopost=='skip')
|
|
|
|
{
|
|
|
|
AjaxHead();
|
|
|
|
$fp = fopen($verLockFile, 'w');
|
|
|
|
fwrite($fp, $vtime);
|
|
|
|
fclose($fp);
|
|
|
|
$offUrl = SpGetNewInfo();
|
|
|
|
echo "<div class='updatedvt'><b>你系统版本最后更新时间为:{$oktime},当前没有可用的更新。</b></div>\r\n";
|
|
|
|
echo "<iframe name='stafrm' src='{$offUrl}&uptime={$oktime}' frameborder='0' id='stafrm' width='100%' height='60'></iframe>";
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
else if($dopost=='skipback')
|
|
|
|
{
|
|
|
|
$fp = fopen($verLockFile, 'w');
|
|
|
|
fwrite($fp, $vtime);
|
|
|
|
fclose($fp);
|
|
|
|
ShowMsg("成功跳过这些更新!", "index_body.php");
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
获取升级文件列表
|
|
|
|
function _GetList() { }
|
|
|
|
*/
|
|
|
|
else if($dopost=='getlist')
|
|
|
|
{
|
|
|
|
$upitemsArr = explode(',', $upitems);
|
|
|
|
rsort($upitemsArr);
|
|
|
|
|
|
|
|
$tmpdir = substr(md5($cfg_cookie_encode), 0, 16);
|
|
|
|
|
|
|
|
$dhd = new DedeHttpDown();
|
|
|
|
$fileArr = array();
|
|
|
|
$f = 0;
|
|
|
|
foreach($upitemsArr as $upitem)
|
|
|
|
{
|
|
|
|
$durl = UPDATEHOST.$cfg_soft_lang.'/'.$upitem.'.file.txt';
|
|
|
|
$dhd->OpenUrl($durl);
|
|
|
|
$filelist = $dhd->GetHtml();
|
|
|
|
$filelist = trim( preg_replace("#[\r\n]{1,}#", "\n", $filelist) );
|
|
|
|
if(!empty($filelist))
|
|
|
|
{
|
|
|
|
$filelists = explode("\n", $filelist);
|
|
|
|
foreach($filelists as $filelist)
|
|
|
|
{
|
|
|
|
$filelist = trim($filelist);
|
|
|
|
if(empty($filelist)) continue;
|
|
|
|
$fs = explode(',', $filelist);
|
|
|
|
if( empty($fs[1]) )
|
|
|
|
{
|
|
|
|
$fs[1] = $upitem." 常规功能更新文件";
|
|
|
|
}
|
|
|
|
if(!isset($fileArr[$fs[0]]))
|
|
|
|
{
|
|
|
|
$fileArr[$fs[0]] = $upitem." ".trim($fs[1]);
|
|
|
|
$f++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$dhd->Close();
|
|
|
|
|
|
|
|
$allFileList = '';
|
|
|
|
if($f==0)
|
|
|
|
{
|
|
|
|
$allFileList = "<font color='green'><b>没发现可用的文件列表信息,可能是官方服务器存在问题,请稍后再尝试!</b></font>";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$allFileList .= "<div style='width:98%'><form name='fup' action='update_guide.php' method='post'>\r\n";
|
|
|
|
$allFileList .= "<input type='hidden' name='vtime' value='$vtime' />\r\n";
|
|
|
|
$allFileList .= "<input type='hidden' name='dopost' value='getfiles' />\r\n";
|
|
|
|
$allFileList .= "<input type='hidden' name='upitems' value='$upitems' />\r\n";
|
|
|
|
$allFileList .= "<div class='upinfotitle'>以下是需要下载的更新文件(路径相对于DedeCMS的根目录):</div>\r\n";
|
|
|
|
$filelists = explode("\n",$filelist);
|
|
|
|
foreach($fileArr as $k=>$v)
|
|
|
|
{
|
|
|
|
$allFileList .= "<div class='verline'><input type='checkbox' name='files[]' value='{$k}' checked='checked' /> $k({$v})</div>\r\n";
|
|
|
|
}
|
|
|
|
$allFileList .= "<div class='verline'>";
|
|
|
|
$allFileList .= "文件临时存放目录:../data/<input type='text' name='tmpdir' style='width:200px' value='$tmpdir' /><br />\r\n";
|
|
|
|
$allFileList .= "<input type='checkbox' name='skipnodir' value='1' checked='checked' /> 跳过系统中没有的文件夹(通常是可选模块的补丁)</div>\r\n";
|
|
|
|
$allFileList .= "<div style='line-height:36px;background:#F8FEDA'> \r\n";
|
|
|
|
$allFileList .= "<input type='submit' name='sb1' value=' 下载并应用这些补丁 ' class='np coolbg' style='cursor:pointer' />\r\n";
|
|
|
|
$allFileList .="</form></div>";
|
|
|
|
}
|
|
|
|
|
|
|
|
include DedeInclude('templets/update_guide_getlist.htm');
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
下载文件(保存需下载内容列表)
|
|
|
|
function _GetFiles() { }
|
|
|
|
*/
|
|
|
|
else if($dopost=='getfilesstart')
|
|
|
|
{
|
|
|
|
//update_guide.php?dopost=down&curfile=0
|
|
|
|
$msg = "如果检测时发现你没安装模块的文件夹有错误,可不必理会<br />";
|
|
|
|
$msg .= "<a href=update_guide.php?dopost=down&curfile=0>确认目录状态都正常后,请点击开始下载文件>></a><br />";
|
|
|
|
ShowMsg($msg,"javascript:;");
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
else if($dopost=='getfiles')
|
|
|
|
{
|
|
|
|
$cacheFiles = DEDEDATA.'/cache/updatetmp.inc';
|
|
|
|
$skipnodir = (isset($skipnodir) ? 1 : 0);
|
|
|
|
$adminDir = preg_replace("#(.*)[\/\\\\]#", "", dirname(__FILE__));
|
|
|
|
|
|
|
|
if(!isset($files))
|
|
|
|
{
|
|
|
|
$doneStr = "<p align='center' style='color:red'><br />你没有指定任何需要下载更新的文件,是否跳过这些更新?<br /><br />";
|
|
|
|
$doneStr .= "<a href='update_guide.php?dopost=skipback&vtime=$vtime' class='np coolbg'>[跳过这些更新]</a> ";
|
|
|
|
$doneStr .= "<a href='index_body.php' class='np coolbg'>[保留提示以后再进行操作]</a></p>";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$fp = fopen($cacheFiles, 'w');
|
|
|
|
fwrite($fp, '<'.'?php'."\r\n");
|
|
|
|
fwrite($fp, '$tmpdir = "'.$tmpdir.'";'."\r\n");
|
|
|
|
fwrite($fp, '$vtime = '.$vtime.';'."\r\n");
|
|
|
|
$dirs = array();
|
|
|
|
$i = -1;
|
|
|
|
foreach($files as $filename)
|
|
|
|
{
|
|
|
|
$tfilename = $filename;
|
|
|
|
if( preg_match("#^dede\/#i", $filename) )
|
|
|
|
{
|
|
|
|
$tfilename = preg_replace("#^dede\/#", $adminDir.'/', $filename);
|
|
|
|
}
|
|
|
|
$curdir = GetDirName($tfilename);
|
|
|
|
if( !isset($dirs[$curdir]) )
|
|
|
|
{
|
|
|
|
$dirs[$curdir] = TestIsFileDir($curdir);
|
|
|
|
}
|
|
|
|
if($skipnodir==1 && $dirs[$curdir]['isdir'] == FALSE)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
@mkdir($curdir, 0777);
|
|
|
|
$dirs[$curdir] = TestIsFileDir($curdir);
|
|
|
|
}
|
|
|
|
$i++;
|
|
|
|
fwrite($fp, '$files['.$i.'] = "'.$filename.'";'."\r\n");
|
|
|
|
}
|
|
|
|
fwrite($fp, '$fileConut = '.$i.';'."\r\n");
|
|
|
|
|
|
|
|
$items = explode(',', $upitems);
|
|
|
|
foreach($items as $sqlfile)
|
|
|
|
{
|
|
|
|
fwrite($fp,'$sqls[] = "'.$sqlfile.'.sql";'."\r\n");
|
|
|
|
}
|
|
|
|
fwrite($fp, '?'.'>');
|
|
|
|
fclose($fp);
|
|
|
|
|
|
|
|
$dirinfos = '';
|
|
|
|
if($i > -1)
|
|
|
|
{
|
|
|
|
$dirinfos = '<tr bgcolor="#ffffff"><td colspan="2">';
|
|
|
|
$dirinfos .= "本次升级需要在下面文件夹写入更新文件,请注意文件夹是否有写入权限:<br />\r\n";
|
|
|
|
foreach($dirs as $curdir)
|
|
|
|
{
|
|
|
|
$dirinfos .= $curdir['name']." 状态:".($curdir['writeable'] ? "[√正常]" : "<font color='red'>[×不可写]</font>")."<br />\r\n";
|
|
|
|
}
|
|
|
|
$dirinfos .= "</td></tr>\r\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
$doneStr = "<iframe name='stafrm' src='update_guide.php?dopost=getfilesstart' frameborder='0' id='stafrm' width='100%' height='100%'></iframe>\r\n";
|
|
|
|
}
|
|
|
|
include DedeInclude('templets/update_guide_getfiles.htm');
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
下载文件,具体操作步骤
|
|
|
|
function _Down() { }
|
|
|
|
*/
|
|
|
|
else if($dopost=='down')
|
|
|
|
{
|
|
|
|
$cacheFiles = DEDEDATA.'/cache/updatetmp.inc';
|
|
|
|
require_once($cacheFiles);
|
|
|
|
|
|
|
|
if(empty($startup))
|
|
|
|
{
|
|
|
|
if($fileConut==-1 || $curfile > $fileConut)
|
|
|
|
{
|
|
|
|
ShowMsg("已下载所有文件,开始下载数据库升级文件...","update_guide.php?dopost=down&startup=1");
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
|
|
|
|
//检查临时文件保存目录是否可用
|
|
|
|
MkTmpDir($tmpdir, $files[$curfile]);
|
|
|
|
|
|
|
|
$downfile = UPDATEHOST.$cfg_soft_lang.'/source/'.$files[$curfile];
|
|
|
|
|
|
|
|
$dhd = new DedeHttpDown();
|
|
|
|
$dhd->OpenUrl($downfile);
|
|
|
|
$dhd->SaveToBin(DEDEDATA.'/'.$tmpdir.'/'.$files[$curfile]);
|
|
|
|
$dhd->Close();
|
|
|
|
|
|
|
|
ShowMsg("成功下载并保存文件:{$files[$curfile]}; 继续下载下一个文件。","update_guide.php?dopost=down&curfile=".($curfile+1));
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
MkTmpDir($tmpdir, 'sql.txt');
|
|
|
|
$dhd = new DedeHttpDown();
|
|
|
|
$ct = '';
|
|
|
|
foreach($sqls as $sql)
|
|
|
|
{
|
|
|
|
$downfile = UPDATEHOST.$cfg_soft_lang.'/'.$sql;
|
|
|
|
$dhd->OpenUrl($downfile);
|
|
|
|
$ct .= $dhd->GetHtml();
|
|
|
|
}
|
|
|
|
$dhd->Close();
|
|
|
|
$truefile = DEDEDATA.'/'.$tmpdir.'/sql.txt';
|
|
|
|
$fp = fopen($truefile, 'w');
|
|
|
|
fwrite($fp, $ct);
|
|
|
|
fclose($fp);
|
|
|
|
|
|
|
|
ShowMsg("完成所有远程文件获取操作:<a href='update_guide.php?dopost=apply'><<点击此开始直接升级>></a><br />你也可以直接使用[../data/{$tmpdir}]目录的文件手动升级。","javascript:;");
|
|
|
|
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
应用升级
|
|
|
|
function _ApplyUpdate() { }
|
|
|
|
*/
|
|
|
|
else if($dopost=='apply')
|
|
|
|
{
|
|
|
|
$cacheFiles = DEDEDATA.'/cache/updatetmp.inc';
|
|
|
|
require_once($cacheFiles);
|
|
|
|
|
|
|
|
if(empty($step))
|
|
|
|
{
|
|
|
|
$truefile = DEDEDATA.'/'.$tmpdir.'/sql.txt';
|
|
|
|
$fp = fopen($truefile, 'r');
|
|
|
|
$sql = @fread($fp, filesize($truefile));
|
|
|
|
fclose($fp);
|
|
|
|
if(!empty($sql))
|
|
|
|
{
|
|
|
|
$mysql_version = $dsql->GetVersion(true);
|
|
|
|
|
|
|
|
$sql = preg_replace('#ENGINE=MyISAM#i', 'TYPE=MyISAM', $sql);
|
|
|
|
$sql41tmp = 'ENGINE=MyISAM DEFAULT CHARSET='.$cfg_db_language;
|
|
|
|
if($mysql_version >= 4.1)
|
|
|
|
{
|
|
|
|
$sql = preg_replace('#TYPE=MyISAM#i', $sql41tmp, $sql);
|
|
|
|
}
|
|
|
|
|
|
|
|
$sqls = explode(";\r\n", $sql);
|
|
|
|
foreach($sqls as $sql)
|
|
|
|
{
|
|
|
|
if(trim($sql)!='')
|
|
|
|
{
|
|
|
|
$dsql->ExecuteNoneQuery(trim($sql));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ShowMsg("完成数据库更新,现在开始复制文件。","update_guide.php?dopost=apply&step=1");
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$sDir = DEDEDATA."/$tmpdir";
|
|
|
|
$tDir = DEDEROOT;
|
|
|
|
|
|
|
|
$badcp = 0;
|
|
|
|
$adminDir = preg_replace("#(.*)[\/\\\\]#", "", dirname(__FILE__));
|
|
|
|
|
|
|
|
if(isset($files) && is_array($files))
|
|
|
|
{
|
|
|
|
foreach($files as $f)
|
|
|
|
{
|
|
|
|
if(preg_match('#^dede#', $f))
|
|
|
|
{
|
|
|
|
$tf = preg_replace('#^dede#', $adminDir, $f);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$tf = $f;
|
|
|
|
}
|
|
|
|
if(file_exists($sDir.'/'.$f))
|
|
|
|
{
|
|
|
|
$rs = @copy($sDir.'/'.$f, $tDir.'/'.$tf);
|
|
|
|
if($rs) {
|
|
|
|
unlink($sDir.'/'.$f);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$badcp++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$fp = fopen($verLockFile,'w');
|
|
|
|
fwrite($fp,$vtime);
|
|
|
|
fclose($fp);
|
|
|
|
|
|
|
|
$badmsg = '!';
|
|
|
|
if($badcp > 0)
|
|
|
|
{
|
|
|
|
$badmsg = ",其中失败 {$badcp} 个文件,<br />请从临时目录[../data/{$tmpdir}]中取出这几个文件手动升级。";
|
|
|
|
}
|
|
|
|
|
|
|
|
ShowMsg("成功完成升级{$badmsg}","javascript:;");
|
|
|
|
exit();
|
|
|
|
}
|
|
|
|
} |