'', '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 ""; //判断是否需要更新,并返回适合的结果 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 " &nbsp;</div>\r\n"; echo "</form></div>"; } //echo ""; exit(); } /** 忽略某个日期前的升级 function _Skip() { } */ else if($dopost=='skip') { AjaxHead(); $fp = fopen($verLockFile, 'w'); fwrite($fp, $vtime); fclose($fp); $offUrl = SpGetNewInfo(); echo "
你系统版本最后更新时间为:{$oktime},当前没有可用的更新。
\r\n"; echo ""; 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 = "没发现可用的文件列表信息,可能是官方服务器存在问题,请稍后再尝试!"; } else { $allFileList .= "
\r\n"; $allFileList .= "\r\n"; $allFileList .= "\r\n"; $allFileList .= "\r\n"; $allFileList .= "
以下是需要下载的更新文件(路径相对于DedeCMS的根目录):
\r\n"; $filelists = explode("\n",$filelist); foreach($fileArr as $k=>$v) { $allFileList .= "
$k({$v})
\r\n"; } $allFileList .= "
"; $allFileList .= "文件临时存放目录:../data/
\r\n"; $allFileList .= " 跳过系统中没有的文件夹(通常是可选模块的补丁)
\r\n"; $allFileList .= "
 \r\n"; $allFileList .= "\r\n"; $allFileList .="
"; } include DedeInclude('templets/update_guide_getlist.htm'); exit(); } /** 下载文件(保存需下载内容列表) function _GetFiles() { } */ else if($dopost=='getfilesstart') { //update_guide.php?dopost=down&curfile=0 $msg = "如果检测时发现你没安装模块的文件夹有错误,可不必理会
"; $msg .= "确认目录状态都正常后,请点击开始下载文件>>
"; 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 = "


你没有指定任何需要下载更新的文件,是否跳过这些更新?

"; $doneStr .= "[跳过这些更新]   "; $doneStr .= "[保留提示以后再进行操作]

"; } 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 = ''; $dirinfos .= "本次升级需要在下面文件夹写入更新文件,请注意文件夹是否有写入权限:
\r\n"; foreach($dirs as $curdir) { $dirinfos .= $curdir['name']." 状态:".($curdir['writeable'] ? "[√正常]" : "[×不可写]")."
\r\n"; } $dirinfos .= "\r\n"; } $doneStr = "\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("完成所有远程文件获取操作:<<点击此开始直接升级>>
你也可以直接使用[../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} 个文件,
请从临时目录[../data/{$tmpdir}]中取出这几个文件手动升级。"; } ShowMsg("成功完成升级{$badmsg}","javascript:;"); exit(); } }