An array sometimes is being passed as the error log, which was causing a fatal error when the installation crashed. This also hides the real reason of the crash, since the installation log never shows.
396 lines
14 KiB
PHP
396 lines
14 KiB
PHP
<?php
|
|
/**
|
|
* installServer.php
|
|
*
|
|
* ProcessMaker Open Source Edition
|
|
* Copyright (C) 2004 - 2008 Colosa Inc.23
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
|
|
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
|
|
*
|
|
*/
|
|
|
|
$isWindows = PHP_OS == 'WINNT' ? true : false;
|
|
|
|
$oJSON = new Services_JSON();
|
|
$action = $_POST['action'];
|
|
$dataClient = $oJSON->decode(stripslashes($_POST['data']));
|
|
function find_SQL_Version($my = 'mysql',$infExe)
|
|
{
|
|
if(PHP_OS=="WINNT" && !$infExe)
|
|
{
|
|
return false;
|
|
}
|
|
$output = shell_exec($my.' -V');
|
|
preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $output, $version);
|
|
return $version[0];
|
|
}
|
|
if($action==="check")
|
|
{
|
|
/* TODO: Check if this space is required */
|
|
print " ";
|
|
G::LoadClass('Installer');
|
|
$inst = new Installer();
|
|
$siteName="workflow";
|
|
$p1 = (isset($dataClient->ao_admin_pass1))?$dataClient->ao_admin_pass1:'admin';
|
|
$p2 = (isset($dataClient->ao_admin_pass2))?$dataClient->ao_admin_pass2:'admin';
|
|
$s = $inst->create_site(Array(
|
|
'name' =>'workflow',
|
|
'path_data'=>$dataClient->path_data,
|
|
'path_compiled'=>$dataClient->path_compiled,
|
|
'admin'=>Array('username'=>(isset($dataClient->ao_admin))?$dataClient->ao_admin:'admin','password'=>$p1),
|
|
'advanced'=>Array(
|
|
'ao_db'=>(isset($dataClient->ao_db) && $dataClient->ao_db===2)?false:true,
|
|
'ao_db_drop'=>(isset($dataClient->ao_db_drop) && $dataClient->ao_db_drop===true)?true:false,
|
|
'ao_db_wf'=>(isset($dataClient->ao_db_wf))?$dataClient->ao_db_wf:'wf_'.$siteName,
|
|
'ao_db_rb'=>(isset($dataClient->ao_db_rb))?$dataClient->ao_db_rb:'rb_'.$siteName,
|
|
'ao_db_rp'=>(isset($dataClient->ao_db_rp))?$dataClient->ao_db_rp:'rp_'.$siteName
|
|
),
|
|
'database'=>Array(
|
|
'hostname'=>$dataClient->mysqlH,
|
|
'username'=>$dataClient->mysqlU,
|
|
'password'=>$dataClient->mysqlP
|
|
)
|
|
));
|
|
$data=null;
|
|
$data->phpVersion =(version_compare(PHP_VERSION,"5.1.0",">"))?true:false;
|
|
if(trim($dataClient->mysqlH)=='' || trim($dataClient->mysqlU)=='')
|
|
{
|
|
$con = array('connection'=>false,'grant'=>false,'message'=>'Please complete the input fields (Hostname/Username)');
|
|
}
|
|
$data->mysqlConnection =$s['result']['database']['connection'];
|
|
$data->grantPriv =$s['result']['database']['grant'];
|
|
$data->databaseMessage =$s['result']['database']['message'];
|
|
$data->mysqlVersion =$s['result']['database']['version'];
|
|
$data->path_data =$s['result']['path_data'];
|
|
$data->path_compiled = true;
|
|
$data->checkMemory =(((int)ini_get("memory_limit"))>=40)?true:false;
|
|
#$data->checkmqgpc =(get_magic_quotes_gpc())?false:true;
|
|
$data->checkPI =$inst->is_dir_writable(PATH_CORE."config/");
|
|
$data->checkDL =$inst->is_dir_writable(PATH_CORE."content/languages/");
|
|
$data->checkDLJ =$inst->is_dir_writable(PATH_CORE."js/labels/");
|
|
$data->checkPL =$inst->is_dir_writable(PATH_CORE."plugins/");
|
|
$data->checkXF =$inst->is_dir_writable(PATH_CORE."xmlform/");
|
|
$data->ao_db_wf =$s['result']['database']['ao']['ao_db_wf'];
|
|
$data->ao_db_rb =$s['result']['database']['ao']['ao_db_rb'];
|
|
$data->ao_db_rp =$s['result']['database']['ao']['ao_db_rp'];
|
|
|
|
$data->ao_admin =$s['result']['admin']['username'];
|
|
$data->ao_admin_pass=($p1!==$p2)?false:true;
|
|
|
|
//*Autoinstall Process and Plugins. By JHL
|
|
// March 11th. 2009
|
|
// To enable the way of aoutoinstall process and/or plugins
|
|
// at same time of initial PM setup
|
|
|
|
//Get Available autoinstall process
|
|
$data->availableProcess = $inst->getDirectoryFiles(PATH_OUTTRUNK."autoinstall","pm");
|
|
|
|
//Get Available autoinstall plugins
|
|
$data->availablePlugins = $inst->getDirectoryFiles(PATH_OUTTRUNK."autoinstall","tar");
|
|
|
|
//End autoinstall
|
|
|
|
$data->microtime =microtime(true);
|
|
echo $oJSON->encode($data);
|
|
}
|
|
else if($action==="install")
|
|
{
|
|
/*
|
|
* Installation with SIMPLE POST
|
|
*
|
|
* Data necessary for the POST:
|
|
*
|
|
*
|
|
* action=install
|
|
* data= {"mysqlE":"Path/to/mysql.exe",
|
|
* "mysqlH":"Mysqlhostname",
|
|
* "mysqlU":"mysqlUsername",
|
|
* "mysqlP":"mysqlPassword",
|
|
* "path_data":"/path/to/workflow_data/",
|
|
* "path_compiled":"/path/to/compiled/",
|
|
* "heartbeatEnabled":"1"}
|
|
*
|
|
*--------------------------------------------------------------------------------------------------------------
|
|
*
|
|
* Steps to install.
|
|
* 1) This data is required:
|
|
* $HOSTNAME
|
|
* $USERNAME
|
|
* $PASSWORD
|
|
* $PATH_TO_WORKFLOW_DATA
|
|
* $PATH_TO_COMPILED DATA
|
|
* 2) create $PATH_TO_WORKFLOW_DATA
|
|
* 3) create $PATH_TO_COMPILED_DATA
|
|
* 4) Create the site workflow
|
|
*
|
|
* 4.1 Create user (mysql) wf_workflow , password: sample
|
|
* 4.1.1 Create database wf_workflow with user wf_workflow
|
|
* 4.1.2 Give all priviledges to database wf_workflow for user wf_workflow
|
|
* 4.1.3 Dump file processmaker/workflow/engine/data/mysql/schema.sql
|
|
* 4.1.4 Dump file processmaker/workflow/engine/data/mysql/insert.sql
|
|
*
|
|
* 4.2 Create user (mysql) wf_rbac, password: sample
|
|
* 4.2.1 Create database wf_rbac with user wf_rbac
|
|
* 4.2.2 Give all priviledges to databse wf_rbac for user wf_rbac
|
|
* 4.2.3 Dump file processmaker/rbac/engine/data/mysql/schema.sql
|
|
* 4.2.4 Dump file processmaker/rbac/engine/data/mysql/insert.sql
|
|
*
|
|
* 4.3 Create configuratoin file and directories to site workflow
|
|
*
|
|
* 4.3.1 Create directories:
|
|
*
|
|
* $PATH_TO_WORKFLOW_DATA./sites/workflow/
|
|
* $PATH_TO_WORKFLOW_DATA./sites/workflow/cutomFunctions/
|
|
* $PATH_TO_WORKFLOW_DATA./sites/workflow/rtfs/
|
|
* $PATH_TO_WORKFLOW_DATA./sites/workflow/xmlforms/
|
|
* $PATH_TO_WORKFLOW_DATA./sites/workflow/processesImages/
|
|
* $PATH_TO_WORKFLOW_DATA./sites/workflow/files/
|
|
* 4.3.2 Create file.
|
|
*
|
|
* $PATH_TO_WORKFLOW_DATA./sites/workflow/db.php
|
|
*
|
|
* with these contents replacing $HOSTNAME.
|
|
*
|
|
<?php
|
|
// Processmaker configuration
|
|
define ('DB_ADAPTER', 'mysql' );
|
|
define ('DB_HOST', $HOSTNAME );
|
|
define ('DB_NAME', 'wf_workflow' );
|
|
define ('DB_USER', 'wf_workflow' );
|
|
define ('DB_PASS', 'sample' );
|
|
define ('DB_RBAC_HOST', $HOSTNAME );
|
|
define ('DB_RBAC_NAME', 'rbac_workflow' );
|
|
define ('DB_RBAC_USER', 'rbac_workflow' );
|
|
define ('DB_RBAC_PASS', 'sample' );
|
|
?>
|
|
|
|
* 4.4 Create file workflow/engine/config/paths_installed.php with these contents.
|
|
*
|
|
* <?php
|
|
define( 'PATH_DATA', '$PATH_TO_WORKFLOW_DATA' );
|
|
define( 'PATH_C', '$PATH_TO_COMPILED_DATA' );
|
|
?>
|
|
|
|
Restarting:
|
|
* $PATH_TO_WORKFLOW_DATA
|
|
* $PATH_TO_COMPILED DATA
|
|
*
|
|
* 4.2 Update translation from this url (background)
|
|
*
|
|
* http://ProcessmakerHostname/sysworkflow/en/green/tools/updateTranslation
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*5) Auto install processes and plugins
|
|
*5.1 Install processes
|
|
*5.2 Install plugins
|
|
* */
|
|
|
|
|
|
$report = NULL;
|
|
|
|
try {
|
|
|
|
require_once 'Log.php';
|
|
|
|
$sp = "/";
|
|
$dir_data = $dataClient->path_data;
|
|
|
|
$dir_data = (substr($dir_data,-1)==$sp)?$dir_data:$dir_data."/";
|
|
$dir_compiled = $dir_data . "compiled/";
|
|
$dir_log = "{$dir_data}log/";
|
|
global $isWindows;
|
|
|
|
@mkdir($dir_data."sites",0777,true);
|
|
@mkdir($dir_compiled,0777,true);
|
|
@mkdir($dir_log, 0777, true);
|
|
|
|
$logFilename = "{$dir_log}install.log";
|
|
$displayLog = Log::singleton('display', '', 'INSTALLER', array('lineFormat' => "%{message}"));
|
|
$fileLog = Log::singleton('file', $logFilename, 'INSTALLER');
|
|
|
|
global $logger;
|
|
$logger = Log::singleton('composite');
|
|
$logger->addChild($displayLog);
|
|
|
|
$create_db ="create-db.sql";
|
|
$schema ="schema.sql";
|
|
|
|
G::LoadClass('Installer');
|
|
|
|
/* Create default workspace called workflow */
|
|
$inst = new Installer();
|
|
$siteName="workflow";
|
|
$p1 = (isset($dataClient->ao_admin_pass1))?$dataClient->ao_admin_pass1:'admin';
|
|
$p2 = (isset($dataClient->ao_admin_pass2))?$dataClient->ao_admin_pass2:'admin';
|
|
|
|
$s = $inst->create_site(Array(
|
|
'name' =>'workflow',
|
|
'path_data'=>$dataClient->path_data,
|
|
'path_compiled'=>$dataClient->path_compiled,
|
|
'admin'=>Array('username'=>(isset($dataClient->ao_admin))?$dataClient->ao_admin:'admin','password'=>$p1),
|
|
'advanced'=>Array(
|
|
'ao_db'=>(isset($dataClient->ao_db) && $dataClient->ao_db===2)?false:true,
|
|
'ao_db_drop'=>(isset($dataClient->ao_db_drop) && $dataClient->ao_db_drop===true)?true:false,
|
|
'ao_db_wf'=>(isset($dataClient->ao_db_wf))?$dataClient->ao_db_wf:'wf_'.$siteName,
|
|
'ao_db_rb'=>(isset($dataClient->ao_db_rb))?$dataClient->ao_db_rb:'rb_'.$siteName,
|
|
'ao_db_rp'=>(isset($dataClient->ao_db_rp))?$dataClient->ao_db_rp:'rp_'.$siteName
|
|
),
|
|
'database'=>Array(
|
|
'hostname'=>$dataClient->mysqlH,
|
|
'username'=>$dataClient->mysqlU,
|
|
'password'=>$dataClient->mysqlP
|
|
)
|
|
),true);
|
|
if ($s['created'])
|
|
$report = $inst->report;
|
|
else
|
|
/* On a failed install, $inst->report is blank because the
|
|
* installation didnt occured at all. So we use the test report
|
|
* instead.
|
|
*/
|
|
$report = $s['result'];
|
|
$installError = (!$s['created']);
|
|
} catch (Exception $e) {
|
|
$installError = ($e->getMessage() ? $e->getMessage() : true);
|
|
}
|
|
|
|
if ($installError)
|
|
header('HTTP', true, 500);
|
|
|
|
/* Status is used in the Windows installer, do not change this */
|
|
print_r("Status: ".(($installError) ? 'FAILED':'SUCCESS')."\n\n");
|
|
|
|
/* Try to open the file log, if it fails, set it to NULL, so we don't try to
|
|
* write to it again afterwards. If it succeeds, add to the logger.
|
|
* Only open the log after writing status, otherwise a warning can be issued
|
|
* which will affect the Windows installer.
|
|
*/
|
|
if (!$fileLog->open()) {
|
|
$fileLog = NULL;
|
|
$displayLog->log("Failed to create file log in $logFilename");
|
|
} else {
|
|
$logger->addChild($fileLog);
|
|
$fileLog->log(" ** Starting installation ** ");
|
|
$fileLog->log("Status: ".(($installError) ? 'FAILED':'SUCCESS'));
|
|
$displayLog->log("This log is also avaliable in $logFilename");
|
|
}
|
|
|
|
$installArgs = (array)$dataClient;
|
|
$hiddenFields = array('mysqlP', 'ao_admin_pass1', 'ao_admin_pass2');
|
|
foreach ($installArgs as $arg => $param)
|
|
if (in_array($arg, $hiddenFields))
|
|
$installArgs[$arg] = "********";
|
|
|
|
$logger->log("Installation arguments\n" . neat_r(array($installArgs)));
|
|
|
|
if (isset($report))
|
|
$logger->log("Installation report\n" . neat_r(array($report)));
|
|
else
|
|
$logger->log("** Installation crashed **");
|
|
|
|
if (is_string($installError))
|
|
$logger->log("Error message: $installError");
|
|
|
|
if ($installError) {
|
|
$logger->log("Installation ending with errors");
|
|
die();
|
|
}
|
|
|
|
$sh=md5(filemtime(PATH_GULLIVER."/class.g.php"));
|
|
$h=G::encrypt($dataClient->mysqlH.$sh.$dataClient->mysqlU.$sh.$dataClient->mysqlP.$sh.$inst->cc_status,$sh);
|
|
$db_text = "<?php\n" .
|
|
"define( 'PATH_DATA', '".$dir_data."' );\n" .
|
|
"define( 'PATH_C', '".$dir_compiled."' );\n" .
|
|
"define( 'HASH_INSTALLATION','".$h."' );\n" .
|
|
"define( 'SYSTEM_HASH','".$sh."' );\n" .
|
|
"?>";
|
|
$fp = fopen(FILE_PATHS_INSTALLED, "w");
|
|
fputs( $fp, $db_text, strlen($db_text));
|
|
fclose( $fp );
|
|
|
|
/* Update languages */
|
|
$update = file_get_contents("http://".$_SERVER['SERVER_NAME'].":".$_SERVER['SERVER_PORT']."/sysworkflow/en/green/tools/updateTranslation");
|
|
$logger->log("Update language => ".((!$update)?$update:"OK"));
|
|
|
|
/* Heartbeat Enable/Disable */
|
|
if(!isset($dataClient->heartbeatEnabled)) $dataClient->heartbeatEnabled=true;
|
|
$update = file_get_contents("http://".$_SERVER['SERVER_NAME'].":".$_SERVER['SERVER_PORT']."/sysworkflow/en/green/install/heartbeatStatus?status=".$dataClient->heartbeatEnabled);
|
|
$logger->log("Heartbeat Status => ".str_replace("<br>","\n",$update));
|
|
|
|
/* Autoinstall Process */
|
|
$update = file_get_contents("http://".$_SERVER['SERVER_NAME'].":".$_SERVER['SERVER_PORT']."/sysworkflow/en/green/install/autoinstallProcesses");
|
|
if (trim(str_replace("<br>","",$update)) == "")
|
|
$update = "Nothing to do.";
|
|
$logger->log("Process AutoInstall => ".str_replace("<br>","\n",$update));
|
|
|
|
/* Autoinstall Plugins */
|
|
$update = file_get_contents("http://".$_SERVER['SERVER_NAME'].":".$_SERVER['SERVER_PORT']."/sysworkflow/en/green/install/autoinstallPlugins");
|
|
if (trim(str_replace("<br>","",$update)) == "")
|
|
$update = "Nothing to do.";
|
|
$logger->log("Plugin AutoInstall => ".str_replace("<br>","\n",$update));
|
|
|
|
$logger->log("Installation finished successfuly");
|
|
}
|
|
|
|
/*
|
|
neat_r works like print_r but with much less visual clutter.
|
|
By Jake Lodwick. Copy freely.
|
|
*/
|
|
function neat_r($arr, $return = false) {
|
|
$out = array();
|
|
$oldtab = " ";
|
|
$newtab = " ";
|
|
|
|
$lines = explode("\n", print_r($arr, true));
|
|
|
|
foreach ($lines as $line) {
|
|
|
|
//remove numeric indexes like "[0] =>" unless the value is an array
|
|
//if (substr($line, -5) != "Array") {
|
|
$line = preg_replace("/^(\s*)\[[0-9]+\] => /", "$1", $line, 1);
|
|
//}
|
|
|
|
//garbage symbols
|
|
foreach (array(
|
|
"Array" => "",
|
|
"[" => "",
|
|
"]" => "",
|
|
//" =>" => ":",
|
|
) as $old => $new) {
|
|
$out = str_replace($old, $new, $out);
|
|
}
|
|
|
|
//garbage lines
|
|
if (in_array(trim($line), array("Array", "(", ")", ""))) continue;
|
|
|
|
//indents
|
|
$indent = "";
|
|
$indents = floor((substr_count($line, $oldtab) - 1) / 2);
|
|
if ($indents > 0) { for ($i = 0; $i < $indents; $i++) { $indent .= $newtab; } }
|
|
|
|
$out[] = $indent . trim($line);
|
|
}
|
|
|
|
$out = implode("\n", $out);
|
|
if ($return == true) return $out;
|
|
|
|
return $out;
|
|
}
|
|
?>
|