. * * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, * California 94120-7775, or email info@knowledgetree.com. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original * copyright notice. * * @copyright 2008-2009, KnowledgeTree Inc. * @license GNU General Public License version 3 * @author KnowledgeTree Team * @package Migrater * @version Version 0.1 */ class migrateDatabase extends Step { /** * List of errors encountered * * @author KnowledgeTree Team * @access public * @var array */ public $error = array(); /** * Flag to store class information in session * * @author KnowledgeTree Team * @access public * @var array */ public $storeInSession = true; /** * Flag if step needs to be migrated * * @author KnowledgeTree Team * @access public * @var array */ protected $runMigrate = true; /** * Flag if step needs to run silently * * @author KnowledgeTree Team * @access public * @var array */ protected $silent = false; private $sqlDumpFile = ''; /** * Main control of database setup * * @author KnowledgeTree Team * @param none * @access public * @return string */ public function doStep() { $this->temp_variables = array("step_name"=>"database", "silent"=>$this->silent); $this->wizardLocation = '../wizard'; $this->setDetails(); // Set any posted variables if(!$this->inStep("database")) { return 'landing'; } if($this->next()) { if($this->exportDatabase()) { $this->storeSilent(); return 'next'; } } else if($this->previous()) { return 'previous'; } $this->storeSilent(); return 'landing'; } public function exportDatabase() { $database = $this->getDataFromSession("database"); if(isset($database['dumpLocation'])) { if(!empty($database['dumpLocation'])) { if(file_exists($database['dumpLocation'])) { // Maybe file has been deleted by tmp $this->sqlDumpFile = $database['dumpLocation']; return true;// Database dumped already in this session } } } $noFile = false; $installation = $this->getDataFromSession("installation"); // Get installation directory $manual = false; // If file was exported manually $dbSettings = $installation['dbSettings']; $location = $installation['location']; $port = $this->util->getPort($location); $tmpFolder = $this->resolveTempDir(); if(WINDOWS_OS) { $termOrBash = "command prompt window"; $exe = "\"$location".DS."mysql".DS."bin".DS."mysqldump.exe\""; } else { $termOrBash = "terminal window"; $exe = "\"$location".DS."mysql".DS."bin".DS."mysqldump\""; // Location of dump } $date = date('Y-m-d-H-i-s'); if(isset($database['manual_export'])) { $sqlFile = $database['manual_export']; if(file_exists($sqlFile)) { $manual = true; } } // Database settings $dbAdminUser = $dbSettings['dbAdminUser']; $dbAdminPass = $dbSettings['dbAdminPass']; $dbName = $dbSettings['dbName']; if(!$manual) { // Try to export database $sqlFile = $tmpFolder."/kt-backup-$date.sql"; $cmd = $exe.' -u"'.$dbAdminUser.'" -p"'.$dbAdminPass.'" --port="'.$port.'" '.$dbName.' > '.$sqlFile; $response = $this->util->pexec($cmd); } if(file_exists($sqlFile)) { $fileContents = file_get_contents($sqlFile); if(!empty($fileContents)) { $this->sqlDumpFile = realpath($sqlFile); // Store location of dump return true; } else { unlink($sqlFile); } } $noFile = true; // Handle failed dump if(WINDOWS_OS) { // Could be permissions, check error code. if(!$noFile) { $sqlFile = "C:\\kt-backup-$date.sql"; // Use tmp instead due to permissions } } else { if(!$noFile) { $sqlFile = "/tmp/kt-backup-$date.sql"; // Use tmp instead due to permissions } } $cmd = $exe.' -u"'.$dbAdminUser.'" -p"'.$dbAdminPass.'" --port="'.$port.'" '.$dbName.' > '.$sqlFile; if($noFile) { $this->error[]['error'] = "The KnowledgeTree Setup Wizard was unable to connect to your KnowledgeTree 3.6.1 database."; $this->error[]['msg'] = "Ensure that your KnowledgeTree Mysql service is running."; $this->error[]['cmd'] = "Click Next after resolving the above errors."; $this->temp_variables['manual_export'] = ""; } else { $this->error[]['error'] = "Could not export database:"; $this->error[]['msg'] = "Execute the following command in a $termOrBash."; $this->error[]['cmd'] = $cmd; $this->temp_variables['manual_export'] = $sqlFile; } return false; } // TODO function resolveTempDir() { if (!WINDOWS_OS) { $dir='/tmp/kt-db-backup'; } else { $dir='c:/kt-db-backup'; } if (!is_dir($dir)) { mkdir($dir); } return $dir; } /** * Store options * * @author KnowledgeTree Team * @params object SimpleXmlObject * @access private * @return void */ private function setDetails() { $this->createMigrateFile(); // create lock file to indicate migration mode $database = $this->getDataFromSession("database"); $installation = $this->getDataFromSession("installation"); // Get installation directory $location = $installation['location']; $this->temp_variables['location'] = $location; if(isset($database['dumpLocation'])) { if(!empty($database['dumpLocation'])) { if(file_exists($database['dumpLocation'])) { // Maybe file has been deleted by tmp $this->sqlDumpFile = $database['dumpLocation']; return false; } } } $this->temp_variables['duname'] = $this->getPostSafe('duname'); $this->temp_variables['dpassword'] = $this->getPostSafe('dpassword'); $this->temp_variables['dumpLocation'] = $this->getPostSafe('dumpLocation'); return true; } /** * Creates migration lock file so that system knows it is supposed to run an upgrade installation * * @author KnowledgeTree Team * @access private * @return void */ private function createMigrateFile() { touch(SYSTEM_DIR.'var'.DS.'bin'.DS."migrate.lock"); } /** * Safer way to return post data * * @author KnowledgeTree Team * @params SimpleXmlObject $simplexml * @access public * @return void */ public function getPostSafe($key) { return isset($_POST[$key]) ? $_POST[$key] : ""; } /** * Stores varibles used by template * * @author KnowledgeTree Team * @params none * @access public * @return array */ public function getStepVars() { return $this->temp_variables; } /** * Returns database errors * * @author KnowledgeTree Team * @access public * @params none * @return array */ public function getErrors() { return $this->error; } private function storeSilent() { // TODO $_SESSION['migrate']['database']['dumpLocation'] = $this->sqlDumpFile; $this->temp_variables['dumpLocation'] = $this->sqlDumpFile; } } ?>