1
0
Alex Trofimov 12 жил өмнө
parent
commit
232172c55b

+ 3 - 2
inc/classes/BxDolCronUpgradeCheck.php

@@ -3,7 +3,7 @@
  * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
  * CC-BY License - http://creativecommons.org/licenses/by/3.0/
  *
- * @defgroup    DolphinCore Dolphin Core
+ * @defgroup    DolphinUpgrade Dolphin Upgrade Script
  * @{
  */
 
@@ -17,7 +17,8 @@ class BxDolCronUpgradeCheck extends BxDolCron
             return;
 
         $o = bx_instance('BxDolUpgrader');
-        $o->prepare();
+        if (!$o->prepare())
+            echo $o->getError() . "\n"; // TODO: email report ?
     }
 }
 

+ 24 - 5
inc/classes/BxDolUpgrader.php

@@ -14,6 +14,12 @@ class BxDolUpgrader extends BxDol
     protected $_sUrlVersionCheck = 'http://rss.boonex.com/u/';
     protected $_sError = false;
 
+    /**
+     * Prepare for system upgrade.
+     * It prepares upgrade by downloading upgrade pack and performing different checks.
+     * After all check are successfully completed, transient cron job is set to run upgrade upon next cron run.
+     * @return true if upgrade was successfully scheduled to run, or false on error (you can call @see getError to determine particular error message)
+     */
     public function prepare()
     {
         $this->setError(false);
@@ -71,14 +77,18 @@ class BxDolUpgrader extends BxDol
                 break;
             }
 
+            if (!$this->setTransientUpgradeCronJob ($sUnpackedPath)) {
+                $this->deleteUpgradeFolder($sPatchPath);
+                $this->setError(_t('_sys_upgrade_set_cron_failed'));
+                break;
+            }
+
             break;
         }
 
         umask($iUmaskSave);
 
-        // TODO: check error and set transient cron for the real update of files and db!
-
-        echo 'Err:' . $this->getError() . "\n";
+        return $this->getError() ? false : true;
     }
 
     public function getVersionUpdateInfo ()
@@ -161,8 +171,17 @@ class BxDolUpgrader extends BxDol
 
     protected function isValidPatch ($sUnpackedPath, $aVersionUpdateInfo)
     {
-        $sCheckFilePath =  $sUnpackedPath . 'upgrade/files/' . $this->normalizeVersion(bx_get_ver()) . '-' . $this->normalizeVersion($aVersionUpdateInfo['patch']['ver']) . '/check.php';
-        return file_exists($sCheckFilePath);
+        $sPath = $sUnpackedPath . 'files/' . $this->normalizeVersion(bx_get_ver()) . '-' . $this->normalizeVersion($aVersionUpdateInfo['patch']['ver']) . '/';
+        $sCheckFilePath =  $sPath . 'check.php';
+        $sVersionFilePath =  $sPath . 'files/inc/version.inc.php';
+        return file_exists($sCheckFilePath) && file_exists($sVersionFilePath) && file_exists($sUnpackedPath . 'BxDolUpgradeCron.php');
+    }
+
+    protected function setTransientUpgradeCronJob ($sUnpackedPath)
+    {
+        $oDb = BxDolDb::getInstance();
+        $sQuery = $oDb->prepare("INSERT INTO `sys_cron_jobs` SET `name` = 'sys_perform_upgrade', `time` = 'transient', `class` = 'BxDolUpgradeCron', `file` = ?", bx_ltrim_str($sUnpackedPath, BX_DIRECTORY_PATH_ROOT) . 'BxDolUpgradeCron.php');
+        return $oDb->query($sQuery);
     }
 
     public function getError()

+ 1 - 1
periodic/cron.php

@@ -129,7 +129,7 @@ if (!empty($aJobsTransient)) {
     foreach ($aJobsTransient as $aRow)
         runJob($aRow);
 
-    if (isset($aJobsTransient['sys_upgrade']))
+    if (isset($aJobsTransient['sys_perform_upgrade']))
         exit;
 }
 

+ 0 - 1
upgrade/.htaccess

@@ -1 +0,0 @@
-Deny from all

+ 20 - 1
upgrade/BxDolUpgradeCron.php

