removed installation process

This commit is contained in:
IsaiDiaz
2025-06-13 11:14:23 -04:00
parent 3427eed873
commit e79a9436b4
2 changed files with 1 additions and 619 deletions

Binary file not shown.

View File

@@ -78,60 +78,10 @@ class InstallerModule extends Controller
$this->includeExtJS('installer/installer_cards');
$this->includeExtJS('installer/main', false);
$this->setJSVar('licenseTxt', $licenseContent);
$this->setJSVar('path_config', $this->path_config);
$this->setJSVar('path_languages', $this->path_languages);
$this->setJSVar('path_plugins', $this->path_plugins);
$this->setJSVar('path_xmlforms', $this->path_xmlforms);
$this->setJSVar('path_public', $this->path_public);
$this->setJSVar('path_shared', $this->path_shared);
$this->setJSVar('path_sep', $this->path_sep);
$this->setJSVar('path_translations', $this->path_translations);
$this->setJSVar('path_translationsMafe', $this->path_translationsMafe);
$this->setView('installer/main');
G::RenderPage('publish', 'extJs');
}
/**
* This function can be create a new workspace
* The user need permission PM_SETUP_ADVANCE for this action
* @return void
*/
public function newSite()
{
if (!$this->pmIsInstalled()) {
$textStep1 = G::LoadTranslation('ID_PROCESSMAKER_REQUIREMENTS_DESCRIPTION_STEP4_1');
$textStep2 = G::LoadTranslation('ID_PROCESSMAKER_REQUIREMENTS_DESCRIPTION_STEP5');
$this->includeExtJS('installer/CardLayout', false);
$this->includeExtJS('installer/Wizard', false);
$this->includeExtJS('installer/Header', false);
$this->includeExtJS('installer/Card', false);
$this->includeExtJS('installer/newSite', false);
$this->setJSVar('textStep1', $textStep1);
$this->setJSVar('textStep2', $textStep2);
$this->setJSVar('DB_ADAPTER', DB_ADAPTER);
$aux = explode(':', DB_HOST);
$this->setJSVar('DB_HOST', $aux[0]);
$this->setJSVar('DB_PORT', isset($aux[1]) ? $aux[1] : '3306');
$this->setJSVar('DB_NAME', 'workflow');
$this->setJSVar('DB_USER', '');
$this->setJSVar('DB_PASS', '');
$this->setJSVar('pathConfig', PATH_CORE . 'config' . PATH_SEP);
$this->setJSVar('pathLanguages', PATH_LANGUAGECONT);
$this->setJSVar('pathPlugins', PATH_PLUGINS);
$this->setJSVar('pathXmlforms', PATH_XMLFORM);
$this->setJSVar('pathShared', PATH_DATA);
$this->setView('installer/newSite');
G::RenderPage('publish', 'extJs');
} else {
$this->displayError();
}
}
/**
* Set config connection
*
@@ -473,45 +423,6 @@ class InstallerModule extends Controller
return true;
}
/**
* function to create a workspace
* in fact this function is calling appropriate functions for mysql
* need permission PM_SETUP_ADVANCE for this action
* @return stdClass information create a workspace.
*/
public function createWorkspace()
{
if (!$this->pmIsInstalled()) {
$pathSharedPartner = trim($_REQUEST['pathShared']);
if (file_exists(trim($pathSharedPartner, PATH_SEP) . PATH_SEP . 'partner.info')) {
$this->systemName = $this->getSystemName($pathSharedPartner);
$_REQUEST['PARTNER_FLAG'] = true;
}
$this->setResponseType('json');
$info = new StdClass();
try {
$info = $this->createMySQLWorkspace();
} catch (Exception $e) {
$info->result = false;
$info->message = G::LoadTranslation('DBCONNECTIONS_MSGA');
}
return $info;
} else {
$this->displayError();
}
}
/**
* We check if processMaker is not installed
*
* @return boolean
*/
private function pmIsInstalled()
{
return file_exists(FILE_PATHS_INSTALLED);
}
/**
* Display an error when processMaker is already installed
*
@@ -600,287 +511,6 @@ class InstallerModule extends Controller
return true;
}
/**
* set Grant Privileges for MySQL
*
* @param string $psUser
* @param string $psPassword
* @param string $psDatabase
* @param string $host
*
* @throws Exception
*/
private function setGrantPrivilegesMySQL($psUser, $psPassword, $psDatabase, $host)
{
try {
$host = $host === 'localhost' || $host === '127.0.0.1' ? 'localhost' : '%';
$query = "CREATE USER '$psUser'@'$host' IDENTIFIED WITH mysql_native_password BY '$psPassword'";
DB::connection(self::CONNECTION_INSTALL)
->statement($query);
$query = "GRANT ALL PRIVILEGES ON `$psDatabase`.* TO '$psUser'@'$host' WITH GRANT OPTION";
DB::connection(self::CONNECTION_INSTALL)
->statement($query);
$this->installLog($query);
} catch (QueryException $e) {
$this->installLog(G::LoadTranslation('ID_MYSQL_ERROR', SYS_LANG, [$e->getMessage()]));
throw new Exception($e->getMessage());
}
}
/**
* Create a workspace in a MySQL database
*
* @return StdClass object
*/
public function createMySQLWorkspace()
{
$filter = new InputFilter();
ini_set('max_execution_time', '0');
$info = new StdClass();
$info->result = false;
$info->message = '';
$info->canRedirect = true;
$db_hostname = trim($_REQUEST['db_hostname']);
$db_port = trim($_REQUEST['db_port']);
$db_port = $filter->validateInput($db_port);
$db_username = trim($_REQUEST['db_username']);
$db_username = $filter->validateInput($db_username);
$db_password = urlencode(trim($_REQUEST['db_password']));
$db_password = urldecode($filter->validateInput($db_password));
$wf = trim($_REQUEST['wfDatabase']);
$workspace = trim($_REQUEST['workspace']);
$pathShared = trim($_REQUEST['pathShared']);
$adminPassword = trim($_REQUEST['adminPassword']);
$adminPassword = $filter->validateInput($adminPassword);
$adminUsername = trim($_REQUEST['adminUsername']);
$adminUsername = $filter->validateInput($adminUsername);
$deleteDB = $_REQUEST['deleteDB'] === 'true';
$userLogged = isset($_REQUEST['userLogged']) ? $_REQUEST['userLogged'] === 'true' : false;
$userLogged = $filter->validateInput($userLogged);
if (substr($pathShared, -1) !== '/') {
$pathShared .= '/';
}
$this->installLog('-------------------------------------------');
$this->installLog(G::LoadTranslation('ID_CREATING_WORKSPACE', SYS_LANG, [$workspace]));
try {
$db_host = ($db_port != '' && $db_port != 3306) ? $db_hostname . ':' . $db_port : $db_hostname;
$envFile = PATH_CONFIG . 'env.ini';
$sysConf = System::getSystemConfiguration($envFile);
$langUri = 'en';
if (isset($sysConf['default_lang'])) {
$langUri = $sysConf['default_lang'];
}
$skinUri = 'lurana';
if (isset($sysConf['default_skin'])) {
$skinUri = $sysConf['default_skin'];
}
$updatedConf['default_lang'] = $langUri;
$updatedConf['default_skin'] = $skinUri;
$info->uri = PATH_SEP . 'sys' . $_REQUEST['workspace'] . PATH_SEP . $langUri . PATH_SEP . $skinUri . PATH_SEP . 'login' . PATH_SEP . 'login';
$http = G::is_https() ? 'https' : 'http';
$host = $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] !== '80' ? ':' . $_SERVER['SERVER_PORT'] : '');
$endpoint = sprintf(
'%s://%s/sys%s/%s/%s/oauth2/grant',
$http,
$host,
$workspace,
$langUri,
$skinUri
);
$pythonCliExecutablePath = PATH_HOME . 'engine/bin/lurana-installer';
$command = [
escapeshellarg($pythonCliExecutablePath),
'start',
"--host=" . ($db_hostname . ':' . $db_port),
"--workspace=" . $wf,
"--user=" . $db_username,
"--pass=" . $db_password,
"--admin-username=" . $adminUsername,
"--admin-password=" . $adminPassword,
"--endpoint=" . escapeshellarg($endpoint),
"--path-shared=" . escapeshellarg($pathShared),
"--file-paths-installed=" . escapeshellarg(FILE_PATHS_INSTALLED),
"--path-gulliver=" . escapeshellarg(PATH_GULLIVER),
"--path-data=" . escapeshellarg(PATH_DATA)
];
if ($deleteDB) {
$command[] = "--deleted-db";
}
if ($userLogged) {
$command[] = "--user-logged";
}
$output = [];
$return_var = 0;
$command_string = implode(' ', $command);
$this->installLog("Executing Python CLI (Alembic Only):\n" . $command_string);
exec($command_string, $output, $return_var);
if ($return_var !== 0) {
$info->result = false;
$error_message = "Python CLI for Alembic failed:\n" . implode("\n", $output);
$info->message = $error_message;
$this->installLog($error_message);
} else {
$this->installLog("Python CLI (Alembic Only) completed successfully.");
}
if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) {
$this->setPartner();
}
$indexFileUpdated = true;
if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) {
$this->buildParternExtras($adminUsername, $adminPassword, $_REQUEST['workspace'], $langUri, $skinUri);
} else {
try {
G::update_php_ini($envFile, $updatedConf);
} catch (Exception $e) {
$info->result = false;
$info->message = G::LoadTranslation('ID_PROCESSMAKER_WRITE_CONFIG_INDEX', SYS_LANG, [$envFile]);
$info->message .= G::LoadTranslation('ID_PROCESSMAKER_UI_NOT_INSTALL');
$this->installLog(G::LoadTranslation('ID_INSTALL_BUT_ERROR', SYS_LANG, ['env.ini']));
return $info;
}
try {
// update the main index file
$indexFileUpdated = System::updateIndexFile(['lang' => 'en', 'skin' => $updatedConf['default_skin']]);
} catch (Exception $e) {
$info->result = false;
$info->message = G::LoadTranslation('ID_PROCESSMAKER_WRITE_CONFIG_INDEX', SYS_LANG, [PATH_HTML . "index.html."]);
$info->message .= G::LoadTranslation('ID_PROCESSMAKER_UI_NOT_INSTALL');
$this->installLog(G::LoadTranslation('ID_INSTALL_BUT_ERROR', SYS_LANG, ['index.html']));
return $info;
}
}
$this->installLog(G::LoadTranslation('ID_INDEX_FILE_UPDATED', SYS_LANG, [$indexFileUpdated, $sysConf['default_lang'], $sysConf['default_skin']]));
$this->installLog(G::LoadTranslation('ID_INSTALL_SUCESS'));
$info->result = true;
$info->message = G::LoadTranslation('ID_INSTALL_SUCESS');
$info->messageFinish = G::LoadTranslation('ID_PROCESSMAKER_SUCCESS_INSTALLED', SYS_LANG, [$workspace]);
} catch (Exception $e) {
$info->canRedirect = false;
$info->result = false;
$info->message = $e->getMessage();
}
return $info;
}
public function getSystemName($siteShared)
{
$systemName = '';
if (substr($siteShared, -1) != '/') {
$siteShared .= '/';
}
if (file_exists($siteShared . 'partner.info')) {
$dataInfo = parse_ini_file($siteShared . 'partner.info');
if (isset($dataInfo['system_name'])) {
$systemName = trim($dataInfo['system_name']);
}
}
return $systemName;
}
/**
* Get the Database engines list
*
* @return object
*/
public function getEngines()
{
$this->setResponseType('json');
$engines = [];
if (function_exists('mysqli_query')) {
$engine = new stdclass();
$engine->id = 'mysql';
$engine->label = 'MySQL';
$engines[] = $engine;
}
return $engines;
}
public function checkDatabases()
{
$filter = new InputFilter();
$this->setResponseType('json');
$info = new stdclass();
$db_hostname = $filter->validateInput($_REQUEST['db_hostname']);
$db_username = $filter->validateInput($_REQUEST['db_username']);
$db_password = urlencode($_REQUEST['db_password']);
$db_password = urldecode($filter->validateInput($db_password));
$db_port = $filter->validateInput($_REQUEST['db_port']);
switch ($_REQUEST['db_engine']) {
case 'mysql':
$wfDatabase = $filter->validateInput($_REQUEST['wfDatabase'], 'nosql');
self::setNewConnection(self::CONNECTION_TEST_INSTALL, $db_hostname, $db_username, $db_password, '', $db_port);
$response = DB::connection(self::CONNECTION_TEST_INSTALL)
->select("show databases like '$wfDatabase'");
$info->wfDatabaseExists = count($response) > 0;
break;
case 'sqlsrv':
$arguments = [
'UID' => $db_username,
'PWD' => $db_password,
'CharacterSet' => 'UTF-8',
'Encrypt' => true,
'TrustServerCertificate' => true
];
$link = @sqlsrv_connect($db_hostname, $arguments);
$wfDatabase = $filter->validateInput($_REQUEST['wfDatabase'], 'nosql');
$query = "select * from sys.databases where name = '%s' ";
$query = $filter->preventSqlInjection($query, array($wfDatabase));
$dataSet = @sqlsrv_query($link, $query);
$info->wfDatabaseExists = (@sqlsrv_num_rows($dataSet) > 0);
break;
default:
break;
}
$info->errMessage = G::LoadTranslation('ID_DATABASE_EXISTS_OVERWRITE');
return $info;
}
/**
* Privates functions section, non callable by http request
*/
@@ -929,254 +559,6 @@ class InstallerModule extends Controller
return $info;
}
/**
* This function define the partner behaviour when the PARTNER_FLAG is defined
* Execute to change of skin
*
* @return void
*/
private function setPartner()
{
if (defined('PARTNER_FLAG') || isset($_REQUEST['PARTNER_FLAG'])) {
// Execute sql for partner
$pathMysqlPartner = PATH_CORE . 'data' . PATH_SEP . 'partner' . PATH_SEP . 'mysql' . PATH_SEP;
if (G::verifyPath($pathMysqlPartner)) {
$filesSlq = glob($pathMysqlPartner . '*.sql');
foreach ($filesSlq as $value) {
$this->mysqlFileQuery($value);
}
}
// Execute to change of skin
$pathSkinPartner = PATH_CORE . 'data' . PATH_SEP . 'partner' . PATH_SEP . 'skin' . PATH_SEP;
if (G::verifyPath($pathSkinPartner)) {
$fileTar = glob($pathSkinPartner . '*.tar');
foreach ($fileTar as $value) {
$dataFile = pathinfo($value);
$nameSkinTmp = $dataFile['filename'];
$tar = new Archive_Tar($value);
$pathSkinTmp = $pathSkinPartner . 'tmp' . PATH_SEP;
G::rm_dir($pathSkinTmp);
G::verifyPath($pathSkinTmp, true);
chmod($pathSkinTmp, 0777);
$tar->extract($pathSkinTmp);
$pathSkinName = $pathSkinTmp . $nameSkinTmp . PATH_SEP;
chmod($pathSkinName, 0777);
G::verifyPath(PATH_CORE . 'skinEngine' . PATH_SEP . 'tmp', true);
$skinClassic = PATH_CORE . 'skinEngine' . PATH_SEP . 'tmp' . PATH_SEP;
if (is_dir($pathSkinName)) {
$this->copyFile($pathSkinName, $skinClassic);
}
G::rm_dir(PATH_CORE . 'skinEngine' . PATH_SEP . 'base');
rename(PATH_CORE . 'skinEngine' . PATH_SEP . 'tmp', PATH_CORE . 'skinEngine' . PATH_SEP . 'base');
G::rm_dir(PATH_CORE . 'skinEngine' . PATH_SEP . 'tmp');
break;
}
}
}
}
/**
* Copy a directory or file
*
* @param string $fromDir
* @param string $toDir
* @param integer $chmod
*
* @return void
*/
public function copyFile($fromDir, $toDir, $chmod = 0777)
{
$errors = [];
$messages = [];
if (!is_writable($toDir)) {
$errors[] = 'target ' . $toDir . ' is not writable';
}
if (!is_dir($toDir)) {
$errors[] = 'target ' . $toDir . ' is not a directory';
}
if (!is_dir($fromDir)) {
$errors[] = 'source ' . $fromDir . ' is not a directory';
}
if (!empty($errors)) {
return false;
}
$exceptions = array('.', '..');
$handle = opendir($fromDir);
while (false !== ($item = readdir($handle))) {
if (!in_array($item, $exceptions)) {
$from = str_replace('//', '/', $fromDir . '/' . $item);
$to = str_replace('//', '/', $toDir . '/' . $item);
if (is_file($from)) {
if (@copy($from, $to)) {
chmod($to, $chmod);
touch($to, filemtime($from));
}
}
if (is_dir($from)) {
if (@mkdir($to)) {
chmod($to, $chmod);
}
$this->copyFile($from, $to, $chmod);
}
}
}
closedir($handle);
}
/**
* Define build Pattern Extras related to:
* Upload translation .po file
* Upload skin file
* Upload plugin file
*
* @param string $username
* @param string $password
* @param string $workspace
* @param string $lang
* @param string $skinName
*
* @return void
*/
private function buildParternExtras($username, $password, $workspace, $lang, $skinName)
{
$filter = new InputFilter();
ini_set('max_execution_time', '0');
$serv = 'http://';
if (isset($_SERVER['HTTPS']) && !empty(trim($_SERVER['HTTPS']))) {
$serv = 'https://';
}
$serv .= $_SERVER['SERVER_NAME'];
if (isset($_SERVER['SERVER_PORT']) && !empty(trim($_SERVER['SERVER_PORT']))) {
$serv .= ':' . $_SERVER['SERVER_PORT'];
}
// create session
$cookiefile = sys_get_temp_dir() . PATH_SEP . 'curl-session';
$fp = fopen($cookiefile, "w");
fclose($fp);
chmod($cookiefile, 0777);
$user = urlencode($username);
$user = $filter->validateInput($user);
$pass = urlencode($password);
$pass = $filter->validateInput($pass);
$lang = urlencode($lang);
$lang = $filter->validateInput($lang);
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "$serv/sys{$workspace}/{$lang}/{$skinName}/login/authentication");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "form[USR_USERNAME]=$user&form[USR_PASSWORD]=$pass&form[USER_LANG]=$lang");
curl_setopt($ch, CURLOPT_TIMEOUT, 90);
$output = curl_exec($ch);
curl_close($ch);
/**
* Upload translation .po file
*/
$ch = curl_init();
$postData = [];
// File to upload/post
$postData['form[LANGUAGE_FILENAME]'] = "@" . PATH_CORE . "content/translations/processmaker.$lang.po";
curl_setopt($ch, CURLOPT_URL, "$serv/sys{$workspace}/{$lang}/{$skinName}/setup/languages_Import");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 90);
$output = curl_exec($ch);
curl_close($ch);
/**
* Upload skin file
*/
$ch = curl_init();
$postData = [];
$skins = glob(PATH_CORE . "data/partner/*.tar");
if (count($skins) > 0) {
$skin = $skins[0];
$postData['overwrite_files'] = "on";
$postData['workspace'] = "global";
$postData['option'] = "standardupload";
$postData['action'] = "importSkin";
// File to upload/post
$postData['uploadedFile'] = "@" . $skin;
curl_setopt($ch, CURLOPT_URL, "$serv/sys{$workspace}/{$lang}/{$skinName}/setup/skin_Ajax");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 90);
$output = curl_exec($ch);
curl_close($ch);
}
/**
* Upload plugin file
*/
$ch = curl_init();
$postData = [];
// resolv the plugin name
$plugins = glob(PATH_CORE . "plugins/*.tar");
if (count($plugins) > 0) {
$pluginName = $plugins[0];
// File to upload/post
$postData['form[PLUGIN_FILENAME]'] = "@{$pluginName}";
curl_setopt($ch, CURLOPT_URL, "$serv/sys{$workspace}/{$lang}/{$skinName}/setup/pluginsImportFile");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 90);
$output = curl_exec($ch);
curl_close($ch);
}
}
/**
* Verify/create framework shared directory structure
*