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-2012 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 if(!is_admin($current_user)) {
46 sugar_die($app_strings['ERR_NOT_ADMIN']);
49 require_once('include/utils/db_utils.php');
50 require_once('include/utils/zip_utils.php');
51 require_once('modules/UpgradeWizard/uw_utils.php');
52 require_once('modules/Administration/UpgradeHistory.php');
54 $GLOBALS['top_message'] = '';
56 if(!isset($locale) || empty($locale)) {
57 $locale = new Localization();
62 require_once('modules/Trackers/TrackerManager.php');
63 $trackerManager = TrackerManager::getInstance();
64 $trackerManager->pause();
65 $trackerManager->unsetMonitors();
67 ///////////////////////////////////////////////////////////////////////////////
69 list($base_upgrade_dir, $base_tmp_upgrade_dir) = getUWDirs();
70 $subdirs = array('full', 'langpack', 'module', 'patch', 'theme');
74 prepSystemForUpgrade();
89 $disableNextForLicense='';
91 if(!isset($_SESSION['step']) || !is_array($_SESSION['step'])){
92 $_SESSION['step'] = array();
96 ///////////////////////////////////////////////////////////////////////////////
98 ///////////////////////////////////////////////////////////////////////////////
100 $uh = new UpgradeHistory();
101 $smarty = new Sugar_Smarty();
103 //Initialize the session variables. If upgrade_progress.php is already created
104 //look for session vars there and restore them
105 initialize_session_vars();
107 $deletedPackage =false;
108 $cancelUpgrade = false;
109 $backOrRecheckUpgrade = false;
111 // this flag set in pre_install.php->UWUpgrade();
113 //ADDING A SESSION VARIBALE FOR KEEPING TRACK OF TOTAL UPGRADE TIME.
114 if(!isset($_SESSION['totalUpgradeTime'])){
115 $_SESSION['totalUpgradeTime'] = 0;
118 if(!isset($mod_strings['LBL_UW_ACCEPT_THE_LICENSE']) || $mod_strings['LBL_UW_ACCEPT_THE_LICENSE'] == null){
119 $mod_strings['LBL_UW_ACCEPT_THE_LICENSE'] = 'Accept License';
121 if(!isset($mod_strings['LBL_UW_CONVERT_THE_LICENSE']) || $mod_strings['LBL_UW_CONVERT_THE_LICENSE'] == null){
122 $mod_strings['LBL_UW_CONVERT_THE_LICENSE'] = 'Convert License';
125 $license_title = $mod_strings['LBL_UW_ACCEPT_THE_LICENSE'];
126 if((isset($sugar_flavor) && $sugar_flavor != null) && ($sugar_flavor=='OS' || $sugar_flavor=='CE')){
127 $license_title = $mod_strings['LBL_UW_CONVERT_THE_LICENSE'];
130 if(isset($_REQUEST['delete_package']) && $_REQUEST['delete_package'] == 'true') {
131 logThis('running delete old package');
133 if(!isset($_REQUEST['install_file']) || ($_REQUEST['install_file'] == "")) {
134 logThis('ERROR: trying to delete non-existent file: ['.$_REQUEST['install_file'].']');
135 $error .= $mod_strings['ERR_UW_NO_FILE_UPLOADED'].'<br>';
138 // delete file in upgrades/patch
139 $delete_me = 'upload://upgrades/patch/'.basename(urldecode( $_REQUEST['install_file'] ));
140 if(is_file($delete_me) && !@unlink($delete_me)) {
141 logThis('ERROR: could not delete: '.$delete_me);
142 $error .= $mod_strings['ERR_UW_FILE_NOT_DELETED'].$delete_me.'<br>';
145 // delete back up instance
146 $delete_dir = 'upload://upgrades/patch/'.remove_file_extension(urldecode($_REQUEST['install_file'])) . "-restore";
147 if(is_dir($delete_dir) && !@rmdir_recursive($delete_dir)) {
148 logThis('ERROR: could not delete: '.$delete_dir);
149 $error .= $mod_strings['ERR_UW_FILE_NOT_DELETED'].$delete_dir.'<br>';
153 $out = "<b><span class='error'>{$error}</span></b><br />";
154 if(!empty($GLOBALS['top_message'])){
155 $GLOBALS['top_message'] .= "<br />{$out}";
158 $GLOBALS['top_message'] = $out;
163 //redirect to the new upgradewizard
164 if(isset($_SESSION['Upgraded451Wizard']) && $_SESSION['Upgraded451Wizard']==true){
165 if(!isset($_SESSION['Initial_451to500_Step'])){
166 //redirect to the new upgradewizard
167 $redirect_new_wizard = $sugar_config['site_url' ].'/index.php?module=UpgradeWizard&action=index';
168 //'<form name="redirect" action="' .$redirect_new_wizard. '" >';
169 //echo "<meta http-equiv='refresh' content='0; url={$redirect_new_wizard}'>";
170 $_SESSION['Initial_451to500_Step'] = true;
171 //unset($_SESSION['step']);
172 $_REQUEST['step'] = 0;
184 $mod_strings['LBL_UW_TITLE_PREFLIGHT'],
185 $mod_strings['LBL_UW_TITLE_COMMIT'],
186 $mod_strings['LBL_UW_TITLE_END'],
187 $mod_strings['LBL_UW_TITLE_CANCEL'],
192 if(isset($_SESSION['UpgradedUpgradeWizard']) && $_SESSION['UpgradedUpgradeWizard'] == true) {
193 // Upgrading from 5.0 upwards and upload already performed.
204 $mod_strings['LBL_UW_TITLE_START'],
205 $mod_strings['LBL_UW_TITLE_SYSTEM_CHECK'],
206 $mod_strings['LBL_UW_TITLE_PREFLIGHT'],
207 $mod_strings['LBL_UW_TITLE_COMMIT'],
208 $mod_strings['LBL_UW_TITLE_END'],
209 $mod_strings['LBL_UW_TITLE_CANCEL'],
214 if (empty($mod_strings['LBL_UW_TITLE_LAYOUTS']))
215 $mod_strings['LBL_UW_TITLE_LAYOUTS'] = 'Layouts';
218 // Upgrading from 5.0 upwards and upload not performed yet.
231 $mod_strings['LBL_UW_TITLE_START'],
232 $mod_strings['LBL_UW_TITLE_SYSTEM_CHECK'],
233 $mod_strings['LBL_UPLOAD_UPGRADE'],
234 $mod_strings['LBL_UW_TITLE_PREFLIGHT'],
235 $mod_strings['LBL_UW_TITLE_COMMIT'],
236 $mod_strings['LBL_UW_TITLE_LAYOUTS'],
237 $mod_strings['LBL_UW_TITLE_END'],
238 $mod_strings['LBL_UW_TITLE_CANCEL'],
245 $upgradeStepFile = '';
246 if(isset($_REQUEST['step']) && $_REQUEST['step'] !=null){
247 if($_REQUEST['step'] == -1) {
248 $_REQUEST['step'] = count($steps['files']) - 1;
249 } elseif($_REQUEST['step'] >= count($steps['files'])) {
250 $_REQUEST['step'] = 0;
252 $upgradeStepFile = $steps['files'][$_REQUEST['step']];
254 //check if upgrade was run before. If so then resume from there
255 $previouUpgradeRun = get_upgrade_progress();
256 if($previouUpgradeRun != null){
257 //echo 'Previous run '.$previouUpgradeRun.'</br>';
258 $upgradeStepFile = $previouUpgradeRun;
260 for($i=0;$i<sizeof($steps['files']);$i++){
261 if($steps['files'][$i]== $previouUpgradeRun){
262 $_REQUEST['step']=$i;
268 // first time through - kill off old sessions
269 unset($_SESSION['step']);
270 $_REQUEST['step'] = 0;
271 $upgradeStepFile = $steps['files'][$_REQUEST['step']];
275 if($upgradeStepFile == 'license_fiveO'){
276 $disableNextForLicense = 'disabled = "disabled"';
278 if($upgradeStepFile == 'end'){
279 //if(isset($_SESSION['current_db_version']) && substr($_SESSION['current_db_version'],0,1) == 4){
281 include('modules/ACL/install_actions.php');
282 $old_mod_strings = $mod_strings;
283 $mod_strings = return_module_language($current_language, 'Administration');
284 include('modules/Administration/RebuildRelationship.php');
285 $mod_strings = $old_mod_strings;
286 //also add the cache cleaning here.
287 if(function_exists('deleteCache')){
291 if(isset($_SESSION['current_db_version']) && substr($_SESSION['current_db_version'],0,1) == 4){
292 //Remove footer from themes except default, love and link themes
293 logThis('Start removing footer.php file from themes...');
294 $deleteNot =array('themes/default/footer.php','themes/Love/footer.php','themes/Links/footer.php');
295 removeFileFromPath('footer.php','themes', $deleteNot);
296 logThis('End removing footer.php file from themes...');
301 require('modules/UpgradeWizard/'.$upgradeStepFile.'.php');
303 $afterCurrentStep = $_REQUEST['step'] + 1;
306 ///////////////////////////////////////////////////////////////////////////////
308 ///////////////////////////////////////////////////////////////////////////////
310 // Reload language strings after copy
311 if(empty($GLOBALS['current_language'])) {
312 $GLOBALS['current_language'] = 'en_us';
314 LanguageManager::loadModuleLanguage('UpgradeWizard', $GLOBALS['current_language'], true);
315 // display installed pieces and versions
316 $installeds = $uh->getAll();
317 $upgrades_installed = 0;
319 $uwHistory = '<table width="100%" border="0" cellspacing="0" cellpadding="0" class="edit view"><tr><td>'.$mod_strings['LBL_UW_DESC_MODULES_INSTALLED']."<br>\n";
320 $uwHistory .= "<ul>\n";
321 $uwHistory .= "<table class=\"edit view\" cellspacing=5>\n";
326 <b>{$mod_strings['LBL_ML_NAME']}</b>
329 <b>{$mod_strings['LBL_ML_TYPE']}</b>
332 <b>{$mod_strings['LBL_ML_VERSION']}</b>
335 <b>{$mod_strings['LBL_ML_INSTALLED']}</b>
338 <b>{$mod_strings['LBL_ML_DESCRIPTION']}</b>
341 <b>{$mod_strings['LBL_ML_ACTION']}</b>
346 foreach($installeds as $installed) {
348 $filename = from_html($installed->filename);
349 $date_entered = $installed->date_entered;
350 $type = $installed->type;
351 //rrs only display patches here
352 if($type == 'patch'){
353 $version = $installed->version;
354 $upgrades_installed++;
355 $link = is_file($filename)? ' <input type="hidden" name="module" value="UpgradeWizard">
356 <input type="hidden" name="action" value="index">
357 <input type="hidden" name="step" value="'.$_REQUEST['step'].'">
358 <input type="hidden" name="delete_package" value="true">
359 <input type=hidden name="install_file" value="'.$filename.'" />
360 <input type=submit value="'.$mod_strings['LBL_BUTTON_DELETE'].'" />':'';
364 $target_manifest = remove_file_extension( $filename ) . "-manifest.php";
366 // cn: bug 9174 - cleared out upgrade dirs, or corrupt entries in upgrade_history give us bad file paths
367 if(is_file($target_manifest)) {
368 require_once(getUploadRelativeName($target_manifest) );
369 $name = empty($manifest['name']) ? $filename : $manifest['name'];
370 $description = empty($manifest['description']) ? $mod_strings['LBL_UW_NONE'] : $manifest['description'];
372 if(isset($manifest['icon']) && $manifest['icon'] != "") {
373 $manifest_copy_files_to_dir = isset($manifest['copy_files']['to_dir']) ? clean_path($manifest['copy_files']['to_dir']) : "";
374 $manifest_copy_files_from_dir = isset($manifest['copy_files']['from_dir']) ? clean_path($manifest['copy_files']['from_dir']) : "";
375 $manifest_icon = clean_path($manifest['icon']);
376 $icon = "<!--not_in_theme!--><img src=\"" . $manifest_copy_files_to_dir . ($manifest_copy_files_from_dir != "" ? substr($manifest_icon, strlen($manifest_copy_files_from_dir)+1) : $manifest_icon ) . "\">";
378 $icon = getImageForType( $manifest['type'] );
381 $uwHistory .= "<form action=\"index.php\" method=\"post\">\n".
382 "<tr><td align=left>$icon</td><td align=left>$name</td><td align=left>$type</td><td align=left>$version</td><td align=left>$date_entered</td><td align=left>$description</td><td align=left>$link</td></tr>\n".
389 if($upgrades_installed == 0) {
390 $uwHistory .= "<td colspan='6'>";
391 $uwHistory .= $mod_strings['LBL_UW_NO_INSTALLED_UPGRADES'];
392 $uwHistory .= "</td></tr>";
395 $uwHistory .= "</table></td></tr>
397 $uwHistory .= "</ul>\n";
398 //// END UPGRADE HISTORY
399 ///////////////////////////////////////////////////////////////////////////////
401 ///////////////////////////////////////////////////////////////////////////////
404 if($upgradeStepFile=='preflight' || $upgradeStepFile=='commit' || $upgradeStepFile=='end'){
405 $UW_510RC_PACKAGE_MESSAGE=<<<eoq
406 <table cellpadding="3" cellspacing="0" border="0">
408 <th colspan="2" align="center">
409 <h1><span class='error'><b>We do not recommended upgrading your production system to 5.1.0 RC. We recommend upgrading a development system for testing purposes.</b></span></h1>
416 <script type="text/javascript" language="Javascript">
417 function toggleNwFiles(target) {
418 var div = document.getElementById(target);
420 if(div.style.display == "none") {
421 div.style.display = "";
423 div.style.display = "none";
429 function handlePreflight(step) {
430 if(step == 'preflight') {
431 if(document.getElementById('select_schema_change') != null){
432 document.getElementById('schema').value = document.getElementById('select_schema_change').value;
434 if(document.getElementById('diffs') != null) {
435 /* preset the hidden var for defaults */
436 checkSqlStatus(false);
438 theForm = document.getElementById('diffs');
440 for(i=0; i<theForm.elements.length; i++) {
441 if(theForm.elements[i].type == 'checkbox' && theForm.elements[i].checked == false) {
442 // we only want "DON'T OVERWRITE" files
446 serial += theForm.elements[i].value;
448 } document.getElementById('overwrite_files_serial').value = serial;
450 if(document.getElementById('addTask').checked == true) {
451 document.getElementById('addTaskReminder').value = 'remind';
453 if(document.getElementById('addEmail').checked == true) {
454 document.getElementById('addEmailReminder').value = 'remind';
459 var merge_necessary = true;
460 if(step == 'layouts')
461 merge_necessary = getSelectedModulesForLayoutMerge();
463 if(!merge_necessary){
464 document.getElementById('step').value = '{$afterCurrentStep}';
470 function handleUploadCheck(step, u_allow) {
471 if(step == 'upload' && !u_allow) {
472 document.getElementById('top_message').innerHTML = '<span class="error"><b>{$mod_strings['LBL_UW_FROZEN']}</b></span>';
479 function getSelectedModulesForLayoutMerge()
481 var found_one = false;
482 var results = new Array();
483 var table = document.getElementById('layoutSelection');
484 var moduleCheckboxes = table.getElementsByTagName('input');
485 for (var i = 0; i < moduleCheckboxes.length; i++)
487 var singleCheckbox = moduleCheckboxes[i];
488 if( typeof(singleCheckbox.type) != 'undefined' && singleCheckbox.type == 'checkbox'
489 && singleCheckbox.name.substring(0,2) == 'lm' && singleCheckbox.checked )
492 results.push(singleCheckbox.name.substring(3)); //remove the 'lm_' key
496 var selectedModules = results.join('^,^');
498 var selectedModulesElement = document.createElement('input');
499 selectedModulesElement.setAttribute('type', 'hidden');
500 selectedModulesElement.setAttribute('name', 'layoutSelectedModules');
501 selectedModulesElement.setAttribute('value', selectedModules);
503 var upgradeForms = document.getElementsByName('UpgradeWizardForm');
504 upgradeForms[0].appendChild(selectedModulesElement);
510 $smarty->assign('UW_MAIN', $uwMain);
511 $smarty->assign('UW_JS', $js);
512 $smarty->assign('CHECKLIST', getChecklist($steps, $step));
513 $smarty->assign('UW_TITLE', getClassicModuleTitle($mod_strings['LBL_UW_TITLE'], array($mod_strings['LBL_UW_TITLE'],$steps['desc'][$_REQUEST['step']]), false));
514 $smarty->assign('MOD', $mod_strings);
515 $smarty->assign('APP', $app_strings);
516 $smarty->assign('GRIDLINE', $current_user->getPreference('gridline'));
517 $smarty->assign('showNext', $showNext);
518 $smarty->assign('showCancel', $showCancel);
519 $smarty->assign('showBack', $showBack);
520 $smarty->assign('showRecheck', $showRecheck);
521 $smarty->assign('showDone', $showDone);
522 $smarty->assign('showExit', $showExit);
523 $smarty->assign('STEP_NEXT', $stepNext);
524 $smarty->assign('STEP_CANCEL', $stepCancel);
525 $smarty->assign('STEP_BACK', $stepBack);
526 $smarty->assign('STEP_RECHECK', $stepRecheck);
527 $smarty->assign('step', $steps['files'][$_REQUEST['step']]);
528 $smarty->assign('UW_HISTORY', $uwHistory);
529 $smarty->assign('disableNextForLicense',$disableNextForLicense);
531 if(isset($stop) && $stop == true) {
532 $frozen = (isset($frozen)) ? "<br />".$frozen : '';
533 $smarty->assign('frozen', $frozen);
534 if($step == 'upload')
537 $smarty->assign('u_allow', $u_allow);
538 if(!empty($GLOBALS['top_message'])){
539 $smarty->assign('top_message', $GLOBALS['top_message']);
542 if ($sugar_config['sugar_version'] < '5.5') {
543 $smarty->assign('includeContainerCSS', true);
545 $smarty->assign('includeContainerCSS', false);
547 $smarty->display('modules/UpgradeWizard/uw_main.tpl');
549 ///////////////////////////////////////////////////////////////////////////////