@@ -7,13 +7,32 @@
  * @{
  */
 
+require_once(BX_DIRECTORY_PATH_ROOT . 'upgrade/classes/BxDolUpgradeController.php');
+require_once(BX_DIRECTORY_PATH_ROOT . 'upgrade/classes/BxDolUpgradeUtil.php');
+require_once(BX_DIRECTORY_PATH_ROOT . 'upgrade/classes/BxDolUpgradeDb.php');
+
+$aPathInfo = pathinfo(__FILE__);
+define ('BX_UPGRADE_DIR_UPGRADES', $aPathInfo['dirname'] . '/files/');
+
 bx_import('BxDolCron');
 
 class BxDolUpgradeCron extends BxDolCron
 {
     public function processing()
     {
-        echo "URA! \n";
+        $oController = new BxDolUpgradeController();
+
+        $aFolders = $oController->getAllUpgrades();
+        $j = count($aFolders);
+
+        for ($i = 0; $i < $j; ++$i) {
+            $sFolder = $oController->getAvailableUpgrade();
+            if (!$sFolder)
+                continue;
+
+            if (!$oController->runUpgrade($sFolder))
+                echo $oController->getErrorMsg() . "\n"; // TODO: email report ?
+        }
     }
 }
 

+ 82 - 77
upgrade/classes/BxDolUpgradeController.php

@@ -11,39 +11,63 @@ class BxDolUpgradeController
 {
     protected $oDb;
     protected $oUtil;
+    protected $aLogMsgs;
+    protected $sError;
 
-    function BxDolUpgradeController()
+    public function __construct()
     {
         $this->oDb = new BxDolUpgradeDb();
         $this->oUtil = new BxDolUpgradeUtil($this->oDb);
     }
 
-    function showAvailableUpgrades ()
+    public function getErrorMsg()
+    {
+        return $this->sError;
+    }
+
+    public function getLogMessages()
+    {
+        return $this->aLogMsgs;
+    }
+
+    public function getAllUpgrades ()
     {
         $aTemplateFolders = array ();
         $aFolders = $this->oUtil->readUpgrades();
         foreach ($aFolders as $sFolder) {
             $this->oUtil->setFolder($sFolder);
-            $aTemplateFolders[$sFolder] = $this->oUtil->executeCheck ();
+            $aTemplateFolders[$sFolder] = $this->oUtil->executeCheck();
         }
+        return $aTemplateFolders;
+    }
 
-        require (BX_UPGRADE_DIR_TEMPLATES . 'show_available_updates.php');
+    public function getAvailableUpgrade ()
+    {
+        $aTemplateFolders = array ();
+        $aFolders = $this->oUtil->readUpgrades();
+        foreach ($aFolders as $sFolder) {
+            $this->oUtil->setFolder($sFolder);
+            if (true === $this->oUtil->executeCheck())
+                return $sFolder;
+        }
+        return false;
     }
 
-    function runUpgrade ($sFolder)
+    public function runUpgrade ($sFolder)
     {
+        $this->aLogMsgs = array();
+        $this->sError = false;
+
         // set current folder
         $this->oUtil->setFolder($sFolder);
 
         // precheck
         $mixedResult = $this->oUtil->executeCheck ();
         if (true !== $mixedResult) {
-            $sTemplateMessage = $mixedResult;
-            require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-            return;
+            $this->sError = $mixedResult;
+            return false;
         } else {
-            $sTemplateMessage = "$sFolder upgrade can be applied";
-            require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+            $this->aLogMsgs[] = "$sFolder upgrade can be applied";
         }
 
         // run system SQL upgrade
@@ -53,35 +77,33 @@ class BxDolUpgradeController
             $mixedResult = $this->oUtil->executeSQL ();
             if (true !== $mixedResult) {
                 $sTemplateMessage = $mixedResult;
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-                return;
+                $this->sError = $mixedResult;
+                return false;
             } else {
-                $sTemplateMessage = "System SQL script was successfully executed.";
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+                $this->aLogMsgs[] = "System SQL script was successfully executed.";
             }
 
         } elseif (false === $mixedResult) {
             // just skip if not available found
         } else {
-            $sTemplateMessage = $mixedResult;
-            require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-            return;
+            $this->sError = $mixedResult;
+            return false;
         }
 
         // get list of available language files updates
         if (false === ($aLangs = $this->oUtil->readLangs ())) {
-            $sTemplateMessage = 'Error reading the directory with language updates.';
-            require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-            return;
+            $this->sError = 'Error reading the directory with language updates.';
+            return false;
         } else {
             $sTemplateMessage = 'The following languages will be affected for system: <br />';
-            if (!$aLangs)
+            if (!$aLangs) {
                 $sTemplateMessage .= " - No languages will be affected.";
-            else
+            } else {
                 foreach ($aLangs as $sLang) {
                     $sTemplateMessage .= ' - ' . $sLang . '<br />';
                 }
-            require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+            }
+            $this->aLogMsgs[] = $sTemplateMessage;
         }
 
         // run system langs upgrade
@@ -89,12 +111,10 @@ class BxDolUpgradeController
 
             $mixedResult = $this->oUtil->executeLangsAdd ();
             if (true !== $mixedResult) {
-                $sTemplateMessage = $mixedResult;
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-                return;
+                $this->sError = $mixedResult;
+                return false;
             } else {
-                $sTemplateMessage = "System language strings were successfully added.";
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+                $this->aLogMsgs[] = "System language strings were successfully added.";
             }
 
         }
@@ -105,36 +125,33 @@ class BxDolUpgradeController
 
             $mixedResult = $this->oUtil->executeScript ();
             if (true !== $mixedResult) {
-                $sTemplateMessage = $mixedResult;
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-                return;
+                $this->sError = $mixedResult;
+                return false;
             } else {
-                $sTemplateMessage = "System after update custom script was successfully executed.";
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+                $this->aLogMsgs[] = "System after update custom script was successfully executed.";
             }
 
         } elseif (false === $mixedResult) {
             // just skip if not available found
         } else {
-            $sTemplateMessage = $mixedResult;
-            require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-            return;
+            $this->sError = $mixedResult;
+            return false;
         }
 
         // get list of modules updates
         if (false === ($aModules = $this->oUtil->readModules ())) {
-            $sTemplateMessage = 'Error reading modules updates.';
-            require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-            return;
+            // skip modules update
+            return true;
         } else {
             $sTemplateMessage = 'The following modules will be updated: <br />';
-            if (!$aModules)
+            if (!$aModules) {
                 $sTemplateMessage .= " - No modules will be updated.";
-            else
+            } else {
                 foreach ($aModules as $sModule) {
                     $sTemplateMessage .= ' - ' . $sModule . '<br />';
                 }
-            require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+            }
+            $this->aLogMsgs[] = $sTemplateMessage;
         }
 
         foreach ($aModules as $sModule) {
@@ -145,36 +162,33 @@ class BxDolUpgradeController
 
                 $mixedResult = $this->oUtil->executeSQL ($sModule);
                 if (true !== $mixedResult) {
-                    $sTemplateMessage = $mixedResult;
-                    require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-                    return;
+                    $this->sError = $mixedResult;
+                    return false;
                 } else {
-                    $sTemplateMessage = "<b>$sModule</b> module SQL script was successfully executed.";
-                    require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+                    $this->aLogMsgs[] = "<b>$sModule</b> module SQL script was successfully executed.";
                 }
 
             } elseif (false === $mixedResult) {
                 // just skip if not available found
             } else {
-                $sTemplateMessage = $mixedResult;
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-                return;
+                $this->sError = $mixedResult;
+                return false;
             }
 
             // get list of available language files updates
             if (false === ($aLangs = $this->oUtil->readLangs ($sModule))) {
-                $sTemplateMessage = 'Error reading the directory with language updates.';
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-                return;
+                $this->sError = 'Error reading the directory with language updates.';
+                return false;
             } else {
                 $sTemplateMessage = "The following languages will be affected for <b>$sModule</b> module: <br />";
-                if (!$aLangs)
+                if (!$aLangs) {
                     $sTemplateMessage .= " - No languages will be affected.";
-                else
+                } else {
                     foreach ($aLangs as $sLang) {
                         $sTemplateMessage .= ' - ' . $sLang . '<br />';
                     }
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+                }
+                $this->aLogMsgs[] = $sTemplateMessage;
             }
 
             // run module langs upgrade
