. * * @package phpservermon * @author Pepijn Over * @copyright Copyright (c) 2008-2014 Pepijn Over * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 * @version Release: @package_version@ * @link http://phpservermon.neanderthal-technology.com/ * @since phpservermon 2.1.0 **/ namespace psm\Module; use psm\Service\Database; use psm\Service\Template; class Install extends AbstractModule { /** * Result messages to add to the main template * @var array $install_results * @see addResult() */ protected $install_results = array(); /** * Full path to config file * @var string $path_config */ protected $path_config; /** * Full path to old config file (2.0) * @var string $path_config_old */ protected $path_config_old; function __construct(Database $db, Template $tpl) { parent::__construct($db, $tpl); $this->path_config = PSM_PATH_SRC . '../config.php'; $this->path_config_old = PSM_PATH_SRC . '../config.inc.php'; $this->setActions(array( 'index', 'config', 'install' ), 'index'); } protected function createHTML() { $tpl_id_custom = $this->getTemplateId(); $this->setTemplateId('install', 'install.tpl.html'); $html_install = ($tpl_id_custom) ? $this->tpl->getTemplate($tpl_id_custom) : ''; $html_results = ''; if(!empty($this->install_results)) { $this->tpl->newTemplate('install_results', 'install.tpl.html'); $this->tpl->addTemplateDataRepeat('install_results', 'resultmsgs', $this->install_results); $html_results = $this->tpl->getTemplate('install_results'); } $this->tpl->addTemplateData($this->getTemplateId(), array( 'html_install' => $html_install, 'html_results' => $html_results, )); return parent::createHTML(); } /** * Generate the main install page with prerequisites */ protected function executeIndex() { $this->addMenu(false); $tpl_data = array(); // build prerequisites $errors = 0; $phpv = phpversion(); if(version_compare($phpv, '5.3.0', '<')) { $errors++; $this->addResult('PHP 5.3+ is required to run PHP Server Monitor.', 'error'); } else { $this->addResult('PHP version: ' . $phpv); } if(!function_exists('curl_init')) { $this->addResult('PHP is installed without the cURL module. Please install cURL.', 'warning'); } else { $this->addResult('cURL installed'); } if(!function_exists('mysql_connect')) { $errors++; $this->addResult('php-mysql needs to be installed.', 'error'); } if($errors > 0) { // cannot continue $this->addResult($errors . ' error(s) have been encountered. Please fix them and refresh this page.', 'error'); } else { if(defined('PSM_CONFIG')) { $this->addResult('Configuration file found.'); return $this->executeInstall(); } else { return $this->executeConfig(); } } } /** * Help the user create a new config file */ protected function executeConfig() { if(defined('PSM_CONFIG')) { return $this->executeInstall(); } // first detect "old" config file (2.0) if(file_exists($this->path_config_old)) { // oldtimer huh $this->addResult('Configuration file for v2.0 found.'); $this->addResult( 'The location of the config file has been changed since the previous version.
' . 'We will attempt to create a new config file for you.' , 'warning'); $values = $this->parseConfig20(); } else { // fresh install $values = $_POST; } $config = array( 'host' => 'localhost', 'name' => '', 'user' => '', 'pass' => '', 'prefix' => 'psm_', ); $this->setTemplateId('install_config_new', 'install.tpl.html'); $changed = false; foreach($config as $ckey => &$cvalue) { if(isset($values[$ckey])) { $changed = true; $cvalue = $values[$ckey]; } } // add config to template data for prefilling the form $tpl_data = $config; if($changed) { // test db connection $this->db = new \psm\Service\Database( $config['host'], $config['user'], $config['pass'], $config['name'] ); if(is_resource($this->db->getLink())) { $this->addResult('Connection to MySQL successful.'); $config_php = $this->writeConfigFile($config); if($config_php === true) { $this->addResult('Configuration file written successfully.'); return $this->executeInstall(); } else { $this->addResult('Config file is not writable, we cannot save it for you.', 'error'); $this->tpl->newTemplate('install_config_new_copy', 'install.tpl.html'); $tpl_data['html_config_copy'] = $this->tpl->getTemplate('install_config_new_copy'); $tpl_data['php_config'] = $config_php; } } else { $this->addResult('Unable to connect to MySQL. Please check your information.', 'error'); } } $this->tpl->addTemplateData($this->getTemplateId(), $tpl_data); } /** * Parse the 2.0 config file for prefilling * @return array */ protected function parseConfig20() { $config_old = file_get_contents($this->path_config_old); $vars = array( 'prefix' => '', 'user' => '', 'pass' => '', 'name' => '', 'host' => '', ); $pattern = "/define\('SM_DB_{key}', '(.*?)'/u"; foreach($vars as $key => $value) { $pattern_key = str_replace('{key}', strtoupper($key), $pattern); preg_match($pattern_key, $config_old, $value_matches); $vars[$key] = (isset($value_matches[1])) ? $value_matches[1] : ''; } return $vars; } /** * Execute the upgrade process to a newer version */ protected function executeInstall() { if(!defined('PSM_CONFIG')) { $this->addResult('No valid configuration found.', 'error'); return $this->executeConfig(); } if(!is_resource($this->db->getLink())) { $this->addResult('MySQL connection failed.', 'error'); return; } $queries = new \psm\Util\Install\Queries; $tables = $queries->install(); foreach($tables as $name => $sql) { $if_table_exists = $this->db->query("SHOW TABLES LIKE '{$name}'"); if(!empty($if_table_exists)) { $this->addResult('Table ' . $name . ' already exists in your database!'); } else { $this->db->query($sql); $this->addResult('Table ' . $name . ' added.'); } } $version_conf = $this->db->selectRow(PSM_DB_PREFIX . 'config', array('key' => 'version'), array('key', 'value')); if(empty($version_conf)) { // fresh install $version_from = null; } else { // existing install $version_from = $version_conf['value']; if(strpos($version_from, '.') === false) { // yeah, my bad.. previous version did not follow proper naming scheme $version_from = rtrim(chunk_split($version_from, 1, '.'), '.'); } $this->addResult('Upgrade detected, upgrading from ' . $version_from); } $this->addResult('Executing database changes for version ' . PSM_VERSION); $install_queries = $queries->upgrade(PSM_VERSION, $version_from); foreach($install_queries as $sql) { $this->db->query($sql); } $this->addResult('Installation finished!'); $this->setTemplateId('install_success', 'install.tpl.html'); } /** * Write config file with db variables * @param array $db_vars prefix,user,pass,name,host * @return boolean|string TRUE on success, string with config otherwise */ protected function writeConfigFile($db_vars) { $config = " $value) { $line = "define('PSM_DB_{key}', '{value}');".PHP_EOL; $line = str_replace( array('{key}', '{value}'), array(strtoupper($key), $value), $line ); $config .= $line; } $config .= "?>".PHP_EOL; if(is_writeable($this->path_config)) { file_put_contents($this->path_config, $config); return true; } else { return $config; } } /** * Add install result to be added to the main template * @param string|array $msg * @param string $status success/warning/error * @return \psm\Module\Install */ protected function addResult($msg, $status = 'success') { if(!is_array($msg)) { $msg = array($msg); } if($status == 'error') { $shortcode = 'important'; } else { $shortcode = $status; } foreach($msg as $m) { $this->install_results[] = array( 'message' => $m, 'status' => strtoupper($status), 'shortcode' => $shortcode, ); } return $this; } } ?>