update_guide.php
15.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
<?php
/**
* 本文件用于从镜像服务器获取升级信息与文件
* 并由用户自行控制升级
*
* @version $Id: vote_main.php 1 23:54 2010年7月20日Z tianya $
* @package DedeCMS.Administrator
* @copyright Copyright (c) 2007 - 2010, DesDev, Inc.
* @license http://help.dedecms.com/usersguide/license.html
* @link http://www.dedecms.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($updateHost.'/verinfo.txt');
$verlist = trim($dhd->GetHtml());
$dhd->Close();
if($cfg_soft_lang=='utf-8')
{
$verlist = gb2utf8($verlist);
}
$verlist = preg_replace("#[\r\n]{1,}#", "\n", $verlist);
$verlists = explode("\n", $verlist);
//分析数据
$updateVers = array();
$upitems = $lastTime = '';
$n = 0;
foreach($verlists as $verstr)
{
if( empty($verstr) || preg_match("#^\/\/#", $verstr) )
{
continue ;
}
list($vtime, $vlang, $issafe, $vmsg) = explode(',', $verstr);
$vtime = trim($vtime);
$vlang = trim($vlang);
$issafe = trim($issafe);
$vmsg = trim($vmsg);
if($vtime > $upTime && $vlang==$cfg_soft_lang)
{
$updateVers[$n]['issafe'] = $issafe;
$updateVers[$n]['vmsg'] = $vmsg;
$upitems .= ($upitems=='' ? $vtime : ','.$vtime);
$lastTime = $vtime;
$updateVers[$n]['vtime'] = substr($vtime,0,4).'-'.substr($vtime,4,2).'-'.substr($vtime,6,2);
$n++;
}
}
//echo "<xmp>";
//判断是否需要更新,并返回适合的结果
if($n==0)
{
$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 "<input type='hidden' name='vtime' value='$lastTime' />\r\n";
echo "<input type='hidden' name='upitems' value='$upitems' />\r\n";
echo "<div class='upinfotitle'>你系统版本最后更新时间为:{$oktime},当前可用的更新有:</div>\r\n";
foreach($updateVers as $vers)
{
$style = '';
if($vers['issafe']==1)
{
$style = "color:red;";
}
echo "<div style='{$style}' class='verline'>【".($vers['issafe']==1 ? "安全更新" : "普通更新")."】";
echo $vers['vtime'].",更新说明:{$vers['vmsg']}</div>\r\n";
}
echo "<div style='line-height:32px'><input type='submit' name='sb1' value=' 点击此获取所有更新文件,然后选择安装 ' class='np coolbg' style='cursor:pointer' />\r\n";
echo " <input type='button' name='sb2' value=' 忽略这些更新 ' onclick='SkipReload({$lastTime})' class='np coolbg' style='cursor:pointer' /></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();
}
}