@@ -182,12 +196,10 @@ class BxDolUpgradeController
 
                 $mixedResult = $this->oUtil->executeLangsAdd ($sModule);
                 if (true !== $mixedResult) {
-                    $sTemplateMessage = $mixedResult;
-                    require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-                    return;
+                    $this->sError = $mixedResult;
+                    return false;
                 } else {
-                    $sTemplateMessage = "<b>$sModule</b> module language strings were successfully added.";
-                    require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+                    $this->aLogMsgs[] = "<b>$sModule</b> module language strings were successfully added.";
                 }
 
             }
@@ -198,40 +210,33 @@ class BxDolUpgradeController
 
                 $mixedResult = $this->oUtil->executeScript ($sModule);
                 if (true !== $mixedResult) {
-                    $sTemplateMessage = $mixedResult;
-                    require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-                    return;
+                    $this->sError = $mixedResult;
+                    return false;
                 } else {
-                    $sTemplateMessage = "<b>$sModule</b> module after update custom script was successfully executed.";
-                    require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+                    $this->aLogMsgs[] = "<b>$sModule</b> module after update custom script was successfully executed.";
                 }
 
             } elseif (false === $mixedResult) {
                 // just skip if not available
             } else {
-                $sTemplateMessage = $mixedResult;
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_error.php');
-                return;
+                $this->sError = $mixedResult;
+                return false;
             }
 
             // run module custom script upgrade
             $sResult = $this->oUtil->executeConclusion ($sModule);
