$date = formatTimestamp(time(), "Ymd"); $updatedir = "update-{$date}"; $backupdir = "backup-{$date}"; ob_start(); if ($xoopsDB->getRowsNum($res)) { // force clean work files $work = XOOPS_UPLOAD_PATH . "/update/work"; if (is_dir("{$work}/{$updatedir}")) { system("rm -rf '{$work}/{$updatedir}'"); } if (is_dir("{$work}/{$backupdir}")) { system("rm -rf '{$work}/{$backupdir}'"); } while ($data = $xoopsDB->fetchArray($res)) { $pkg = new InstallPackage($data); $pkg->load(); $pname = $pkg->getVar('pname'); $newpkg = new Package($pname, $pkgs[$pkg->dirname]['pversion']); if ($pkg->getVar('parent') != $newpkg->getVar('pkgid')) { if ($op == 'exec') { $pkg->backupPackage($newpkg, $backupdir); $pkg->updatePackage($newpkg, $updatedir); package_expire($pname); } elseif ($op == 'update') { $pkg->updatePackage($newpkg, $updatedir); } else { $pkg->backupPackage($newpkg, $backupdir); } $pkgn++; } }
function check_packages() { global $xoopsDB, $xoopsModuleConfig, $xoopsConfig; $res = $xoopsDB->query("SELECT p1.*, p2.vcheck dirname, p2.pversion ppversion FROM " . UPDATE_PKG . " p1 LEFT JOIN " . UPDATE_PKG . " p2 ON p1.parent=p2.pkgid WHERE p1.pversion='HEAD' ORDER BY p1.vcheck"); $pkgs = get_packages('all', false); echo "<h3>" . _AM_CHECK_LIST . "</h3>\n"; echo "<table cellspacing='1' class='outer'>\n"; echo "<tr><th>" . _AM_PKG_PNAME . "</th><th>" . _AM_PKG_CURRENT . "</th><th>" . _AM_PKG_DIRNAME . "</th><th>" . _AM_PKG_NEW . "</th><th>" . _AM_PKG_DTIME . "</th><th>" . _AM_CHANGES . "</th><th>" . _AM_MODIFYS . "</th><th></th></tr>\n"; $n = 0; $update = false; // find update package? $modify = false; $errors = array(); $module_handler =& xoops_gethandler('module'); while ($data = $xoopsDB->fetchArray($res)) { $pname = $data['pname']; $dirname = $data['vcheck']; // real dirname $pdir = empty($data['dirname']) ? $dirname : $data['dirname']; $bg = $n++ % 2 ? 'even' : 'odd'; $id = $data['pkgid']; $newpkg = isset($pkgs[$pdir]) ? $pkgs[$pdir] : array(); if (empty($newpkg)) { foreach ($pkgs as $pkg) { // find by name if ($pname == $pkg['pname']) { $newpkg = $pkg; break; } } } $newver = isset($newpkg['pversion']) ? $newpkg['pversion'] : ''; $curver = get_current_version($pname, $dirname); $modver = $curver[1]; // version string (0: normalize, 1: raw) if (empty($data['parent']) || !in_array($data['ppversion'], $curver)) { $par = import_new_package($pname, $modver, $pdir); if (empty($par)) { $errors[] = "{$pname} {$modver}: " . _AM_PKG_NOTFOUND; } else { $pid = $data['parent'] = $par->getVar('pkgid'); $pnm = $data['name'] = $par->getVar('name'); $ctm = $data['ctime'] = time(); $data['ppversion'] = $par->getVar('pversion'); $xoopsDB->queryF("UPDATE " . UPDATE_PKG . " SET parent={$pid}, name=" . $xoopsDB->quoteString($pnm) . ", mtime=0, ctime={$ctm} WHERE pkgid={$id}"); } } if (!empty($data['ppversion'])) { $pversion = $data['ppversion']; $past = time() - $data['mtime']; if ($past > $xoopsModuleConfig['cache_time']) { $pkg = new InstallPackage($data); $pkg->load(); $count = count($pkg->checkFiles()); if (!$count) { $xoopsDB->queryF("UPDATE " . UPDATE_PKG . " SET mtime=" . time() . " WHERE pkgid=" . $id); } } else { $count = 0; } $opt = "&pkgid={$id}"; if (!$count) { $opt .= "&view=yes"; } $op = "<a href='index.php?op=detail{$opt}'>" . ($count ? _AM_MODIFY : _AM_DETAIL) . "</a>"; } else { // no manifesto $pversion = ""; $op = ""; $count = 0; } if ($count) { $modify = true; } if (!empty($newpkg)) { $newver = $newpkg['pversion']; $newdate = formatTimestamp($newpkg['dtime'], "m"); } else { $newver = '-'; $newdate = '-'; } $mcount = count_modify_files($data['pkgid']); if ($pversion != $newver) { $bg = 'up'; $uppkg = import_new_package($pname, $newver); if ($uppkg) { $pid = $uppkg->getVar('pkgid'); $newver = "<a href='index.php?op=detail&pkgid={$id}&new={$pid}&view=yes'>" . htmlspecialchars($newver) . "</a>"; $update = true; } } else { $newver = htmlspecialchars($newver); } if ($count) { $bg = 'fix'; } // check module update $vers = htmlspecialchars($modver); if (!empty($dirname)) { $module = $module_handler->getByDirname($dirname); if (is_object($module)) { // installed? $mver = $module->getVar("version") / 100; if (!in_array($mver, $curver)) { $url = get_system_url("ModuleUpdate", $dirname); $vers = "<a href='{$url}' title='" . _AM_PKG_NEEDUPDATE . "'>{$vers} ({$mver})</a>"; } } else { $url = get_system_url("ModuleInstall", $dirname); $vers = "<a href='{$url}' title='" . _AM_PKG_NOTINSTALL . "'>{$vers} (-)</span>"; } } echo "<tr class='{$bg}'><td><a href='index.php?op=opts&pkgid={$id}'>" . htmlspecialchars($pname) . "</a></td><td>" . $vers . "</td><td>{$dirname}</td><td>" . $newver . "</td><td>{$newdate}</td><td align='right'>{$count}</td><td align='right'>{$mcount}</td><td>{$op}</td></tr>\n"; } echo "</table>\n"; if ($update && !$modify) { echo "<table cellpadding='5'>\n<tr>\n <td><a href='pack.php?op=backup'>" . _AM_UPDATE_BACKUP . "</a></td>\n <td><a href='pack.php?op=update'>" . _AM_UPDATE_ARCHIVE . "</a></td>\n <td>"; if (preg_match('/^Yes/', mysystem("check"))) { echo "\n <form action='pack.php?op=exec' method='post'>\n <input type='submit' value='" . _AM_UPDATE_SUBMIT . "'>\n </form>"; } echo "\n </td>\n</tr>\n</table>\n"; } $rollback = ROLLBACK; if (file_exists($rollback)) { $ctime = filectime($rollback); $expire = $ctime + $xoopsModuleConfig['cache_time']; if ($expire < time()) { unlink($rollback); } else { $tm = _AM_UPDATE_TIME . ' ' . formatTimestamp($ctime, 'm'); $until = _AM_UPDATE_EXPIRE . ' ' . formatTimestamp($expire, 'H:i'); echo "<table cellpadding='5'>\n <tr><td>\n <form action='index.php?op=rollback' method='post'>\n <input type='submit' value='" . _AM_UPDATE_ROLLBACK . "'></form></td>\n <td>{$tm} ({$until})</td></tr>\n</table>\n"; } } if ($errors) { echo "<br/><div class='errorMsg'>\n"; foreach ($errors as $msg) { echo "{$msg}<br/>\n"; } echo "</div>\n"; } }