2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4 * SugarCRM Community Edition is a customer relationship management program developed by
5 * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
7 * This program is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU Affero General Public License version 3 as published by the
9 * Free Software Foundation with the addition of the following permission added
10 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
19 * You should have received a copy of the GNU Affero General Public License along with
20 * this program; if not, see http://www.gnu.org/licenses or write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
27 * The interactive user interfaces in modified source and object code versions
28 * of this program must display Appropriate Legal Notices, as required under
29 * Section 5 of the GNU Affero General Public License version 3.
31 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32 * these Appropriate Legal Notices must retain the display of the "Powered by
33 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34 * technical reasons, the Appropriate Legal Notices must display the words
35 * "Powered by SugarCRM".
36 ********************************************************************************/
38 /*********************************************************************************
41 * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc. All Rights
42 * Reserved. Contributor(s): ______________________________________..
43 * *******************************************************************************/
45 // LEGACY for old versions - emulating upload.php
46 // aw: make this better for later versions.
47 //refreshing mod_strings
51 if(isset($GLOBALS['current_language']) && ($GLOBALS['current_language'] != null)){
52 $curr_lang = $GLOBALS['current_language'];
54 $mod_strings = return_module_language($curr_lang, 'UpgradeWizard',true);
56 function check_php($sys_php_version = '')
58 $min_considered_php_version = '5.2.1';
60 $supported_php_versions = array (
61 '5.2.1', '5.2.2', '5.2.3', '5.2.4', '5.2.5', '5.2.6', '5.2.8', '5.3.0'
63 //Find out what Database the system is using.
66 if (isset ($sugar_config['dbconfig']) && isset ($sugar_config['dbconfig']['db_type'])) {
67 $dbType = $sugar_config['dbconfig']['db_type'];
70 // invalid versions above the $min_considered_php_version,
71 // should be mutually exclusive with $supported_php_versions
73 // SugarCRM prohibits install on PHP 5.2.x on all platforms
74 $invalid_php_versions = array('5.2.7');
76 // default unsupported
79 // versions below $min_considered_php_version are invalid
80 if(1 == version_compare($sys_php_version, $min_considered_php_version, '<')) {
84 // supported version check overrides default unsupported
85 foreach($supported_php_versions as $ver) {
86 if(1 == version_compare($sys_php_version, $ver, 'eq') || strpos($sys_php_version,$ver) !== false) {
92 // invalid version check overrides default unsupported
93 foreach($invalid_php_versions as $ver) {
94 if(1 == version_compare($sys_php_version, $ver, 'eq') || strpos($sys_php_version,$ver) !== false) {
100 //allow a redhat distro to install, regardless of version. We are assuming the redhat naming convention is followed
101 //and the php version contains 'rh' characters
102 if(strpos($sys_php_version, 'rh') !== false) {
111 $curr_lang = 'en_us';
112 if(isset($GLOBALS['current_language']) && ($GLOBALS['current_language'] != null)){
113 $curr_lang = $GLOBALS['current_language'];
115 return_module_language($curr_lang, 'UpgradeWizard');
117 logThis('at preflight.php');
118 //set the upgrade progress status.
119 set_upgrade_progress('preflight','in_progress');
121 if (version_compare(phpversion(),'5.2.0') >=0) {
122 $stop = true; // flag to show "next"
123 if(isset($_SESSION['files'])) {
124 unset($_SESSION['files']);
127 $errors = preflightCheck();
129 $php_version = constant('PHP_VERSION');
130 if(check_php($php_version) == -1)
132 $phpVersion = "<b><span class=stop>{$mod_strings['ERR_CHECKSYS_PHP_INVALID_VER']} {$php_version} </span></b>";
133 $error_txt = '<span class="error">'.$phpVersion.'</span>';
134 if(count($errors) == 0)
136 $errors[] = $error_txt;
141 $anyScriptChanges = '';
142 $db =& DBManagerFactory::getInstance();
144 //Quickcreatedefs on the basis of editviewdefs
145 if(substr($sugar_version,0,1) >= 5){
146 updateQuickCreateDefs();
148 upgradeSugarCache($_SESSION['install_file']);
150 if((count($errors) == 1)) { // only diffs
151 logThis('file preflight check passed successfully.');
153 $out = $mod_strings['LBL_UW_PREFLIGHT_TESTS_PASSED']."<BR><BR><font color='red'>".$mod_strings['LBL_UW_PREFLIGHT_TESTS_PASSED3']."</font>";
156 $disableEmail = (empty($current_user->email1)) ? 'DISABLED' : 'CHECKED';
158 if(count($errors['manual']) > 0) {
159 $preserveFiles = array();
162 <script type="text/javascript" language="Javascript">
163 function preflightToggleAll(cb) {
164 var checkAll = false;
165 var form = document.getElementById('diffs');
167 if(cb.checked == true) {
171 for(i=0; i<form.elements.length; i++) {
172 if(form.elements[i].type == 'checkbox') {
173 form.elements[i].checked = checkAll;
180 <table cellpadding='0' cellspacing='0' border='0'>
183 <input type='checkbox' name='addTask' id='addTask' CHECKED>
186 {$mod_strings['LBL_UW_PREFLIGHT_ADD_TASK']}
191 <input type='checkbox' name='addEmail' id='addEmail' $disableEmail>
194 {$mod_strings['LBL_UW_PREFLIGHT_EMAIL_REMINDER']}
199 <form name='diffs' id='diffs'>
200 <p><a href='javascript:void(0); toggleNwFiles("diffsHide");'>{$mod_strings['LBL_UW_SHOW_DIFFS']}</a></p>
201 <div id='diffsHide' style='display:none'>
202 <table cellpadding='0' cellspacing='0' border='0'>
204 <td valign='top' colspan='2'>
205 {$mod_strings['LBL_UW_PREFLIGHT_FILES_DESC']}
210 <td valign='top' colspan='2'>
211 <input type='checkbox' onchange='preflightToggleAll(this);'> <i><b>{$mod_strings['LBL_UW_PREFLIGHT_TOGGLE_ALL']}</b></i>
216 foreach($errors['manual'] as $diff) {
217 $diff = clean_path($diff);
218 $_SESSION['files']['manual'][] = $diff;
220 $checked = (isAutoOverwriteFile($diff)) ? 'CHECKED' : '';
222 if(empty($checked)) {
223 $preserveFiles[] = $diff;
226 $diffs .= "<tr><td valign='top'>";
227 $diffs .= "<input type='checkbox' name='diff_files[]' value='{$diff}' $checked>";
228 $diffs .= "</td><td valign='top'>";
229 $diffs .= str_replace(getcwd(), '.', $diff);
230 $diffs .= "</td></tr>";
232 $diffs .= "</table>";
233 $diffs .= "</div></p>";
236 // list preserved files (templates, etc.)
238 foreach($preserveFiles as $pf) {
239 if(empty($preserve)) {
240 $preserve .= "<table cellpadding='0' cellspacing='0' border='0'><tr><td><b>";
241 $preserve .= $mod_strings['LBL_UW_PREFLIGHT_PRESERVE_FILES'];
242 $preserve .= "</b></td></tr>";
244 $preserve .= "<tr><td valign='top'><i>".str_replace(getcwd(), '.', $pf)."</i></td></tr>";
246 if(!empty($preserve)) {
247 $preserve .= '</table><br>';
249 $diffs = $preserve.$diffs;
250 } else { // NO FILE DIFFS REQUIRED
251 $diffs = $mod_strings['LBL_UW_PREFLIGHT_NO_DIFFS'];
254 logThis('*** ERROR: found too many preflight errors - displaying errors and stopping execution.');
255 $out = "<b>{$mod_strings['ERR_UW_PREFLIGHT_ERRORS']}:</b><hr />";
256 $out .= "<span class='error'>";
258 foreach($errors as $error) {
259 if(is_array($error)) { // manual diff files
262 $out .= "{$error}<br />";
265 $out .= "</span><br />";
270 ///////////////////////////////////////////////////////////////////////////////
271 //// SCHEMA SCRIPT HANDLING
272 logThis('starting schema preflight check...');
273 //Check the current and target versions and store them in session variables
274 if(!isset($sugar_db_version) || empty($sugar_db_version)) {
275 include('./sugar_version.php');
277 if(!isset($manifest['version']) || empty($manifest['version'])) {
278 include($_SESSION['unzip_dir'].'/manifest.php');
280 $current_version = substr(preg_replace("#[^0-9]#", "", $sugar_db_version),0,3);
281 $targetVersion = substr(preg_replace("#[^0-9]#", "", $manifest['version']),0,3);
283 //save the versions as session variables
284 $_SESSION['current_db_version'] = $current_version;
285 $_SESSION['target_db_version'] = $targetVersion;
286 $_SESSION['upgrade_from_flavor'] = $manifest['name'];
287 // aw: BUG 10161: check flavor conversion sql files
288 $sqlFile = ''; // cn: bug
289 if($current_version == $targetVersion) {
291 if(preg_match('/(.*?)([^0])$/', $current_version, $matches))
293 $current_version = $matches[1].'0';
296 switch($manifest['name']){
297 case 'SugarCE to SugarPro':
298 $sqlFile = $current_version.'_ce_to_pro_'.$db->dbType;
300 case 'SugarCE to SugarEnt':
301 $sqlFile = $current_version.'_ce_to_ent_'.$db->dbType;
303 case 'SugarCE to SugarCorp':
304 $sqlFile = $current_version.'_ce_to_corp_'.$db->dbType;
306 case 'SugarCE to SugarUlt':
307 $sqlFile = $current_version.'_ce_to_ult_'.$db->dbType;
309 case 'SugarPro to SugarEnt':
310 $sqlFile = $current_version.'_pro_to_ent_'.$db->dbType;
316 $sqlFile = $current_version.'_to_'.$targetVersion.'_'.$db->dbType;
319 $newTables = array();
321 if($db->dbType == 'oci8') {
323 $sqlScript = $_SESSION['unzip_dir'].'/scripts/'.$sqlFile.'.sql';
326 logThis('looking for schema script at: '.$sqlScript);
327 if(is_file($sqlScript)) {
328 logThis('found schema upgrade script: '.$sqlScript);
330 logThis('schema preflight using MySQL');
331 if(function_exists('sugar_fopen')){
332 $fp = sugar_fopen($sqlScript, 'r');
335 $fp = fopen($sqlScript, 'r');
337 $contents = stream_get_contents($fp);
338 $anyScriptChanges =$contents;
340 // remove __uw_temp tables
341 //testCleanUp($db->dbType);
344 $customTables = getCustomTables($db->dbType);
345 if ( !empty($customTables) ) {
346 $_SESSION['alterCustomTableQueries'] = alterCustomTables($db->dbType, $customTables);
348 $_SESSION['alterCustomTableQueries'] = false;
351 $schema = "<p><a href='javascript:void(0); toggleNwFiles(\"schemashow\");'>{$mod_strings['LBL_UW_SHOW_SCHEMA']}</a>";
352 $schema .= "<div id='schemashow' style='display:none;'>";
353 $schema .= "<textarea readonly cols='80' rows='10'>{$contents}</textarea>";
354 $schema .= "</div></p>";
356 if(!empty($sqlErrors)) {
358 $out = "<b class='error'>{$mod_strings['ERR_UW_PREFLIGHT_ERRORS']}:</b> ";
359 $out .= "<a href='javascript:void(0);toggleNwFiles(\"sqlErrors\");'>{$mod_strings['LBL_UW_SHOW_SQL_ERRORS']}</a><div id='sqlErrors' style='display:none'>";
360 foreach($sqlErrors as $sqlError) {
361 $out .= "<br><span class='error'>{$sqlError}</span>";
363 $out .= "</div><hr />";
366 $customTableSchema = '';
367 logThis('no schema script found - all schema preflight skipped');
369 logThis('schema preflight done.');
370 //// END SCHEMA SCRIPT HANDLING
371 ///////////////////////////////////////////////////////////////////////////////
374 if(version_compare(phpversion(),'5.2.1') < 0){
375 $php_521=$mod_strings['LBL_CURRENT_PHP_VERSION'].phpversion().$mod_strings['LBL_RECOMMENDED_PHP_VERSION'];
377 if(empty($mod_strings['LBL_UPGRADE_TAKES_TIME_HAVE_PATIENCE'])){
378 $mod_strings['LBL_UPGRADE_TAKES_TIME_HAVE_PATIENCE'] = 'Upgrade may take some time';
381 $style_for_out = empty($out)?'style=\'display:none\'':'';
382 $style_for_dif = empty($diffs)?'style=\'display:none\'':'';
383 $style_for_schemaChange = empty($schema)?'style=\'display:none\'':'';
386 <table cellpadding="3" cellspacing="0" border="0">
387 <tr {$style_for_out}>
388 <td colspan="2" align="left" valign="top">
392 <tr {$style_for_dif}>
393 <td align="left" valign="top">
394 <b>{$mod_strings['LBL_UW_MANUAL_MERGE']}</b>
396 <td align="left" valign="top">
401 <td colspan="3"> </td>
403 <tr {$style_for_schemaChange}>
404 <td align="left" valign="top">
405 <b>{$mod_strings['LBL_UW_SCHEMA_CHANGE']}</b>
407 <td align="left" valign="top">
411 <tr {$style_for_schemaChange}>
416 <b>{$mod_strings['LBL_UW_DB_METHOD']}</b><br />
417 <select name="schema_change" id="select_schema_change" onchange="checkSqlStatus(false);">
418 <option value="sugar">{$mod_strings['LBL_UW_DB_CHOICE1']}</option>
419 <option value="manual">{$mod_strings['LBL_UW_DB_CHOICE2']}</option>
422 <div id='show_sql_run' style='display:none'>
423 <input type='checkbox' name='sql_run' id='sql_run' onmousedown='checkSqlStatus(true);'> {$mod_strings['LBL_UW_SQL_RUN']}
433 <div id="upgradeDiv" style="display:none">
434 <table cellspacing="0" cellpadding="0" border="0">
436 <p><img src='modules/UpgradeWizard/processing.gif'></p>
443 $uwMain = $final.$form5;
445 //set the upgrade progress status.
446 set_upgrade_progress('preflight','done');
450 if(empty($mod_strings['LBL_INCOMPATIBLE_PHP_VERSION'])){
451 $mod_strings['LBL_INCOMPATIBLE_PHP_VERSION'] = 'Php version 5.2.1 or above is required.';
454 $php_verison_warning =<<<eoq
455 <table cellpadding="3" cellspacing="0" border="0">
457 <th colspan="2" align="left">
458 <span class='error'><b>{$mod_strings['LBL_INCOMPATIBLE_PHP_VERSION']}</b></span>
463 $php_warnings = $php_verison_warning;
465 //Add the backward compatibility check as well.
467 //Php Backward compatibility checks
468 if(ini_get("zend.ze1_compatibility_mode")) {
470 if(empty($mod_strings['LBL_BACKWARD_COMPATIBILITY_ON'])){
471 $mod_strings['LBL_BACKWARD_COMPATIBILITY_ON'] = 'Php Backward Compatibility mode is turned on. Set zend.ze1_compatibility_mode to Off for proceeding further';
474 $php_compatibility_warning =<<<eoq
475 <table cellpadding="3" cellspacing="0" border="0">
477 <th colspan="2" align="left">
478 <span class='error'><b>{$mod_strings['LBL_BACKWARD_COMPATIBILITY_ON']}</b></span>
483 $php_warnings .= $php_compatibility_warning;
485 if($php_warnings != null){
486 $uwMain = $php_warnings;
489 $GLOBALS['top_message'] = "<b>{$mod_strings['LBL_UW_PREFLIGHT_TESTS_PASSED2']}</b>";
493 $showNext = ($stop) ? false : true;
495 $stepBack = $_REQUEST['step'] - 1;
496 $stepNext = $_REQUEST['step'] + 1;
498 $stepRecheck = $_REQUEST['step'];
500 $_SESSION['step'][$steps['files'][$_REQUEST['step']]] = ($stop) ? 'failed' : 'success';