-            if ($sResult) {
-                $sTemplateMessage = $sResult;
-                require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
-            }
-
+            if ($sResult)
+                $this->aLogMsgs[] = $sResult;
         }
 
         // run module custom script upgrade
         $sResult = $this->oUtil->executeConclusion ();
         if ($sResult) {
-            $sTemplateMessage = $sResult;
-            require (BX_UPGRADE_DIR_TEMPLATES . 'message_success_step.php');
+            $this->aLogMsgs[] = $sResult;
         }
 
+        return true;
     }
-
 }
 
 /** @} */

+ 6 - 6
upgrade/classes/BxDolUpgradeDb.php

@@ -21,12 +21,12 @@ class BxDolUpgradeDb
      */
     function __construct()
     {
-        $this->_sHost = DATABASE_HOST;
-        $this->_sPort = DATABASE_PORT;
-        $this->_sSocket = DATABASE_SOCK;
-        $this->_sDbname = DATABASE_NAME;
-        $this->_sUser = DATABASE_USER;
-        $this->_sPassword = DATABASE_PASS;
+        $this->_sHost = BX_DATABASE_HOST;
+        $this->_sPort = BX_DATABASE_PORT;
+        $this->_sSocket = BX_DATABASE_SOCK;
+        $this->_sDbname = BX_DATABASE_NAME;
+        $this->_sUser = BX_DATABASE_USER;
+        $this->_sPassword = BX_DATABASE_PASS;
         $this->_iCurrentResType = MYSQL_ASSOC;
 
         $this->connect();

+ 5 - 2
upgrade/classes/BxDolUpgradeUtil.php

@@ -9,8 +9,8 @@
 
 class BxDolUpgradeUtil
 {
-    protected $oDb;
-    protected $sFolder;
+    var $oDb;
+    var $sFolder;
 
     function BxDolUpgradeUtil($oDb)
     {
@@ -195,6 +195,9 @@ class BxDolUpgradeUtil
         if (!$this->sFolder)
             return false;
 
+        if (!file_exists(BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/modules/'))
+            return false;
+
         if (!($h = opendir(BX_UPGRADE_DIR_UPGRADES . $this->sFolder . '/modules/')))
             return false;
 

+ 0 - 4
upgrade/files/.gitignore

@@ -1,4 +0,0 @@
-# Ignore everything in this directory
-*
-# Except this file
-!.gitignore

+ 0 - 31
upgrade/index.php

@@ -1,31 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
- * CC-BY License - http://creativecommons.org/licenses/by/3.0/
- *
- * @defgroup    DolphinUpgrade Dolphin Upgrade Script
- * @{
- */
-
-require_once('./../inc/header.inc.php');
-require_once(BX_DIRECTORY_PATH_ROOT . 'upgrade/classes/BxDolUpgradeController.php');
-require_once(BX_DIRECTORY_PATH_ROOT . 'upgrade/classes/BxDolUpgradeUtil.php');
-require_once(BX_DIRECTORY_PATH_ROOT . 'upgrade/classes/BxDolUpgradeDb.php');
-
-define ('BX_UPGRADE_DIR_UPGRADES', BX_DIRECTORY_PATH_ROOT . 'upgrade/files/');
-define ('BX_UPGRADE_DIR_TEMPLATES', BX_DIRECTORY_PATH_ROOT . 'upgrade/templates/');
-
-$sFolder = $_REQUEST['folder'];
-
-include (BX_UPGRADE_DIR_TEMPLATES . '_header.php');
-
-$oController = new BxDolUpgradeController ();
-
-if (!$sFolder)
-    $oController->showAvailableUpgrades();
-else
-    $oController->runUpgrade($sFolder);
-
-include (BX_UPGRADE_DIR_TEMPLATES . '_footer.php');
-
-/** @} */

+ 0 - 3
upgrade/templates/_footer.php

@@ -1,3 +0,0 @@
-    </div>
-</body>
-</html>

+ 0 - 75
upgrade/templates/_header.php

@@ -1,75 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
-<head>
-    <title>BoonEx Dolphin Upgrade Script</title>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-    <style>
-
-body {
-    background-color:#eee;
-    color:#333333;
-    font-family:Verdana,Arial;
-    font-size:11px;
-    margin:0;
-    padding:0;
-}
-
-#body,
-#body-title {
-    margin:0 auto 0  auto;
-    padding:10px;
-}
-
-#body-title {
-    margin-top:20px;
-    margin-bottom:10px;
-    width:1000px;
-    font-size:20px;
-    padding:0px;
-}
-
-#body {
-    margin-bottom:20px;
-    width:980px;
-    background:white;
-    border:1px solid #ccc;
-}
-
-.avail span {
-    color:#090;
-    font-weight:bold;
-}
-
-.not-avail {
-    color:#999;
-}
-
-table td {
-    padding:5px;
-}
-
-.message_error,
-.message_success_step {
-    padding:5px;
-    margin:5px 0 0 0;
-}
-
-.message_error {
-    border:2px solid red;
-}
-
-.message_success_step {
-    border:2px solid #090;
-}
-
-.message_error:first-child,
-.message_success_step:first-child {
-    margin-top:0px;
-}
-
-    </style>
-</head>
-<body>
-
-    <div id="body-title">BoonEx Dolphin Upgrade Script</div>
-    <div id="body">

+ 0 - 4
upgrade/templates/message_error.php

@@ -1,4 +0,0 @@
-
-<div class="message_error">
-    <?php echo $sTemplateMessage; ?>
-</div>

+ 0 - 4
upgrade/templates/message_success_step.php

@@ -1,4 +0,0 @@
-
-<div class="message_success_step">
-    <?php echo $sTemplateMessage; ?>
-</div>

+ 0 - 36
upgrade/templates/show_available_updates.php

@@ -1,36 +0,0 @@
-
-<table>
-
-<?php
-    foreach ($aTemplateFolders as $sFolder => $mixedAvailableResult):
-
-        $sTemplateTdClass = (true === $mixedAvailableResult ? 'avail' : 'not-avail');
-?>
-
-<tr class="<?php echo $sTemplateTdClass; ?>">
-    <td>
-        <?php echo $sFolder; ?>
-    </td>
-    <td>
-        <?php
-            if (true === $mixedAvailableResult) {
-                echo '<span>Available</span>';
-            } else {
-                echo $mixedAvailableResult;
-            }
-        ?>
-    </td>
-    <td>
-        <?php if (true === $mixedAvailableResult): ?>
-
-            <a href="<?php echo BX_DOL_URL_ROOT . 'upgrade/?folder=' . $sFolder ?>" onclick="return confirm('Are you sure?');">UPGRADE</a>
-
-        <?php endif; ?>
-    </td>
-</tr>
-
-<?php
-    endforeach;
-?>
-
-</table>