2010-12-16 20:36:29 +00:00
< ? php
2018-02-01 13:06:32 +00:00
use Illuminate\Support\Facades\DB ;
2017-08-14 16:13:46 -04:00
use ProcessMaker\Core\System ;
2011-01-27 15:04:37 +00:00
CLI :: taskName ( 'upgrade' );
2015-07-20 12:02:33 -04:00
CLI :: taskDescription ( " Upgrade workspaces. \n \n This command should be run after upgrading ProcessMaker to a new version so that all workspaces are also upgraded to the \n new version. " );
2019-03-18 13:36:08 -04:00
CLI :: taskOpt ( 'child' , " Used by the main upgrade thread " , 'child' , 'child' );
2016-09-21 15:26:01 -04:00
CLI :: taskOpt ( 'buildACV' , 'If this option is enabled, the Cache View is built.' , 'ACV' , 'buildACV' );
CLI :: taskOpt ( 'noxml' , 'If this option is enabled, the XML files translation is not built.' , 'NoXml' , 'no-xml' );
2019-03-18 13:36:08 -04:00
CLI :: taskOpt ( 'nomafe' , 'If this option is enabled, the MAFE files translation is not built.' , 'nomafe' , 'no-mafe' );
2018-06-11 09:58:48 -04:00
/*----------------------------------********---------------------------------*/
2018-06-15 16:24:13 -04:00
CLI :: taskOpt ( 'keep_dyn_content' , " Include the DYN_CONTENT_HISTORY value. Ex: --keep_dyn_content " , 'i' , 'keep_dyn_content' );
2018-06-11 09:58:48 -04:00
/*----------------------------------********---------------------------------*/
2014-03-17 11:54:09 -04:00
CLI :: taskRun ( " run_upgrade " );
2014-12-03 11:03:31 -04:00
/*----------------------------------********---------------------------------*/
2019-03-18 13:36:08 -04:00
2014-09-04 16:28:17 -04:00
CLI :: taskName ( 'unify-database' );
2017-12-04 13:25:35 +00:00
CLI :: taskDescription (
<<< EOT
2015-07-20 12:02:33 -04:00
Unify RBAC , Reports and Workflow database schemas to match the latest version
2014-09-04 16:28:17 -04:00
2015-07-20 12:02:33 -04:00
Specify the workspaces whose databases schemas should be unified .
If no workspace is specified , then the database schema will be upgraded or
repaired on all available workspaces .
2014-09-04 16:28:17 -04:00
2015-07-20 12:02:33 -04:00
This command will read the system schema and attempt to modify the workspaces '
tables to match this new schema . In version 2.8 and later , it will merge the 3
databases used in previous versions of ProcessMaker into one database . This
command may be used after upgrading from ProcessMaker 2.5 to a later version
of ProcessMaker .
2014-09-04 16:28:17 -04:00
EOT
);
2014-12-03 11:03:31 -04:00
/*----------------------------------********---------------------------------*/
2014-09-04 16:28:17 -04:00
CLI :: taskArg ( 'workspace' );
2014-12-03 11:03:31 -04:00
/*----------------------------------********---------------------------------*/
2014-09-04 16:28:17 -04:00
CLI :: taskRun ( " run_unify_database " );
2014-12-03 11:03:31 -04:00
/*----------------------------------********---------------------------------*/
2014-09-04 16:28:17 -04:00
2011-01-27 15:04:37 +00:00
/**
2019-03-18 13:36:08 -04:00
* Execute the upgrade
2011-01-27 15:04:37 +00:00
*
2019-03-18 13:36:08 -04:00
* @ param array $parameters
* @ param array $args
2011-01-27 15:04:37 +00:00
*/
2019-03-18 13:36:08 -04:00
function run_upgrade ( $parameters , $args )
2012-09-26 10:15:20 -04:00
{
2019-03-18 13:36:08 -04:00
// Get values from command and arguments
$workspaces = get_workspaces_from_args ( $parameters );
$mainThread = $printHF = ! array_key_exists ( 'child' , $args );
$updateXmlForms = ! array_key_exists ( 'noxml' , $args );
$updateMafe = ! array_key_exists ( 'nomafe' , $args );
$keepDynContent = false ;
/*----------------------------------********---------------------------------*/
$keepDynContent = array_key_exists ( 'keep_dyn_content' , $args ); //In community version this section will be removed
/*----------------------------------********---------------------------------*/
// Initializing variables
$globalStartTime = microtime ( true );
$numberOfWorkspaces = count ( $workspaces );
$countWorkspace = 1 ;
if ( $printHF ) {
// Set upgrade flag
if ( count ( $workspaces ) === 1 ) {
// For the specific workspace send in the command
G :: isPMUnderUpdating ( 1 , $workspaces [ 0 ] -> name );
} else {
// For all workspaces
G :: isPMUnderUpdating ( 1 );
2012-09-26 10:15:20 -04:00
}
2010-12-16 20:36:29 +00:00
2019-03-18 13:36:08 -04:00
// Print information when start the upgrade process
CLI :: logging ( 'UPGRADE LOG INITIALIZED' , PROCESSMAKER_PATH . 'upgrade.log' );
CLI :: logging ( " UPGRADE STARTED \n " );
2016-07-19 13:41:10 -04:00
}
2019-03-18 13:36:08 -04:00
foreach ( $workspaces as $workspace ) {
if ( $mainThread ) {
CLI :: logging ( " FOLDERS AND FILES OF THE SYSTEM \n " );
// Upgrade actions for global files
CLI :: logging ( " * Start cleaning compiled folder... \n " );
$start = microtime ( true );
if ( defined ( 'PATH_C' )) {
G :: rm_dir ( PATH_C );
G :: mk_dir ( PATH_C , 0777 );
2012-09-26 10:15:20 -04:00
}
2019-03-18 13:36:08 -04:00
CLI :: logging ( " * End cleaning compiled folder...(Completed on " . ( microtime ( true ) - $start ) . " seconds) \n " );
CLI :: logging ( " * Start to remove deprecated files... \n " );
$start = microtime ( true );
$workspace -> removeDeprecatedFiles ();
CLI :: logging ( " * End to remove deprecated files...(Completed on " . ( microtime ( true ) - $start ) . " seconds) \n " );
CLI :: logging ( " * Start checking Enterprise folder/files... \n " );
$start = microtime ( true );
$workspace -> verifyFilesOldEnterprise ();
CLI :: logging ( " * End checking Enterprise folder/files...(Completed on " . ( microtime ( true ) - $start ) . " seconds) \n " );
CLI :: logging ( " * Start checking framework paths... \n " );
$start = microtime ( true );
$workspace -> checkFrameworkPaths ();
CLI :: logging ( " * End checking framework paths...(Completed on " . ( microtime ( true ) - $start ) . " seconds) \n " );
CLI :: logging ( " * Start fixing serialized instance in serverConf.singleton file... \n " );
$start = microtime ( true );
$serverConf = ServerConf :: getSingleton ();
$serverConf -> updateClassNameInFile ();
CLI :: logging ( " * End fixing serialized instance in serverConf.singleton file...(Completed on " .
( microtime ( true ) - $start ) . " seconds) \n " );
CLI :: logging ( " * Start the safe upgrade for javascript files cached by the browser (Maborak, ExtJs)... \n " );
$start = microtime ( true );
G :: browserCacheFilesSetUid ();
CLI :: logging ( " * End the safe upgrade for javascript files cached by the browser (Maborak, ExtJs)...(Completed on " .
( microtime ( true ) - $start ) . " seconds) \n " );
CLI :: logging ( " * Start to backup patch files... \n " );
$arrayPatch = glob ( PATH_TRUNK . 'patch-*' );
if ( $arrayPatch ) {
foreach ( $arrayPatch as $value ) {
if ( file_exists ( $value )) {
// Copy patch content
$names = pathinfo ( $value );
$nameFile = $names [ 'basename' ];
$contentFile = file_get_contents ( $value );
$contentFile = preg_replace ( " [ \n | \r | \n \r ] " , '' , $contentFile );
CLI :: logging ( $contentFile . ' installed (' . $nameFile . ')' , PATH_DATA . 'log/upgrades.log' );
// Move patch file
$newFile = PATH_DATA . $nameFile ;
G :: rm_dir ( $newFile );
copy ( $value , $newFile );
G :: rm_dir ( $value );
}
}
2012-09-26 10:15:20 -04:00
}
2019-03-18 13:36:08 -04:00
CLI :: logging ( " * End to backup patch files...(Completed on " . ( microtime ( true ) - $start ) . " seconds) \n " );
2016-09-21 15:26:01 -04:00
2019-03-18 13:36:08 -04:00
CLI :: logging ( " * Start to backup log files... \n " );
$start = microtime ( true );
$workspace -> backupLogFiles ();
CLI :: logging ( " * End to backup log files... (Completed on " . ( microtime ( true ) - $start ) . " seconds) \n " );
2015-06-05 15:44:28 -04:00
2019-03-18 13:36:08 -04:00
// The previous actions should be executed only the first time
$mainThread = false ;
2015-06-05 15:44:28 -04:00
}
2019-03-18 13:36:08 -04:00
if ( $numberOfWorkspaces === 1 ) {
// Displaying information of the current workspace to upgrade
CLI :: logging ( " UPGRADING DATABASE AND FILES OF WORKSPACE ' { $workspace -> name } ' ( $countWorkspace / $numberOfWorkspaces ) \n " );
// Build parameters
$arrayOptTranslation = [
'updateXml' => $updateXmlForms ,
'updateMafe' => $updateMafe
];
$optionMigrateHistoryData = [
'keepDynContent' => $keepDynContent
];
// Upgrade database and files from a specific workspace
2019-03-20 10:58:58 -04:00
$workspace -> upgrade ( $workspace -> name , SYS_LANG , $arrayOptTranslation , $optionMigrateHistoryData );
2012-09-26 10:15:20 -04:00
$workspace -> close ();
2019-03-18 13:36:08 -04:00
} else {
// Build arguments
$args = '--child' ;
$args .= $updateXmlForms ? '' : ' --no-xml' ;
$args .= $updateMafe ? '' : ' --no-mafe' ;
$args .= $keepDynContent ? ' --keep_dyn_content' : '' ;
// Build and execute command in another thread
$command = PHP_BINARY . ' processmaker upgrade ' . $args . ' ' . $workspace -> name ;
passthru ( $command );
2013-02-20 10:11:03 -04:00
}
2019-03-18 13:36:08 -04:00
// After the first execution is required set this values to false
$updateXmlForms = false ;
$updateMafe = false ;
2013-04-12 16:48:23 -04:00
2019-03-18 13:36:08 -04:00
// Increment workspaces counter
$countWorkspace ++ ;
2013-04-12 16:48:23 -04:00
}
2019-03-18 13:36:08 -04:00
if ( $printHF ) {
// Print information when finish the upgrade process
CLI :: logging ( 'UPGRADE FINISHED (Completed on ' . ( microtime ( true ) - $globalStartTime ) .
' seconds), ProcessMaker ' . System :: getVersion () . ' installed)' . " \n \n " );
2010-12-16 20:36:29 +00:00
2019-03-18 13:36:08 -04:00
// Delete upgrade flag
G :: isPMUnderUpdating ( 0 );
2014-04-01 11:46:06 -04:00
}
2014-04-09 11:26:22 -04:00
}
2019-03-18 13:36:08 -04:00
2014-12-03 11:03:31 -04:00
/*----------------------------------********---------------------------------*/
2014-09-04 16:28:17 -04:00
function run_unify_database ( $args )
2014-10-10 16:41:15 -04:00
{
2014-10-09 10:36:34 -04:00
$workspaces = array ();
2014-10-10 16:41:15 -04:00
2017-12-04 13:25:35 +00:00
if ( count ( $args ) > 2 ) {
2014-10-09 10:36:34 -04:00
$filename = array_pop ( $args );
foreach ( $args as $arg ) {
2017-08-11 14:10:44 -04:00
$workspaces [] = new WorkspaceTools ( $arg );
2014-10-09 10:36:34 -04:00
}
2017-12-04 13:25:35 +00:00
} elseif ( count ( $args ) > 0 ) {
2017-08-11 14:10:44 -04:00
$workspace = new WorkspaceTools ( $args [ 0 ]);
2014-10-09 10:36:34 -04:00
$workspaces [] = $workspace ;
}
2014-09-04 16:28:17 -04:00
CLI :: logging ( " UPGRADE " , PROCESSMAKER_PATH . " upgrade.log " );
CLI :: logging ( " Checking workspaces... \n " );
//setting flag to true to check into sysGeneric.php
$flag = G :: isPMUnderUpdating ( 0 );
2014-10-10 16:41:15 -04:00
2014-09-04 16:28:17 -04:00
//start to unify
$count = count ( $workspaces );
2014-10-10 16:41:15 -04:00
2014-09-04 16:28:17 -04:00
if ( $count > 1 ) {
2017-12-04 13:25:35 +00:00
if ( ! Bootstrap :: isLinuxOs ()) {
2015-04-27 12:16:42 -04:00
CLI :: error ( " This is not a Linux enviroment, please specify workspace. \n " );
2014-09-04 16:28:17 -04:00
return ;
}
}
$first = true ;
$errors = false ;
$countWorkspace = 0 ;
$buildCacheView = array_key_exists ( " buildACV " , $args );
2014-10-10 16:41:15 -04:00
foreach ( $workspaces as $workspace ) {
try {
2014-09-04 16:28:17 -04:00
$countWorkspace ++ ;
2014-10-09 10:36:34 -04:00
if ( ! $workspace -> workspaceExists ()) {
echo " Workspace { $workspace -> name } not found \n " ;
return false ;
}
2014-10-10 16:41:15 -04:00
2014-10-09 10:36:34 -04:00
$ws = $workspace -> name ;
2017-12-04 13:25:35 +00:00
$sContent = file_get_contents ( PATH_DB . $ws . PATH_SEP . 'db.php' );
2014-10-09 10:36:34 -04:00
if ( strpos ( $sContent , 'rb_' )) {
$workspace -> onedb = false ;
} else {
$workspace -> onedb = true ;
}
2014-09-04 16:28:17 -04:00
if ( $workspace -> onedb ) {
2014-10-10 16:41:15 -04:00
CLI :: logging ( " The \" $workspace->name\ " workspace already using one database ... \n " );
2014-09-04 16:28:17 -04:00
} else {
//create destination path
$parentDirectory = PATH_DATA . " upgrade " ;
2017-12-04 13:25:35 +00:00
if ( ! file_exists ( $parentDirectory )) {
mkdir ( $parentDirectory );
2014-09-04 16:28:17 -04:00
}
$tempDirectory = $parentDirectory . basename ( tempnam ( __FILE__ , '' ));
2017-12-04 13:25:35 +00:00
if ( is_writable ( $parentDirectory )) {
mkdir ( $tempDirectory );
2014-09-04 16:28:17 -04:00
} else {
2017-12-04 13:25:35 +00:00
throw new Exception ( " Could not create directory: " . $parentDirectory );
2014-09-04 16:28:17 -04:00
}
$metadata = $workspace -> getMetadata ();
2017-12-04 13:25:35 +00:00
CLI :: logging ( " Exporting rb and rp databases to a temporal location... \n " );
$metadata [ " databases " ] = $workspace -> exportDatabase ( $tempDirectory , true );
2014-09-04 16:28:17 -04:00
$metadata [ " version " ] = 1 ;
2014-10-10 16:41:15 -04:00
2017-12-04 13:25:35 +00:00
list ( $dbHost , $dbUser , $dbPass ) = @ explode ( SYSTEM_HASH , G :: decrypt ( HASH_INSTALLATION , SYSTEM_HASH ));
2018-02-01 13:06:32 +00:00
$connectionName = 'UPGRADE' ;
InstallerModule :: setNewConnection ( $connectionName , $dbHost , $dbUser , $dbPass , '' , '' );
2014-10-10 16:41:15 -04:00
2014-10-09 10:36:34 -04:00
foreach ( $metadata [ 'databases' ] as $db ) {
2014-10-27 18:14:16 -04:00
$dbName = $metadata [ 'DB_NAME' ];
2017-12-04 13:25:35 +00:00
CLI :: logging ( " +> Restoring { $db [ 'name' ] } to $dbName database \n " );
2014-10-09 10:36:34 -04:00
2018-02-01 13:06:32 +00:00
$aParameters = [ 'dbHost' => $dbHost , 'dbUser' => $dbUser , 'dbPass' => $dbPass ];
2014-10-10 16:41:15 -04:00
2018-02-01 13:06:32 +00:00
$restore = $workspace -> executeScript ( $dbName , " $tempDirectory / { $db [ 'name' ] } .sql " , $aParameters , $connectionName );
2014-10-10 16:41:15 -04:00
2014-10-09 10:36:34 -04:00
if ( $restore ) {
2017-12-04 13:25:35 +00:00
CLI :: logging ( " +> Remove { $db [ 'name' ] } database \n " );
2014-09-04 16:28:17 -04:00
2018-02-01 13:06:32 +00:00
DB :: connection ( $connectionName ) -> statement ( " DROP DATABASE IF EXISTS { $db [ 'name' ] } " );
2014-09-04 16:28:17 -04:00
}
}
2018-02-01 13:06:32 +00:00
DB :: disconnect ( $connectionName );
2014-10-10 16:41:15 -04:00
2017-12-04 13:25:35 +00:00
CLI :: logging ( " Removing temporary files \n " );
G :: rm_dir ( $tempDirectory );
2014-10-10 16:41:15 -04:00
2017-12-04 13:25:35 +00:00
$newDBNames = $workspace -> resetDBInfo ( $dbHost , true , true , true );
2014-09-04 16:28:17 -04:00
2017-12-04 13:25:35 +00:00
CLI :: logging ( CLI :: info ( " Done restoring databases " ) . " \n " );
2014-10-10 16:41:15 -04:00
}
} catch ( Exception $e ) {
2014-09-04 16:28:17 -04:00
CLI :: logging ( " Errors upgrading workspace " . CLI :: info ( $workspace -> name ) . " : " . CLI :: error ( $e -> getMessage ()) . " \n " );
$errors = true ;
}
}
$flag = G :: isPMUnderUpdating ( 0 );
2014-12-03 11:03:31 -04:00
}
2017-12-04 13:25:35 +00:00
/*----------------------------------********---------------------------------*/