$app->downloadPackage($_REQUEST['id']); return array(CONTROLLER_STATUS_REDIRECT, 'upgrade_center.manage'); } if ($mode == 'upload') { $upgrade_pack = fn_filter_uploaded_data('upgrade_pack', Registry::get('config.allowed_pack_exts')); if (empty($upgrade_pack[0])) { fn_set_notification('E', __('error'), __('text_allowed_to_upload_file_extension', array('[ext]' => implode(',', Registry::get('config.allowed_pack_exts'))))); } else { $upgrade_pack = $upgrade_pack[0]; $app->uploadUpgradePack($upgrade_pack); } return array(CONTROLLER_STATUS_REDIRECT, 'upgrade_center.manage'); } if ($mode == 'install') { if (!empty($_REQUEST['change_ftp_settings'])) { Log::instance($_REQUEST['id'])->add('Update FTP connection settings'); foreach ($_REQUEST['change_ftp_settings'] as $setting_name => $value) { Settings::instance()->updateValue($setting_name, $value, '', true); Registry::set('settings.Upgrade_center.' . $setting_name, $value); } } fn_delete_notification('uc.timeout_check_success'); list($result, $data) = $app->install($_REQUEST['id'], $_REQUEST); if ($result === UpgradeCenter::PACKAGE_INSTALL_RESULT_FAIL) { $view = Tygh::$app['view']; $view->assign('validation_result', $result); $view->assign('validation_data', $data); $view->assign('id', str_replace('.', '_', $_REQUEST['id'])); $view->assign('type', $_REQUEST['type']); $view->assign('caption', __('continue')); $view->assign('show_pre_upgrade_notice', false);
public function doWrite($message, $newline) { Log::instance($this->config['package_id'])->add($message); $this->buffer .= $message . ($newline ? PHP_EOL : ''); }
public function chmod($path, $permissions, Log $logger) { $logger->add(str_repeat('-', 10)); $logger->add(sprintf('Changing permissions of "%s" to %o', $path, $permissions)); $logger->add('Using chmod()... ', true, true, false); $result = @chmod($path, $permissions); $logger->add($result ? 'OK' : 'FAILED', true, false, true); if (!$result) { $logger->add('Using FTP...'); $ftp_connection = Registry::get('ftp_connection'); if (is_resource($ftp_connection)) { $logger->add('Connection is already established'); $ftp_ready = true; } elseif (fn_ftp_connect($this->settings, true)) { $logger->add('Connection established'); $ftp_ready = true; } else { $logger->add('Failed to establish connection'); $ftp_ready = false; } if ($ftp_ready) { $result = fn_ftp_chmod_file($path, $permissions, false); $logger->add(sprintf('FTP chmod result: %s', $result ? 'OK' : 'FAILED')); } } $logger->add(str_repeat('-', 10)); return $result; }
/** * Validates and installs package * * @todo Implement language installer * @todo Additional migrations validation * * @param string $package_id Package id like "core", "access_restrictions", etc * @return array($result, $data) Installation result */ public function install($package_id, $request) { $result = true; $logger = Log::instance($package_id); $logger->add(''); $logger->add(str_replace('[package_id]', $package_id, 'Start installation of the "[package_id]" upgrade package')); $logger->add('================================================'); $logger->add('Get all available validators'); Output::steps(5); // Validators, Backups (database/files), Copying Files, Migrations, Languages Output::display(__('uc_title_validators'), __('uc_upgrade_progress'), false); $validators = $this->getValidators(); $schema = $this->getSchema($package_id, true); $information_schema = $this->getSchema($package_id, false); $package_validators = $this->getPackageValidators($package_id, $schema); if (!empty($package_validators)) { $validators = array_merge($package_validators, $validators); } foreach ($validators as $validator) { $logger->add(str_replace('[validator]', $validator->getName(), 'Execute "[validator]" validator')); Output::display(__('uc_execute_validator', array('[validator]' => $validator->getName())), '', false); list($result, $data) = $validator->check($schema, $request); if (!$result) { break; } } if (!$result) { $logger->add('Upgrade stopped: Awaiting resolving validation errors: ' . $validator->getName()); return array($result, array($validator->getName() => $data)); } else { $backup_filename = "upg_{$package_id}_{$information_schema['from_version']}-{$information_schema['to_version']}_" . date('dMY_His', TIME); // Prepare restore.php file. Paste necessary data and access information $restore_key = $this->prepareRestore($backup_filename . '.zip'); if (empty($restore_key)) { $logger->add('Upgrade stopped: Unable to prepare restore file. restore.php was locally modified/removed or renamed.'); return array(false, array(__('restore') => __('upgrade_center.unable_to_prepare_restore'))); } $content_path = $this->getPackagesDir() . $package_id . '/content/'; // Run pre script if (!empty($schema['scripts']['pre'])) { include_once $content_path . 'scripts/' . $schema['scripts']['pre']; } $this->closeStore(); $logger->add('Backup files and Database'); Output::display(__('backup_data'), '', true); $backup_file = DataKeeper::backup(array('pack_name' => $backup_filename, 'compress' => 'zip', 'set_comet_steps' => false, 'move_progress' => false)); if (empty($backup_file) || !file_exists($backup_file)) { $logger->add('Upgrade stopped: Failed to backup DB/Files'); return array(false, array(__('backup') => __('text_uc_failed_to_backup_tables'))); } // Send mail to admin e-mail with information about backup Mailer::sendMail(array('to' => 'company_site_administrator', 'from' => 'default_company_site_administrator', 'data' => array('backup_file' => $backup_file, 'settings_section_url' => fn_url('settings.manage'), 'restore_link' => Registry::get('config.http_location') . '/var/upgrade/restore.php?uak=' . $restore_key), 'tpl' => 'upgrade/backup_info.tpl'), 'A', Registry::get('settings.Appearance.backend_default_language')); $logger->add('Copy package files'); Output::display(__('uc_copy_files'), '', true); // Move files from package $this->applyPackageFiles($content_path . 'package', $this->config['dir']['root']); $this->cleanupOldFiles($schema, $this->config['dir']['root']); // Copy files from themes_repository to design folder $this->processThemesFiles($schema); Output::display(__('uc_run_migrations'), '', true); // Run migrations if (!empty($schema['migrations'])) { $logger->add('Run migrations'); $minimal_date = 0; foreach ($schema['migrations'] as $migration) { preg_match('/^[0-9]+/', $migration, $matches); if (!empty($matches[0])) { $date = $matches[0]; if ($date < $minimal_date || empty($minimal_date)) { $minimal_date = $date; } } } $config = array('migration_dir' => $content_path . 'migrations/', 'package_id' => $package_id); Migration::instance($config)->migrate($minimal_date); } // Install languages Output::display(__('uc_install_languages'), '', true); if (!empty($schema['languages'])) { $logger->add('Install langauges from the upgrade package'); $avail_languages = Languages::getAvailable('A', true); foreach ($avail_languages as $lang_code => $language) { if (in_array($lang_code, $schema['languages'])) { $logger->add(str_replace('[lang_code]', $lang_code, 'Install the \\"[lang_code]\\" language')); Output::display(__('install') . ': ' . $lang_code, '', false); Languages::installCrowdinPack($content_path . 'languages/' . $lang_code, array('install_newly_added' => true, 'validate_lang_code' => true, 'reinstall' => true)); } else { $pack_code = ''; if (in_array(CART_LANGUAGE, $schema['languages'])) { $pack_code = CART_LANGUAGE; } elseif (in_array('en', $schema['languages'])) { $pack_code = 'en'; } if (file_exists($content_path . 'languages/' . $pack_code)) { // Fill the unknown language by the Default/EN language variables Languages::installCrowdinPack($content_path . 'languages/' . $pack_code, array('reinstall' => true, 'force_lang_code' => $lang_code, 'install_newly_added' => true)); } } } } } // Run post script if (!empty($schema['scripts']['post'])) { include_once $content_path . 'scripts/' . $schema['scripts']['post']; } Output::display(__('text_uc_upgrade_completed'), '', true); $logger->add('Upgrade completed'); $this->deletePackage($package_id); // Clear obsolete files fn_clear_cache(); fn_rm(Registry::get('config.dir.cache_templates')); return array(true, array()); }
/** * @param array $package_content_schema Package content schema * @param Log $logger Logger instance * @param string $package_content_path Package content path * * @return array First element is a list of languages to be installed, second element is a list languages failed to install */ public function installLanguages($package_content_schema, Log $logger, $package_content_path) { $failed_to_install = array(); $installed_languages = array_keys(Languages::getAvailable('A', true)); if (empty($package_content_schema['languages'])) { $logger->add('Installing languages using upgraded *.po files'); $po_pack_basepath = $this->config['dir']['lang_packs']; $lang_codes_to_install = $this->getLangCodesToReinstallFromContentSchema($package_content_schema); } else { $logger->add('Installing languages provided by package'); $po_pack_basepath = $package_content_path . 'languages/'; $lang_codes_to_install = (array) $package_content_schema['languages']; } $logger->add(sprintf('Already installed languages: %s', implode(', ', $installed_languages))); $logger->add(sprintf('Languages to be installed: %s', implode(', ', $lang_codes_to_install))); if (in_array(CART_LANGUAGE, $lang_codes_to_install)) { $fallback_lang_code = CART_LANGUAGE; } elseif (in_array('en', $lang_codes_to_install)) { $fallback_lang_code = 'en'; } else { $fallback_lang_code = null; } foreach ($installed_languages as $lang_code) { $logger->lineStart(sprintf('Installing "%s" language... ', $lang_code)); if (in_array($lang_code, $lang_codes_to_install)) { Output::display(__('install') . ': ' . $lang_code, '', false); if (false === Languages::installCrowdinPack($po_pack_basepath . $lang_code, array('install_newly_added' => true, 'validate_lang_code' => $lang_code, 'reinstall' => true))) { $logger->lineEnd('FAILED'); $failed_to_install[] = $lang_code; } else { $logger->lineEnd('OK'); } } elseif ($fallback_lang_code !== null) { if (false === Languages::installCrowdinPack($po_pack_basepath . $fallback_lang_code, array('reinstall' => true, 'force_lang_code' => $lang_code, 'install_newly_added' => true))) { $logger->lineEnd('FAILED'); $failed_to_install[] = $lang_code; } else { $logger->lineEnd('OK'); } } else { $logger->lineEnd('SKIPPED'); } } return array($lang_codes_to_install, $failed_to_install); }