2010-12-02 23:34:41 +00:00
< ? php
2013-03-14 15:50:49 -04:00
2010-12-02 23:34:41 +00:00
/**
* Utility functions to manage a workspace .
*
2011-11-08 17:37:47 -04:00
* @ author Alexandre Rosenfeld
2010-12-02 23:34:41 +00:00
*/
2013-03-14 15:50:49 -04:00
G :: LoadSystem ( 'dbMaintenance' );
G :: LoadClass ( " cli " );
G :: LoadClass ( " multipleFilesBackup " );
2012-10-18 13:05:23 -04:00
2011-11-08 17:37:47 -04:00
/**
2011-02-01 12:49:40 +00:00
* class workspaceTools
2012-10-18 13:05:23 -04:00
*
2011-02-03 11:13:21 +00:00
* @ package workflow . engine . classes
2011-02-01 12:49:40 +00:00
*/
2012-10-18 13:05:23 -04:00
class workspaceTools
{
2013-03-14 15:50:49 -04:00
public $name = null ;
public $path = null ;
public $db = null ;
public $dbPath = null ;
public $dbInfo = null ;
public $dbInfoRegExp = " /( *define * \ ( *'(?P<key>.*?)' *, * \n * *')(?P<value>.*?)(' * \ ) *;.*)/ " ;
public $initPropel = false ;
public $initPropelRoot = false ;
2012-10-18 13:05:23 -04:00
/**
* Create a workspace tools object .
* Note that workspace might not exist when
* this object is created , however most methods requires that a workspace with
* this name does exists .
*
* @ author Alexandre Rosenfeld < alexandre @ colosa . com >
* @ access public
* @ param string $workspaceName name of the workspace
*/
2013-03-14 15:50:49 -04:00
public function __construct ( $workspaceName )
2012-10-18 13:05:23 -04:00
{
$this -> name = $workspaceName ;
$this -> path = PATH_DB . $this -> name ;
$this -> dbPath = $this -> path . '/db.php' ;
if ( $this -> workspaceExists ()) {
$this -> getDBInfo ();
}
}
/**
* Returns true if the workspace already exists
*
* @ return bool
*/
2013-03-14 15:50:49 -04:00
public function workspaceExists ()
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
return ( file_exists ( $this -> path ) && file_exists ( $this -> dbPath ));
2012-10-18 13:05:23 -04:00
}
2010-12-02 23:34:41 +00:00
2012-09-26 10:15:20 -04:00
/**
* Upgrade this workspace to the latest system version
*
2012-10-18 13:05:23 -04:00
* @ param bool $first true if this is the first workspace to be upgrade
2012-09-26 10:15:20 -04:00
*/
2014-09-04 16:28:17 -04:00
public function upgrade ( $first = false , $buildCacheView = false , $workSpace = SYS_SYS , $onedb = false , $lang = 'en' )
2014-10-03 10:31:50 -04:00
{
2014-09-26 13:00:16 -04:00
$start = microtime ( true );
CLI :: logging ( " > Verify enterprise old... \n " );
2014-10-17 12:30:25 -04:00
$this -> verifyFilesOldEnterprise ( $workSpace );
2014-09-26 13:00:16 -04:00
$stop = microtime ( true );
$final = $stop - $start ;
CLI :: logging ( " <*> Verify took $final seconds. \n " );
2013-03-14 15:50:49 -04:00
$start = microtime ( true );
CLI :: logging ( " > Updating database... \n " );
2014-09-04 16:28:17 -04:00
$this -> upgradeDatabase ( $onedb );
2013-03-14 15:50:49 -04:00
$stop = microtime ( true );
2012-09-26 10:15:20 -04:00
$final = $stop - $start ;
2013-05-20 10:02:16 -04:00
CLI :: logging ( " <*> Database Upgrade Process took $final seconds. \n " );
2012-09-26 10:15:20 -04:00
2013-03-14 15:50:49 -04:00
$start = microtime ( true );
CLI :: logging ( " > Updating translations... \n " );
$this -> upgradeTranslation ( $first );
$stop = microtime ( true );
2012-09-26 10:15:20 -04:00
$final = $stop - $start ;
2013-05-20 10:02:16 -04:00
CLI :: logging ( " <*> Updating Translations Process took $final seconds. \n " );
2012-09-26 10:15:20 -04:00
2013-03-14 15:50:49 -04:00
$start = microtime ( true );
CLI :: logging ( " > Updating Content... \n " );
$this -> upgradeContent ( $workSpace );
$stop = microtime ( true );
2012-09-26 10:15:20 -04:00
$final = $stop - $start ;
2013-05-20 10:02:16 -04:00
CLI :: logging ( " <*> Updating Content Process took $final seconds. \n " );
2012-09-26 10:15:20 -04:00
2014-09-19 12:06:13 -04:00
$start = microtime ( true );
CLI :: logging ( " > check Mafe Requirements... \n " );
$this -> checkMafeRequirements ( $workSpace , $lang );
$stop = microtime ( true );
$final = $stop - $start ;
CLI :: logging ( " <*> Check Mafe Requirements Process took $final seconds. \n " );
2013-03-14 15:50:49 -04:00
$start = microtime ( true );
CLI :: logging ( " > Updating cache view... \n " );
2013-05-17 10:39:48 -04:00
$this -> upgradeCacheView ( $buildCacheView , true , $lang );
2013-03-14 15:50:49 -04:00
$stop = microtime ( true );
2012-09-26 10:15:20 -04:00
$final = $stop - $start ;
2013-05-20 10:02:16 -04:00
CLI :: logging ( " <*> Updating cache view Process took $final seconds. \n " );
2013-11-22 17:05:10 -04:00
$start = microtime ( true );
CLI :: logging ( " > Backup log files... \n " );
$this -> backupLogFiles ();
$stop = microtime ( true );
$final = $stop - $start ;
CLI :: logging ( " <*> Backup log files Process took $final seconds. \n " );
2014-09-19 16:16:24 -04:00
2014-10-03 10:31:50 -04:00
CLI :: logging ( " > Updating Files Manager... \n \n " );
2014-09-19 16:16:24 -04:00
$this -> upgradeFilesManager ( $workSpace );
}
2014-10-03 10:31:50 -04:00
/**
* Function upgradeFilesManager
* access public
*/
public function upgradeFilesManager ( $workSpace ) {
2014-09-19 17:32:39 -04:00
$this -> initPropel ( true );
2014-10-03 10:31:50 -04:00
$con = Propel :: getConnection ( " root " );
$stmt = $con -> createStatement ();
$sDirectory = glob ( PATH_DATA . " sites/ " . $workSpace . " / " . " mailTemplates/* " );
$sDirectoryPublic = glob ( PATH_DATA . " sites/ " . $workSpace . " / " . " public/* " );
$files = array ();
foreach ( $sDirectory as $mailTemplate ) {
if ( is_dir ( $mailTemplate )) {
$inner_files = listFiles ( $mailTemplate );
if ( is_array ( $inner_files )) $files = array_merge ( $files , $inner_files );
}
if ( is_file ( $mailTemplate )) {
array_push ( $files , $mailTemplate );
}
}
foreach ( $sDirectoryPublic as $publicFile ) {
if ( is_dir ( $publicFile )) {
$inner_files = listFiles ( $publicFile );
if ( is_array ( $inner_files )) $files = array_merge ( $files , $inner_files );
}
if ( is_file ( $publicFile )) {
array_push ( $files , $publicFile );
}
}
$sDir = PATH_DATA . " sites/ " . $workSpace . " / " . " mailTemplates/ " ;
$sDirPublic = PATH_DATA . " sites/ " . $workSpace . " / " . " public/ " ;
foreach ( $files as $aFile ) {
if ( strpos ( $aFile , $sDir ) !== false ){
$processUid = current ( explode ( " / " , str_replace ( $sDir , '' , $aFile )));
} else {
$processUid = current ( explode ( " / " , str_replace ( $sDirPublic , '' , $aFile )));
}
$sql = " SELECT PROCESS_FILES.PRF_PATH FROM PROCESS_FILES WHERE PROCESS_FILES.PRF_PATH=' " . $aFile . " ' " ;
$appRows = $stmt -> executeQuery ( $sql , ResultSet :: FETCHMODE_ASSOC );
$fileUid = '' ;
foreach ( $appRows as $row ) {
$fileUid = $row [ " PRF_PATH " ];
}
if ( $fileUid !== $aFile ) {
$sPkProcessFiles = G :: generateUniqueID ();
$sDate = date ( 'Y-m-d H:i:s' );
$sql = " INSERT INTO PROCESS_FILES (PRF_UID, PRO_UID, USR_UID, PRF_UPDATE_USR_UID,
PRF_PATH , PRF_TYPE , PRF_EDITABLE , PRF_CREATE_DATE , PRF_UPDATE_DATE )
VALUES ( '".$sPkProcessFiles."' , '".$processUid."' , '00000000000000000000000000000001' , '' ,
'".$aFile."' , 'file' , 'true' , '".$sDate."' , NULL ) " ;
$stmt -> executeQuery ( $sql , ResultSet :: FETCHMODE_ASSOC );
}
}
2013-06-25 13:50:38 -04:00
}
2013-06-19 10:38:48 -04:00
2013-06-25 13:50:38 -04:00
/**
* Updating cases directories structure
*
*/
public function updateStructureDirectories ( $workSpace = SYS_SYS )
{
2013-04-29 16:48:29 -04:00
$start = microtime ( true );
CLI :: logging ( " > Updating cases directories structure... \n " );
$this -> upgradeCasesDirectoryStructure ( $workSpace );
$stop = microtime ( true );
$final = $stop - $start ;
2013-05-20 10:02:16 -04:00
CLI :: logging ( " <*> Database Upgrade Structure Process took $final seconds. \n " );
2012-09-26 10:15:20 -04:00
}
2010-12-16 20:36:29 +00:00
2012-10-18 13:05:23 -04:00
/**
* Scan the db . php file for database information and return it as an array
*
* @ return array with database information
2010-12-16 20:36:29 +00:00
*/
2013-03-14 15:50:49 -04:00
public function getDBInfo ()
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
if ( ! $this -> workspaceExists ()) {
throw new Exception ( " Could not get db.php in workspace " . $this -> name );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
if ( isset ( $this -> dbInfo )) {
2012-10-18 13:05:23 -04:00
return $this -> dbInfo ;
}
2013-03-14 15:50:49 -04:00
$sDbFile = file_get_contents ( $this -> dbPath );
2012-10-18 13:05:23 -04:00
/* This regular expression will match any " define ('<key>', '<value>'); "
* with any combination of whitespace between words .
* Each match will have these groups :
* (( define ( '(<key>)2' , ')1 (<value>)3 (' );) 4 ) 0
*/
2013-03-14 15:50:49 -04:00
preg_match_all ( $this -> dbInfoRegExp , $sDbFile , $matches , PREG_SET_ORDER );
$values = array ();
2012-10-18 13:05:23 -04:00
foreach ( $matches as $match ) {
$values [ $match [ 'key' ]] = $match [ 'value' ];
}
$this -> dbAdapter = $values [ " DB_ADAPTER " ];
$this -> dbName = $values [ " DB_NAME " ];
$this -> dbHost = $values [ " DB_HOST " ];
$this -> dbUser = $values [ " DB_USER " ];
$this -> dbPass = $values [ " DB_PASS " ];
2014-01-17 14:39:29 -04:00
$this -> dbRbacHost = $values [ " DB_RBAC_HOST " ];
$this -> dbRbacName = $values [ " DB_RBAC_NAME " ];
$this -> dbRbacUser = $values [ " DB_RBAC_USER " ];
2013-11-21 09:10:42 -04:00
$this -> dbRbacPass = $values [ " DB_RBAC_PASS " ];
2012-10-18 13:05:23 -04:00
return $this -> dbInfo = $values ;
2010-12-02 23:34:41 +00:00
}
2012-10-18 13:05:23 -04:00
2013-03-14 15:50:49 -04:00
private function resetDBInfoCallback ( $matches )
2014-10-03 10:31:50 -04:00
{
2012-10-18 13:05:23 -04:00
/* This function changes the values of defines while keeping their formatting
* intact .
* $matches will contain several groups :
* (( define ( '(<key>)2' , ')1 (<value>)3 (' );) 4 ) 0
2011-01-14 23:11:13 +00:00
*/
2013-05-13 09:45:56 -04:00
$key = isset ( $matches [ 'key' ]) ? $matches [ 'key' ] : $matches [ 2 ];
$value = isset ( $matches [ 'value' ]) ? $matches [ 'value' ] : $matches [ 3 ];
2014-10-03 10:31:50 -04:00
2014-10-01 18:01:17 -04:00
if ( $this -> onedb ){
2014-10-09 10:36:34 -04:00
$dbInfo = $this -> getDBInfo ();
$dbPrefix = array ( 'DB_NAME' => 'wf_' , 'DB_USER' => 'wf_' , 'DB_RBAC_NAME' => 'wf_' , 'DB_RBAC_USER' => 'wf_' , 'DB_REPORT_NAME' => 'wf_' , 'DB_REPORT_USER' => 'wf_' );
2014-10-01 18:01:17 -04:00
if ( array_search ( $key , array ( 'DB_PASS' , 'DB_RBAC_PASS' , 'DB_REPORT_PASS' ))) {
2014-10-09 10:36:34 -04:00
$value = $dbInfo [ 'DB_PASS' ];
2014-10-01 18:01:17 -04:00
}
} else {
2014-10-09 10:36:34 -04:00
$dbPrefix = array ( 'DB_NAME' => 'wf_' , 'DB_USER' => 'wf_' , 'DB_RBAC_NAME' => 'rb_' , 'DB_RBAC_USER' => 'rb_' , 'DB_REPORT_NAME' => 'rp_' , 'DB_REPORT_USER' => 'rp_' );
2014-09-04 16:28:17 -04:00
}
2013-03-14 15:50:49 -04:00
if ( array_search ( $key , array ( 'DB_HOST' , 'DB_RBAC_HOST' , 'DB_REPORT_HOST' )) !== false ) {
2012-10-18 13:05:23 -04:00
/* Change the database hostname for these keys */
$value = $this -> newHost ;
2013-03-14 15:50:49 -04:00
} elseif ( array_key_exists ( $key , $dbPrefix )) {
2012-10-18 13:05:23 -04:00
if ( $this -> resetDBNames ) {
/* Change the database name to the new workspace , following the standard
* of prefix ( either wf_ , rp_ , rb_ ) and the workspace name .
*/
2014-10-27 18:14:16 -04:00
if ( $this -> unify ){
$nameDb = explode ( " _ " , $value );
if ( ! isset ( $nameDb [ 1 ])){
$dbName = $value ;
} else {
$dbName = $dbPrefix [ $key ] . $nameDb [ 1 ];
}
} else {
$dbName = $dbPrefix [ $key ] . $this -> name ;
}
2012-10-18 13:05:23 -04:00
} else {
$dbName = $value ;
}
$this -> resetDBDiff [ $value ] = $dbName ;
$value = $dbName ;
}
return $matches [ 1 ] . $value . $matches [ 4 ];
2011-01-14 23:11:13 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* Reset the database information to that of a newly created workspace .
*
* This assumes this workspace already has a db . php file , which will be changed
* to contain the new information .
* This function will reset the database hostname to the system database .
* If reseting database names , it will also use the the prefixes rp_ ,
* rb_ and wf_ , with the workspace name as database names .
*
* @ param string $newHost the new hostname for the database
* @ param bool $resetDBNames if true , also reset all database names
* @ return array contains the new database names as values
2011-01-14 23:11:13 +00:00
*/
2014-10-27 18:14:16 -04:00
public function resetDBInfo ( $newHost , $resetDBNames = true , $onedb = false , $unify = false )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
if ( count ( explode ( " : " , $newHost )) < 2 ) {
2012-10-18 13:05:23 -04:00
$newHost .= ':3306' ;
}
$this -> newHost = $newHost ;
$this -> resetDBNames = $resetDBNames ;
2013-03-14 15:50:49 -04:00
$this -> resetDBDiff = array ();
2014-10-09 10:36:34 -04:00
$this -> onedb = $onedb ;
2014-10-27 18:14:16 -04:00
$this -> unify = $unify ;
2012-10-18 13:05:23 -04:00
2013-03-14 15:50:49 -04:00
if ( ! $this -> workspaceExists ()) {
throw new Exception ( " Could not find db.php in the workspace " );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
$sDbFile = file_get_contents ( $this -> dbPath );
2014-10-03 10:31:50 -04:00
2012-10-18 13:05:23 -04:00
if ( $sDbFile === false ) {
2013-03-14 15:50:49 -04:00
throw new Exception ( " Could not read database information from db.php " );
}
/* Match all defines in the config file . Check updateDBCallback to know what
* keys are changed and what groups are matched .
* This regular expression will match any " define ('<key>', '<value>'); "
* with any combination of whitespace between words .
*/
$sNewDbFile = preg_replace_callback ( " /( *define * \ ( *'(?P<key>.*?)' *, * \n * *')(?P<value>.*?)(' * \ ) *;.*)/ " , array ( & $this , 'resetDBInfoCallback' ), $sDbFile );
if ( file_put_contents ( $this -> dbPath , $sNewDbFile ) === false ) {
throw new Exception ( " Could not write database information to db.php " );
2012-10-18 13:05:23 -04:00
}
$newDBNames = $this -> resetDBDiff ;
2013-03-14 15:50:49 -04:00
unset ( $this -> resetDBDiff );
unset ( $this -> resetDBNames );
2012-10-18 13:05:23 -04:00
//Clear the cached information about db.php
2013-03-14 15:50:49 -04:00
unset ( $this -> dbInfo );
2012-10-18 13:05:23 -04:00
return $newDBNames ;
}
/**
* Get DB information for this workspace , such as hostname , username and password .
*
* @ param string $dbName a db name , such as wf , rp and rb
* @ return array with all the database information .
*/
2013-03-14 15:50:49 -04:00
public function getDBCredentials ( $dbName )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
$prefixes = array ( " wf " => " " , " rp " => " REPORT_ " , " rb " => " RBAC_ " );
2012-10-18 13:05:23 -04:00
$prefix = $prefixes [ $dbName ];
$dbInfo = $this -> getDBInfo ();
2013-03-14 15:50:49 -04:00
return array ( 'adapter' => $dbInfo [ " DB_ADAPTER " ], 'name' => $dbInfo [ " DB_ " . $prefix . " NAME " ], 'host' => $dbInfo [ " DB_ " . $prefix . " HOST " ], 'user' => $dbInfo [ " DB_ " . $prefix . " USER " ], 'pass' => $dbInfo [ " DB_ " . $prefix . " PASS " ], 'dsn' => sprintf ( " %s://%s:%s@%s/%s?encoding=utf8 " , $dbInfo [ 'DB_ADAPTER' ], $dbInfo [ " DB_ " . $prefix . " USER " ], $dbInfo [ " DB_ " . $prefix . " PASS " ], $dbInfo [ " DB_ " . $prefix . " HOST " ], $dbInfo [ " DB_ " . $prefix . " NAME " ]));
2012-10-18 13:05:23 -04:00
}
/**
* Initialize a Propel connection to the database
*
* @ param bool $root wheter to also initialize a root connection
* @ return the Propel connection
*/
2013-03-14 15:50:49 -04:00
public function initPropel ( $root = false )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
if (( $this -> initPropel && ! $root ) || ( $this -> initPropelRoot && $root )) {
2012-10-18 13:05:23 -04:00
return ;
}
2013-03-14 15:50:49 -04:00
$wfDetails = $this -> getDBCredentials ( " wf " );
$rbDetails = $this -> getDBCredentials ( " rb " );
$rpDetails = $this -> getDBCredentials ( " rp " );
2012-10-18 13:05:23 -04:00
2013-03-14 15:50:49 -04:00
$config = array ( 'datasources' => array ( 'workflow' => array ( 'connection' => $wfDetails [ " dsn " ], 'adapter' => $wfDetails [ " adapter " ]
), 'rbac' => array ( 'connection' => $rbDetails [ " dsn " ], 'adapter' => $rbDetails [ " adapter " ]
), 'rp' => array ( 'connection' => $rpDetails [ " dsn " ], 'adapter' => $rpDetails [ " adapter " ]
)
)
2012-10-18 13:05:23 -04:00
);
2010-12-16 20:36:29 +00:00
2012-10-18 13:05:23 -04:00
if ( $root ) {
2013-03-14 15:50:49 -04:00
$dbHash = @ explode ( SYSTEM_HASH , G :: decrypt ( HASH_INSTALLATION , SYSTEM_HASH ));
2010-12-16 20:36:29 +00:00
2012-10-18 13:05:23 -04:00
$dbInfo = $this -> getDBInfo ();
$host = $dbHash [ 0 ];
$user = $dbHash [ 1 ];
$pass = $dbHash [ 2 ];
$dbName = $dbInfo [ " DB_NAME " ];
2010-12-16 20:36:29 +00:00
2013-03-14 15:50:49 -04:00
$rootConfig = array (
'datasources' => array ( 'root' => array ( 'connection' => " mysql:// $user : $pass @ $host / $dbName ?encoding=utf8 " , 'adapter' => " mysql " ))
2012-10-18 13:05:23 -04:00
);
2010-12-16 20:36:29 +00:00
2013-03-14 15:50:49 -04:00
$config [ " datasources " ] = array_merge ( $config [ " datasources " ], $rootConfig [ " datasources " ]);
2010-12-16 20:36:29 +00:00
2012-10-18 13:05:23 -04:00
$this -> initPropelRoot = true ;
}
2010-12-02 23:34:41 +00:00
2012-10-18 13:05:23 -04:00
$this -> initPropel = true ;
2010-12-02 23:34:41 +00:00
2012-10-18 13:05:23 -04:00
require_once ( " propel/Propel.php " );
require_once ( " creole/Creole.php " );
2010-12-16 20:36:29 +00:00
2013-03-14 15:50:49 -04:00
Propel :: initConfiguration ( $config );
2012-10-18 13:05:23 -04:00
}
2010-12-16 20:36:29 +00:00
2012-10-18 13:05:23 -04:00
/**
* Close the propel connection from initPropel
*/
2013-03-14 15:50:49 -04:00
private function closePropel ()
2012-10-18 13:05:23 -04:00
{
Propel :: close ();
$this -> initPropel = false ;
$this -> initPropelRoot = false ;
}
2010-12-16 20:36:29 +00:00
2012-09-26 10:15:20 -04:00
/**
* Upgrade this workspace Content .
*/
2013-03-14 15:50:49 -04:00
public function upgradeContent ( $workSpace = SYS_SYS )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
$this -> initPropel ( true );
2012-12-14 16:42:57 -04:00
//require_once 'classes/model/Translation.php';
2012-10-12 14:57:51 -04:00
$translation = new Translation ();
$information = $translation -> getTranslationEnvironments ();
2013-03-14 15:50:49 -04:00
$arrayLang = array ();
2012-10-12 14:57:51 -04:00
foreach ( $information as $key => $value ) {
2013-03-14 15:50:49 -04:00
$arrayLang [] = trim ( $value [ 'LOCALE' ]);
2012-09-26 10:15:20 -04:00
}
2012-12-14 16:42:57 -04:00
//require_once ('classes/model/Content.php');
2012-09-26 10:15:20 -04:00
$regenerateContent = new Content ();
2013-03-14 15:50:49 -04:00
$regenerateContent -> regenerateContent ( $arrayLang , $workSpace );
2012-09-26 10:15:20 -04:00
}
2012-10-18 13:05:23 -04:00
/**
* Upgrade this workspace translations from all avaliable languages .
*
* @ param bool $first if updating a series of workspace , true if the first
*/
2013-03-14 15:50:49 -04:00
public function upgradeTranslation ( $first = true )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
$this -> initPropel ( true );
2012-12-14 16:42:57 -04:00
//require_once ('classes/model/Language.php');
2013-03-14 15:50:49 -04:00
G :: LoadThirdParty ( 'pear/json' , 'class.json' );
2012-10-18 13:05:23 -04:00
foreach ( System :: listPoFiles () as $poFile ) {
2013-03-14 15:50:49 -04:00
$poName = basename ( $poFile );
$names = explode ( " . " , basename ( $poFile ));
$extension = array_pop ( $names );
$langid = array_pop ( $names );
2013-04-29 13:55:47 -04:00
CLI :: logging ( " Updating database translations with $poName\n " );
2014-04-10 12:30:51 -04:00
Language :: import ( $poFile , false , true , false );
2013-04-24 15:57:01 -04:00
if ( $first ) {
2013-03-14 15:50:49 -04:00
CLI :: logging ( " Updating XML form translations with $poName\n " );
2014-04-10 12:30:51 -04:00
Language :: import ( $poFile , true , false , true );
2012-10-18 13:05:23 -04:00
}
}
2010-12-02 23:34:41 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* Get a connection to this workspace wf database
*
* @ return database connection
*/
2013-11-21 09:10:42 -04:00
private function getDatabase ( $rbac = false )
2014-10-27 11:25:17 -04:00
{
2013-11-28 16:44:08 -04:00
if ( isset ( $this -> db ) && $this -> db -> isConnected () && $rbac == false ) {
2012-10-18 13:05:23 -04:00
return $this -> db ;
}
2013-11-21 09:10:42 -04:00
2013-03-14 15:50:49 -04:00
G :: LoadSystem ( 'database_' . strtolower ( $this -> dbAdapter ));
2013-11-28 16:44:08 -04:00
if ( $rbac == true ){
2013-11-21 09:10:42 -04:00
$this -> db = new database ( $this -> dbAdapter , $this -> dbRbacHost , $this -> dbRbacUser , $this -> dbRbacPass , $this -> dbRbacName );
} else {
$this -> db = new database ( $this -> dbAdapter , $this -> dbHost , $this -> dbUser , $this -> dbPass , $this -> dbName );
}
2013-03-14 15:50:49 -04:00
if ( ! $this -> db -> isConnected ()) {
$this -> db -> logQuery ( 'No available connection to database!' );
throw new Exception ( " Could not connect to database " );
2012-10-18 13:05:23 -04:00
}
return $this -> db ;
2010-12-02 23:34:41 +00:00
}
2014-01-17 14:39:29 -04:00
2012-10-18 13:05:23 -04:00
/**
* Close any database opened with getDatabase
*/
2013-03-14 15:50:49 -04:00
private function closeDatabase ()
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
if ( ! isset ( $this -> db )) {
2012-10-18 13:05:23 -04:00
return ;
}
$this -> db -> close ();
$this -> db = null ;
2010-12-02 23:34:41 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* Close all currently opened databases
*/
2013-03-14 15:50:49 -04:00
public function close ()
2012-10-18 13:05:23 -04:00
{
$this -> closePropel ();
$this -> closeDatabase ();
2010-12-02 23:34:41 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* Get the current workspace database schema
*
* @ return array with the database schema
*/
2013-11-22 13:54:30 -04:00
public function getSchema ( $rbac = false )
2012-10-18 13:05:23 -04:00
{
2013-11-28 16:44:08 -04:00
$oDataBase = $this -> getDatabase ( $rbac );
2010-12-02 23:34:41 +00:00
2013-03-14 15:50:49 -04:00
$aOldSchema = array ();
2010-12-02 23:34:41 +00:00
2012-10-18 13:05:23 -04:00
try {
$oDataBase -> iFetchType = MYSQL_NUM ;
2013-03-14 15:50:49 -04:00
$oDataset1 = $oDataBase -> executeQuery ( $oDataBase -> generateShowTablesSQL ());
2012-10-18 13:05:23 -04:00
} catch ( Exception $e ) {
2013-03-14 15:50:49 -04:00
$oDataBase -> logQuery ( $e -> getmessage ());
2012-10-18 13:05:23 -04:00
return null ;
2010-12-02 23:34:41 +00:00
}
2012-10-18 13:05:23 -04:00
//going thru all tables in current WF_ database
2013-03-14 15:50:49 -04:00
while ( $aRow1 = $oDataBase -> getRegistry ( $oDataset1 )) {
$aPrimaryKeys = array ();
$sTable = strtoupper ( $aRow1 [ 0 ]);
2012-10-18 13:05:23 -04:00
//get description of each table, ( column and primary keys )
//$oDataset2 = $oDataBase->executeQuery( $oDataBase->generateDescTableSQL($aRow1[0]) );
2013-03-14 15:50:49 -04:00
$oDataset2 = $oDataBase -> executeQuery ( $oDataBase -> generateDescTableSQL ( $sTable ));
$aOldSchema [ $sTable ] = array ();
2012-10-18 13:05:23 -04:00
$oDataBase -> iFetchType = MYSQL_ASSOC ;
2013-03-14 15:50:49 -04:00
while ( $aRow2 = $oDataBase -> getRegistry ( $oDataset2 )) {
2012-10-18 13:05:23 -04:00
$aOldSchema [ $sTable ][ $aRow2 [ 'Field' ]][ 'Field' ] = $aRow2 [ 'Field' ];
$aOldSchema [ $sTable ][ $aRow2 [ 'Field' ]][ 'Type' ] = $aRow2 [ 'Type' ];
$aOldSchema [ $sTable ][ $aRow2 [ 'Field' ]][ 'Null' ] = $aRow2 [ 'Null' ];
$aOldSchema [ $sTable ][ $aRow2 [ 'Field' ]][ 'Default' ] = $aRow2 [ 'Default' ];
}
//get indexes of each table SHOW INDEX FROM `ADDITIONAL_TABLES`; -- WHERE Key_name <> 'PRIMARY'
2013-03-14 15:50:49 -04:00
$oDataset2 = $oDataBase -> executeQuery ( $oDataBase -> generateTableIndexSQL ( $aRow1 [ 0 ]));
2012-10-18 13:05:23 -04:00
$oDataBase -> iFetchType = MYSQL_ASSOC ;
2013-03-14 15:50:49 -04:00
while ( $aRow2 = $oDataBase -> getRegistry ( $oDataset2 )) {
if ( ! isset ( $aOldSchema [ $sTable ][ 'INDEXES' ])) {
$aOldSchema [ $sTable ][ 'INDEXES' ] = array ();
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
if ( ! isset ( $aOldSchema [ $sTable ][ 'INDEXES' ][ $aRow2 [ 'Key_name' ]])) {
$aOldSchema [ $sTable ][ 'INDEXES' ][ $aRow2 [ 'Key_name' ]] = array ();
2012-10-18 13:05:23 -04:00
}
$aOldSchema [ $sTable ][ 'INDEXES' ][ $aRow2 [ 'Key_name' ]][] = $aRow2 [ 'Column_name' ];
}
$oDataBase -> iFetchType = MYSQL_NUM ; //this line is neccesary because the next fetch needs to be with MYSQL_NUM
}
//finally return the array with old schema obtained from the Database
2013-03-14 15:50:49 -04:00
if ( count ( $aOldSchema ) == 0 ) {
2012-10-18 13:05:23 -04:00
$aOldSchema = null ;
}
return $aOldSchema ;
2010-12-02 23:34:41 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* Upgrade the AppCacheView table to the latest system version .
*
* This recreates the table and populates with data .
*
* @ param bool $checkOnly only check if the upgrade is needed if true
* @ param string $lang not currently used
*/
2013-05-17 10:39:48 -04:00
public function upgradeCacheView ( $fill = true , $checkOnly = false , $lang = " en " )
2014-10-03 10:31:50 -04:00
{
2013-03-14 15:50:49 -04:00
$this -> initPropel ( true );
2012-10-18 13:05:23 -04:00
2012-12-14 16:42:57 -04:00
//require_once ('classes/model/AppCacheView.php');
2012-10-18 13:05:23 -04:00
//check the language, if no info in config about language, the default is 'en'
2012-12-14 16:42:57 -04:00
G :: LoadClass ( " configuration " );
2012-10-18 13:05:23 -04:00
$oConf = new Configurations ();
2013-03-14 15:50:49 -04:00
$oConf -> loadConfig ( $x , 'APP_CACHE_VIEW_ENGINE' , '' , '' , '' , '' );
2012-10-18 13:05:23 -04:00
$appCacheViewEngine = $oConf -> aConfig ;
//setup the appcacheview object, and the path for the sql files
$appCache = new AppCacheView ();
2013-03-14 15:50:49 -04:00
$appCache -> setPathToAppCacheFiles ( PATH_METHODS . 'setup' . PATH_SEP . 'setupSchemas' . PATH_SEP );
2014-10-03 10:31:50 -04:00
2013-03-14 15:50:49 -04:00
$userGrants = $appCache -> checkGrantsForUser ( false );
2014-10-03 10:31:50 -04:00
2012-10-18 13:05:23 -04:00
$currentUser = $userGrants [ 'user' ];
$currentUserIsSuper = $userGrants [ 'super' ];
//if user does not have the SUPER privilege we need to use the root user and grant the SUPER priv. to normal user.
2014-10-03 10:31:50 -04:00
2013-03-14 15:50:49 -04:00
if ( ! $currentUserIsSuper ) {
$appCache -> checkGrantsForUser ( true );
$appCache -> setSuperForUser ( $currentUser );
2012-10-18 13:05:23 -04:00
$currentUserIsSuper = true ;
}
2014-10-03 10:31:50 -04:00
2014-09-17 10:51:36 -04:00
CLI :: logging ( " -> Creating tables \n " );
2012-10-18 13:05:23 -04:00
//now check if table APPCACHEVIEW exists, and it have correct number of fields, etc.
$res = $appCache -> checkAppCacheView ();
2014-09-17 10:51:36 -04:00
CLI :: logging ( " -> Update DEL_LAST_INDEX field in APP_DELEGATION table \n " );
2013-01-28 16:49:00 -04:00
//Update APP_DELEGATION.DEL_LAST_INDEX data
$res = $appCache -> updateAppDelegationDelLastIndex ( $lang , $checkOnly );
2014-10-03 10:31:50 -04:00
2013-06-19 14:57:00 -04:00
CLI :: logging ( " -> Verifying roles permissions in RBAC \n " );
2013-06-19 10:38:48 -04:00
//Update table RBAC permissions
Bootstrap :: LoadSystem ( 'rbac' );
$RBAC = & RBAC :: getSingleton ();
$RBAC -> initRBAC ();
2013-06-19 14:57:00 -04:00
$result = $RBAC -> verifyPermissions ();
if ( count ( $result ) > 1 ) {
2013-11-11 10:46:22 -04:00
foreach ( $result as $item ) {
2013-06-19 10:38:48 -04:00
CLI :: logging ( " $item ... \n " );
}
} else {
2013-06-19 14:57:00 -04:00
CLI :: logging ( " All roles permissions already updated \n " );
2013-06-19 10:38:48 -04:00
}
2013-03-14 15:50:49 -04:00
CLI :: logging ( " -> Creating triggers \n " );
2012-10-18 13:05:23 -04:00
//now check if we have the triggers installed
2013-03-14 15:50:49 -04:00
$triggers = array ();
$triggers [] = $appCache -> triggerAppDelegationInsert ( $lang , $checkOnly );
$triggers [] = $appCache -> triggerAppDelegationUpdate ( $lang , $checkOnly );
$triggers [] = $appCache -> triggerApplicationUpdate ( $lang , $checkOnly );
$triggers [] = $appCache -> triggerApplicationDelete ( $lang , $checkOnly );
2013-09-25 17:24:04 -04:00
$triggers [] = $appCache -> triggerSubApplicationInsert ( $lang , $checkOnly );
2013-03-14 15:50:49 -04:00
$triggers [] = $appCache -> triggerContentUpdate ( $lang , $checkOnly );
2012-10-18 13:05:23 -04:00
if ( $fill ) {
2013-05-17 10:39:48 -04:00
CLI :: logging ( " -> Rebuild Cache View with language $lang ... \n " );
2012-10-18 13:05:23 -04:00
//build using the method in AppCacheView Class
2013-03-14 15:50:49 -04:00
$res = $appCache -> fillAppCacheView ( $lang );
2012-10-18 13:05:23 -04:00
}
2014-06-03 11:21:25 -04:00
//set status in config table
$confParams = Array ( 'LANG' => $lang , 'STATUS' => 'active' );
2012-10-18 13:05:23 -04:00
$oConf -> aConfig = $confParams ;
2013-03-14 15:50:49 -04:00
$oConf -> saveConfig ( 'APP_CACHE_VIEW_ENGINE' , '' , '' , '' );
2012-10-18 13:05:23 -04:00
// removing casesList configuration records. TODO: removing these lines that resets all the configurations records
$oCriteria = new Criteria ();
2013-03-14 15:50:49 -04:00
$oCriteria -> add ( ConfigurationPeer :: CFG_UID , " casesList " );
$oCriteria -> add ( ConfigurationPeer :: OBJ_UID , array ( " todo " , " draft " , " sent " , " unassigned " , " paused " , " cancelled " ), Criteria :: NOT_IN );
ConfigurationPeer :: doDelete ( $oCriteria );
2012-10-18 13:05:23 -04:00
// end of reset
2014-07-31 17:00:31 -04:00
//close connection
2014-10-27 18:22:22 -04:00
if ( substr ( PHP_OS , 0 , 3 ) != 'WIN' ) {
$connection = Propel :: getConnection ( 'workflow' );
2014-07-31 17:00:31 -04:00
2014-10-27 18:22:22 -04:00
$sql_sleep = " SELECT * FROM information_schema.processlist WHERE command = 'Sleep' and user = SUBSTRING_INDEX(USER(),'@',1) and db = DATABASE() ORDER BY id; " ;
$stmt_sleep = $connection -> createStatement ();
$rs_sleep = $stmt_sleep -> executeQuery ( $sql_sleep , ResultSet :: FETCHMODE_ASSOC );
2014-07-31 17:00:31 -04:00
2014-10-27 18:22:22 -04:00
while ( $rs_sleep -> next ()) {
$row_sleep = $rs_sleep -> getRow ();
$oStatement_sleep = $connection -> prepareStatement ( " kill " . $row_sleep [ 'ID' ] );
$oStatement_sleep -> executeQuery ();
}
2014-07-31 17:00:31 -04:00
2014-10-27 18:22:22 -04:00
$sql_query = " SELECT * FROM information_schema.processlist WHERE user = SUBSTRING_INDEX(USER(),'@',1) and db = DATABASE() ORDER BY id; " ;
$stmt_query = $connection -> createStatement ();
$rs_query = $stmt_query -> executeQuery ( $sql_query , ResultSet :: FETCHMODE_ASSOC );
2014-07-31 17:00:31 -04:00
2014-10-27 18:22:22 -04:00
while ( $rs_query -> next ()) {
$row_query = $rs_query -> getRow ();
$oStatement_query = $connection -> prepareStatement ( " kill " . $row_query [ 'ID' ] );
$oStatement_query -> executeQuery ();
}
2014-07-28 09:50:40 -04:00
}
2010-12-02 23:34:41 +00:00
}
2013-04-29 16:48:29 -04:00
/**
* fix the 32 K issue , by migrating / files directory structure to an uid tree structure based .
* @ param $workspace got the site ( s ) the manager wants to upgrade
*/
public function upgradeCasesDirectoryStructure ( $workspace )
{
define ( 'PATH_DOCUMENT' , PATH_DATA . 'sites/' . $workspace . '/' . 'files/' );
$doclevel = explode ( '/' , PATH_DOCUMENT );
$length = sizeof ( PATH_DOCUMENT );
$filesDir = $doclevel [ $length - 1 ];
if ( is_dir ( PATH_DOCUMENT ) && is_writable ( $filesDir )) {
2013-05-08 10:57:35 -04:00
CLI :: logging ( CLI :: error ( " Error: " . PATH_DOCUMENT . " is not writable... please check the su permissions. \n " ));
2013-04-29 16:48:29 -04:00
return ;
}
$directory = array ();
$blackHoleDir = G :: getBlackHoleDir ();
$directory = glob ( PATH_DOCUMENT . " * " , GLOB_ONLYDIR );
$dirslength = sizeof ( $directory );
if ( ! @ chdir ( PATH_DOCUMENT )) {
2013-05-08 10:57:35 -04:00
CLI :: logging ( CLI :: error ( " Cannot use Document directory. The upgrade must be done as root. \n " ));
2013-04-29 16:48:29 -04:00
return ;
}
//Start migration
for ( $index = 0 ; $index < $dirslength ; $index ++ ) {
$depthdirlevel = explode ( '/' , $directory [ $index ]);
$lastlength = sizeof ( $depthdirlevel );
$UIdDir = $depthdirlevel [ $lastlength - 1 ];
$lenDir = strlen ( $UIdDir );
if ( $lenDir == 32 && $UIdDir != $blackHoleDir ) {
$len = count ( scandir ( $UIdDir ));
if ( $len > 2 ) {
//lenght = 2, because the function check . and .. dir links
$newDiretory = G :: getPathFromUIDPlain ( $UIdDir );
CLI :: logging ( " Migrating $UIdDir to $newDiretory\n " );
2013-07-12 15:57:54 -04:00
G :: mk_dir ( $newDiretory , 0777 );
2013-04-29 16:48:29 -04:00
//echo `cp -R $UIdDir/* $newDiretory/`;
2013-07-12 15:57:54 -04:00
2013-04-29 16:48:29 -04:00
if ( G :: recursive_copy ( $UIdDir , $newDiretory )) {
CLI :: logging ( " Removing $UIdDir ... \n " );
G :: rm_dir ( $UIdDir );
rmdir ( $UIdDir ); //remove the diretory itself, G::rm_dir cannot do it
} else {
2013-05-08 10:57:35 -04:00
CLI :: logging ( CLI :: error ( " Error: Failure at coping from $UIdDir ... \n " ));
2013-06-26 13:15:43 -04:00
}
2013-04-29 16:48:29 -04:00
} else {
CLI :: logging ( " $UIdDir is empty, removing it \n " );
rmdir ( $UIdDir ); //remove the diretory itself
}
}
}
//Start '0' directory migration
$black = PATH_DOCUMENT . $blackHoleDir . '/' ;
if ( is_dir ( $black )) {
$newpattern = array ();
$file = glob ( $black . '*.*' ); //files only
$dirlen = count ( $file );
for ( $index = 0 ; $index < $dirlen ; $index ++ ) {
$levelfile = explode ( '/' , $file [ $index ]);
$lastlevel = sizeof ( $levelfile );
$goalFile = $levelfile [ $lastlevel - 1 ];
$newpattern = G :: getPathFromFileUIDPlain ( $blackHoleDir , $goalFile );
CLI :: logging ( " Migrating $blackHoleDir file: $goalFile\n " );
2013-07-12 15:57:54 -04:00
G :: mk_dir ( $blackHoleDir . PATH_SEP . $newpattern [ 0 ], 0777 );
2013-04-29 16:48:29 -04:00
//echo `cp -R $black$goalFile $black$newpattern[0]/$newpattern[1]`;
2013-07-12 15:57:54 -04:00
2013-04-29 16:48:29 -04:00
if ( copy ( $black . $goalFile , $black . $newpattern [ 0 ] . '/' . $newpattern [ 1 ])) {
unlink ( $file [ $index ]);
} else {
2013-05-08 10:57:35 -04:00
CLI :: logging ( CLI :: error ( " Error: Failure at copy $file[$index] files... \n " ));
2013-06-26 13:15:43 -04:00
}
2013-04-29 16:48:29 -04:00
}
}
//Set value of 2 to the directory structure version.
$this -> initPropel ( true );
G :: LoadClass ( " configuration " );
$conf = new Configurations ();
2013-06-25 13:50:38 -04:00
if ( ! $conf -> exists ( " ENVIRONMENT_SETTINGS " )) {
2013-06-26 09:06:35 -04:00
$conf -> aConfig = array ( " format " => '@userName (@firstName @lastName)' ,
" dateFormat " => 'd/m/Y' ,
" startCaseHideProcessInf " => false ,
" casesListDateFormat " => 'Y-m-d H:i:s' ,
" casesListRowNumber " => 25 ,
" casesListRefreshTime " => 120 );
2013-06-25 13:50:38 -04:00
$conf -> saveConfig ( 'ENVIRONMENT_SETTINGS' , '' );
2013-04-29 16:48:29 -04:00
}
2013-06-25 13:50:38 -04:00
$conf -> setDirectoryStructureVer ( 2 );
CLI :: logging ( CLI :: info ( " Version Directory Structure is 2 now. \n " ));
2013-04-29 16:48:29 -04:00
}
2012-10-18 13:05:23 -04:00
/**
* Upgrade this workspace database to the latest plugins schema
*/
2013-03-14 15:50:49 -04:00
public function upgradePluginsDatabase ()
2012-10-18 13:05:23 -04:00
{
foreach ( System :: getPlugins () as $pluginName ) {
2013-03-14 15:50:49 -04:00
$pluginSchema = System :: getPluginSchema ( $pluginName );
2012-10-18 13:05:23 -04:00
if ( $pluginSchema !== false ) {
2013-03-14 15:50:49 -04:00
CLI :: logging ( " Updating plugin " . CLI :: info ( $pluginName ) . " \n " );
$this -> upgradeSchema ( $pluginSchema );
2012-10-18 13:05:23 -04:00
}
}
2010-12-02 23:34:41 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* Upgrade this workspace database to the latest system schema
*
* @ param bool $checkOnly only check if the upgrade is needed if true
* @ return array bool upgradeSchema for more information
*/
2014-09-04 16:28:17 -04:00
public function upgradeDatabase ( $onedb = false , $checkOnly = false )
2014-10-03 10:31:50 -04:00
{
2013-06-05 10:08:40 -04:00
G :: LoadClass ( " patch " );
$this -> initPropel ( true );
2014-09-09 12:17:14 -04:00
p11835 :: $dbAdapter = $this -> dbAdapter ;
2013-06-05 16:23:39 -04:00
p11835 :: isApplicable ();
2014-09-09 12:17:14 -04:00
$systemSchema = System :: getSystemSchema ( $this -> dbAdapter );
$systemSchemaRbac = System :: getSystemSchemaRbac ( $this -> dbAdapter ); // get the Rbac Schema
2013-06-05 10:08:40 -04:00
$this -> upgradeSchema ( $systemSchema );
2014-09-09 12:17:14 -04:00
$this -> upgradeSchema ( $systemSchemaRbac , false , true , $onedb ); // perform Upgrade to Rbac
2012-10-18 13:05:23 -04:00
$this -> upgradeData ();
2013-06-05 16:23:39 -04:00
p11835 :: execute ();
2012-10-18 13:05:23 -04:00
return true ;
2013-06-26 13:15:43 -04:00
}
2012-10-18 13:05:23 -04:00
2014-09-09 12:34:49 -04:00
private function setFormatRows ()
{
switch ( $this -> dbAdapter ) {
case 'mysql' :
$this -> assoc = MYSQL_ASSOC ;
$this -> num = MYSQL_NUM ;
break ;
case 'sqlsrv' :
$this -> assoc = SQLSRV_FETCH_ASSOC ;
$this -> num = SQLSRV_FETCH_NUMERIC ;
break ;
default :
throw new Exception ( " Unknown adapter hae been set for associate fetch index row format. " );
break ;
}
}
2012-10-18 13:05:23 -04:00
/**
* Upgrade this workspace database from a schema
*
* @ param array $schema the schema information , such as returned from getSystemSchema
* @ param bool $checkOnly only check if the upgrade is needed if true
* @ return array bool the changes if checkOnly is true , else return
* true on success
*/
2014-09-04 16:28:17 -04:00
public function upgradeSchema ( $schema , $checkOnly = false , $rbac = false , $onedb = false )
2012-10-18 13:05:23 -04:00
{
$dbInfo = $this -> getDBInfo ();
2014-10-03 10:31:50 -04:00
2014-09-09 17:31:39 -04:00
if ( $dbInfo [ 'DB_NAME' ] == $dbInfo [ 'DB_RBAC_NAME' ]) {
$onedb = true ;
} else {
$onedb = false ;
}
2012-10-18 13:05:23 -04:00
2013-03-14 15:50:49 -04:00
if ( strcmp ( $dbInfo [ " DB_ADAPTER " ], " mysql " ) != 0 ) {
throw new Exception ( " Only MySQL is supported " );
2012-10-18 13:05:23 -04:00
}
2014-09-09 12:34:49 -04:00
$this -> setFormatRows ();
2013-11-28 16:44:08 -04:00
$workspaceSchema = $this -> getSchema ( $rbac );
2014-09-04 16:28:17 -04:00
$oDataBase = $this -> getDatabase ( $rbac );
if ( ! $onedb ) {
2014-09-09 12:34:49 -04:00
if ( $rbac ){
2014-09-04 16:28:17 -04:00
$rename = System :: verifyRbacSchema ( $workspaceSchema );
if ( count ( $rename ) > 0 ) {
foreach ( $rename as $tableName ) {
$oDataBase -> executeQuery ( $oDataBase -> generateRenameTableSQL ( $tableName ));
}
}
}
}
2013-03-14 15:50:49 -04:00
$changes = System :: compareSchema ( $workspaceSchema , $schema );
2013-11-21 09:10:42 -04:00
2013-03-14 15:50:49 -04:00
$changed = ( count ( $changes [ 'tablesToAdd' ]) > 0 || count ( $changes [ 'tablesToAlter' ]) > 0 || count ( $changes [ 'tablesWithNewIndex' ]) > 0 || count ( $changes [ 'tablesToAlterIndex' ]) > 0 );
2013-11-21 09:10:42 -04:00
2013-03-14 15:50:49 -04:00
if ( $checkOnly || ( ! $changed )) {
2012-10-18 13:05:23 -04:00
if ( $changed ) {
return $changes ;
} else {
2014-09-09 12:17:14 -04:00
CLI :: logging ( " -> Nothing to change in the data base structure of " . (( $rbac == true ) ? " RBAC " : " WORKFLOW " ) . " \n " );
2012-10-18 13:05:23 -04:00
return $changed ;
}
}
2013-11-22 13:54:30 -04:00
2014-09-09 12:34:49 -04:00
$oDataBase -> iFetchType = $this -> num ;
2012-10-18 13:05:23 -04:00
2013-03-14 15:50:49 -04:00
$oDataBase -> logQuery ( count ( $changes ));
2012-10-18 13:05:23 -04:00
2013-03-14 15:50:49 -04:00
if ( ! empty ( $changes [ 'tablesToAdd' ])) {
CLI :: logging ( " -> " . count ( $changes [ 'tablesToAdd' ]) . " tables to add \n " );
2012-10-18 13:05:23 -04:00
}
2014-10-09 10:36:34 -04:00
2012-10-18 13:05:23 -04:00
foreach ( $changes [ 'tablesToAdd' ] as $sTable => $aColumns ) {
2013-03-14 15:50:49 -04:00
$oDataBase -> executeQuery ( $oDataBase -> generateCreateTableSQL ( $sTable , $aColumns ));
if ( isset ( $changes [ 'tablesToAdd' ][ $sTable ][ 'INDEXES' ])) {
2012-10-18 13:05:23 -04:00
foreach ( $changes [ 'tablesToAdd' ][ $sTable ][ 'INDEXES' ] as $indexName => $aIndex ) {
2013-03-14 15:50:49 -04:00
$oDataBase -> executeQuery ( $oDataBase -> generateAddKeysSQL ( $sTable , $indexName , $aIndex ));
2012-10-18 13:05:23 -04:00
}
}
}
2013-03-14 15:50:49 -04:00
if ( ! empty ( $changes [ 'tablesToAlter' ])) {
CLI :: logging ( " -> " . count ( $changes [ 'tablesToAlter' ]) . " tables to alter \n " );
2012-10-18 13:05:23 -04:00
}
2014-10-09 10:36:34 -04:00
2012-10-18 13:05:23 -04:00
foreach ( $changes [ 'tablesToAlter' ] as $sTable => $aActions ) {
foreach ( $aActions as $sAction => $aAction ) {
foreach ( $aAction as $sColumn => $vData ) {
switch ( $sAction ) {
case 'DROP' :
2013-03-14 15:50:49 -04:00
$oDataBase -> executeQuery ( $oDataBase -> generateDropColumnSQL ( $sTable , $vData ));
2012-10-18 13:05:23 -04:00
break ;
case 'ADD' :
2013-03-14 15:50:49 -04:00
$oDataBase -> executeQuery ( $oDataBase -> generateAddColumnSQL ( $sTable , $sColumn , $vData ));
2012-10-18 13:05:23 -04:00
break ;
case 'CHANGE' :
2013-03-14 15:50:49 -04:00
$oDataBase -> executeQuery ( $oDataBase -> generateChangeColumnSQL ( $sTable , $sColumn , $vData ));
2012-10-18 13:05:23 -04:00
break ;
}
}
}
}
2013-03-14 15:50:49 -04:00
if ( ! empty ( $changes [ 'tablesWithNewIndex' ])) {
CLI :: logging ( " -> " . count ( $changes [ 'tablesWithNewIndex' ]) . " indexes to add \n " );
2012-10-18 13:05:23 -04:00
}
foreach ( $changes [ 'tablesWithNewIndex' ] as $sTable => $aIndexes ) {
foreach ( $aIndexes as $sIndexName => $aIndexFields ) {
2013-03-14 15:50:49 -04:00
$oDataBase -> executeQuery ( $oDataBase -> generateAddKeysSQL ( $sTable , $sIndexName , $aIndexFields ));
2012-10-18 13:05:23 -04:00
}
}
2013-03-14 15:50:49 -04:00
if ( ! empty ( $changes [ 'tablesToAlterIndex' ])) {
CLI :: logging ( " -> " . count ( $changes [ 'tablesToAlterIndex' ]) . " indexes to alter \n " );
2012-10-18 13:05:23 -04:00
}
foreach ( $changes [ 'tablesToAlterIndex' ] as $sTable => $aIndexes ) {
foreach ( $aIndexes as $sIndexName => $aIndexFields ) {
2013-03-14 15:50:49 -04:00
$oDataBase -> executeQuery ( $oDataBase -> generateDropKeySQL ( $sTable , $sIndexName ));
$oDataBase -> executeQuery ( $oDataBase -> generateAddKeysSQL ( $sTable , $sIndexName , $aIndexFields ));
2012-10-18 13:05:23 -04:00
}
}
$this -> closeDatabase ();
return true ;
2011-11-08 17:37:47 -04:00
}
2012-10-18 13:05:23 -04:00
2013-03-14 15:50:49 -04:00
public function upgradeData ()
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
if ( file_exists ( PATH_CORE . 'data' . PATH_SEP . 'check.data' )) {
$checkData = unserialize ( file_get_contents ( PATH_CORE . 'data' . PATH_SEP . 'check.data' ));
if ( is_array ( $checkData )) {
2012-10-18 13:05:23 -04:00
foreach ( $checkData as $checkThis ) {
2013-03-14 15:50:49 -04:00
$this -> updateThisRegistry ( $checkThis );
2012-10-18 13:05:23 -04:00
}
}
}
2011-11-08 17:37:47 -04:00
}
2012-10-18 13:05:23 -04:00
2013-03-14 15:50:49 -04:00
public function updateThisRegistry ( $data )
2012-10-18 13:05:23 -04:00
{
$dataBase = $this -> getDatabase ();
$sql = '' ;
switch ( $data [ 'action' ]) {
case 1 :
2013-03-14 15:50:49 -04:00
$sql = $dataBase -> generateInsertSQL ( $data [ 'table' ], $data [ 'data' ]);
2012-10-18 13:05:23 -04:00
$message = " -> Row added in { $data [ 'table' ] } \n " ;
break ;
case 2 :
2013-03-14 15:50:49 -04:00
$sql = $dataBase -> generateUpdateSQL ( $data [ 'table' ], $data [ 'keys' ], $data [ 'data' ]);
2012-10-18 13:05:23 -04:00
$message = " -> Row updated in { $data [ 'table' ] } \n " ;
break ;
case 3 :
2013-03-14 15:50:49 -04:00
$sql = $dataBase -> generateDeleteSQL ( $data [ 'table' ], $data [ 'keys' ], $data [ 'data' ]);
2012-10-18 13:05:23 -04:00
$message = " -> Row deleted in { $data [ 'table' ] } \n " ;
break ;
case 4 :
2013-03-14 15:50:49 -04:00
$sql = $dataBase -> generateSelectSQL ( $data [ 'table' ], $data [ 'keys' ], $data [ 'data' ]);
$dataset = $dataBase -> executeQuery ( $sql );
if ( $dataBase -> getRegistry ( $dataset )) {
$sql = $dataBase -> generateDeleteSQL ( $data [ 'table' ], $data [ 'keys' ], $data [ 'data' ]);
$dataBase -> executeQuery ( $sql );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
$sql = $dataBase -> generateInsertSQL ( $data [ 'table' ], $data [ 'data' ]);
2012-10-18 13:05:23 -04:00
$message = " -> Row updated in { $data [ 'table' ] } \n " ;
break ;
}
if ( $sql != '' ) {
2013-03-14 15:50:49 -04:00
$dataBase -> executeQuery ( $sql );
CLI :: logging ( $message );
2012-10-18 13:05:23 -04:00
}
2010-12-16 20:36:29 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* Get metadata from this workspace
*
* @ param string $path the directory where to create the sql files
* @ return array information about this workspace
*/
2013-03-14 15:50:49 -04:00
public function getMetadata ()
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
$Fields = array_merge ( System :: getSysInfo (), $this -> getDBInfo ());
2012-10-18 13:05:23 -04:00
$Fields [ 'WORKSPACE_NAME' ] = $this -> name ;
2013-03-14 15:50:49 -04:00
if ( isset ( $this -> dbHost )) {
2012-10-18 13:05:23 -04:00
//TODO: This code stopped working with the refactoring
//require_once ("propel/Propel.php");
//G::LoadClass('dbConnections');
//$dbConns = new dbConnections('');
//$availdb = '';
//foreach( $dbConns->getDbServicesAvailables() as $key => $val ) {
//if(!empty($availdb))
// $availdb .= ', ';
// $availdb .= $val['name'];
//}
2013-03-14 15:50:49 -04:00
G :: LoadClass ( 'net' );
$dbNetView = new NET ( $this -> dbHost );
$dbNetView -> loginDbServer ( $this -> dbUser , $this -> dbPass );
2012-10-18 13:05:23 -04:00
try {
2014-10-09 10:36:34 -04:00
if ( ! defined ( 'DB_ADAPTER' )) {
require_once ( $this -> dbPath );
}
2013-03-14 15:50:49 -04:00
$sMySQLVersion = $dbNetView -> getDbServerVersion ( 'mysql' );
2012-10-18 13:05:23 -04:00
} catch ( Exception $oException ) {
$sMySQLVersion = 'Unknown' ;
}
2013-03-14 15:50:49 -04:00
$Fields [ 'DATABASE' ] = $dbNetView -> dbName ( $this -> dbAdapter ) . ' (Version ' . $sMySQLVersion . ')' ;
2012-10-18 13:05:23 -04:00
$Fields [ 'DATABASE_SERVER' ] = $this -> dbHost ;
$Fields [ 'DATABASE_NAME' ] = $this -> dbName ;
$Fields [ 'AVAILABLE_DB' ] = " Not defined " ;
//$Fields['AVAILABLE_DB'] = $availdb;
} else {
$Fields [ 'DATABASE' ] = " Not defined " ;
$Fields [ 'DATABASE_SERVER' ] = " Not defined " ;
$Fields [ 'DATABASE_NAME' ] = " Not defined " ;
$Fields [ 'AVAILABLE_DB' ] = " Not defined " ;
}
return $Fields ;
2010-12-16 20:36:29 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* Print the system information gathered from getSysInfo
*/
2013-03-14 15:50:49 -04:00
public static function printSysInfo ()
2012-10-18 13:05:23 -04:00
{
$fields = System :: getSysInfo ();
2013-03-14 15:50:49 -04:00
$info = array (
'ProcessMaker Version' => $fields [ 'PM_VERSION' ],
'System' => $fields [ 'SYSTEM' ],
'PHP Version' => $fields [ 'PHP' ],
'Server Address' => $fields [ 'SERVER_ADDR' ],
'Client IP Address' => $fields [ 'IP' ],
'Plugins' => ( count ( $fields [ 'PLUGINS_LIST' ]) > 0 ) ? $fields [ 'PLUGINS_LIST' ][ 0 ] : 'None'
2012-10-18 13:05:23 -04:00
);
foreach ( $fields [ 'PLUGINS_LIST' ] as $k => $v ) {
if ( $k == 0 ) {
continue ;
}
$info [] = $v ;
}
foreach ( $info as $k => $v ) {
2013-03-14 15:50:49 -04:00
if ( is_numeric ( $k )) {
2012-10-18 13:05:23 -04:00
$k = " " ;
}
2013-03-14 15:50:49 -04:00
CLI :: logging ( sprintf ( " %20s %s \n " , $k , pakeColor :: colorize ( $v , 'INFO' )));
2012-10-18 13:05:23 -04:00
}
2010-12-16 20:36:29 +00:00
}
2013-03-14 15:50:49 -04:00
public function printInfo ( $fields = null )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
if ( ! $fields ) {
2012-10-18 13:05:23 -04:00
$fields = $this -> getMetadata ();
}
2011-02-25 21:02:27 +00:00
2012-10-18 13:05:23 -04:00
$wfDsn = $fields [ 'DB_ADAPTER' ] . '://' . $fields [ 'DB_USER' ] . ':' . $fields [ 'DB_PASS' ] . '@' . $fields [ 'DB_HOST' ] . '/' . $fields [ 'DB_NAME' ];
2014-10-03 10:31:50 -04:00
2014-10-10 15:09:26 -04:00
if ( $fields [ 'DB_NAME' ] == $fields [ 'DB_RBAC_NAME' ]) {
$info = array ( 'Workspace Name' => $fields [ 'WORKSPACE_NAME' ], 'Workflow Database' => sprintf ( " %s://%s:%s@%s/%s " , $fields [ 'DB_ADAPTER' ], $fields [ 'DB_USER' ], $fields [ 'DB_PASS' ], $fields [ 'DB_HOST' ], $fields [ 'DB_NAME' ]), 'MySql Version' => $fields [ 'DATABASE' ]);
} else {
2013-03-14 15:50:49 -04:00
$info = array ( 'Workspace Name' => $fields [ 'WORKSPACE_NAME' ],
//'Available Databases' => $fields['AVAILABLE_DB'],
'Workflow Database' => sprintf ( " %s://%s:%s@%s/%s " , $fields [ 'DB_ADAPTER' ], $fields [ 'DB_USER' ], $fields [ 'DB_PASS' ], $fields [ 'DB_HOST' ], $fields [ 'DB_NAME' ]), 'RBAC Database' => sprintf ( " %s://%s:%s@%s/%s " , $fields [ 'DB_ADAPTER' ], $fields [ 'DB_RBAC_USER' ], $fields [ 'DB_RBAC_PASS' ], $fields [ 'DB_RBAC_HOST' ], $fields [ 'DB_RBAC_NAME' ]), 'Report Database' => sprintf ( " %s://%s:%s@%s/%s " , $fields [ 'DB_ADAPTER' ], $fields [ 'DB_REPORT_USER' ], $fields [ 'DB_REPORT_PASS' ], $fields [ 'DB_REPORT_HOST' ], $fields [ 'DB_REPORT_NAME' ]), 'MySql Version' => $fields [ 'DATABASE' ]
2012-10-18 13:05:23 -04:00
);
2014-10-10 15:09:26 -04:00
}
2012-10-18 13:05:23 -04:00
foreach ( $info as $k => $v ) {
2013-03-14 15:50:49 -04:00
if ( is_numeric ( $k )) {
2012-10-18 13:05:23 -04:00
$k = " " ;
}
2013-03-14 15:50:49 -04:00
CLI :: logging ( sprintf ( " %20s %s \n " , $k , pakeColor :: colorize ( $v , 'INFO' )));
2012-10-18 13:05:23 -04:00
}
2011-02-17 20:51:26 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* Print workspace information
*
* @ param bool $printSysInfo include sys info as well or not
*/
2013-03-14 15:50:49 -04:00
public function printMetadata ( $printSysInfo = true )
2012-10-18 13:05:23 -04:00
{
if ( $printSysInfo ) {
workspaceTools :: printSysInfo ();
2013-03-14 15:50:49 -04:00
CLI :: logging ( " \n " );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
workspaceTools :: printInfo ( $this -> getMetadata ());
2010-12-16 20:36:29 +00:00
}
2011-03-10 15:18:52 +00:00
2012-10-18 13:05:23 -04:00
/**
* exports this workspace database to the specified path
*
* This function is used mainly for backup purposes .
*
* @ param string $path the directory where to create the sql files
*/
2014-09-04 16:28:17 -04:00
public function exportDatabase ( $path , $onedb = false )
2012-10-18 13:05:23 -04:00
{
$dbInfo = $this -> getDBInfo ();
2014-10-27 11:25:17 -04:00
2014-09-04 16:28:17 -04:00
if ( $onedb ) {
$databases = array ( " rb " , " rp " );
2014-10-10 15:09:26 -04:00
} else if ( $dbInfo [ 'DB_NAME' ] == $dbInfo [ 'DB_RBAC_NAME' ]) {
$databases = array ( " wf " );
2014-09-04 16:28:17 -04:00
} else {
$databases = array ( " wf " , " rp " , " rb " );
}
2013-03-14 15:50:49 -04:00
$dbNames = array ();
2014-10-27 11:25:17 -04:00
foreach ( $databases as $db ) {
2013-03-14 15:50:49 -04:00
$dbInfo = $this -> getDBCredentials ( $db );
$oDbMaintainer = new DataBaseMaintenance ( $dbInfo [ " host " ], $dbInfo [ " user " ], $dbInfo [ " pass " ]);
CLI :: logging ( " Saving database { $dbInfo [ " name " ] } \n " );
$oDbMaintainer -> connect ( $dbInfo [ " name " ]);
2012-10-18 13:05:23 -04:00
$oDbMaintainer -> lockTables ();
2013-03-14 15:50:49 -04:00
$oDbMaintainer -> setTempDir ( $path . " / " );
$oDbMaintainer -> backupDataBase ( $oDbMaintainer -> getTempDir () . $dbInfo [ " name " ] . " .sql " );
2012-10-18 13:05:23 -04:00
$oDbMaintainer -> unlockTables ();
$dbNames [] = $dbInfo ;
}
return $dbNames ;
2010-12-20 15:26:23 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* adds files to the backup archive
2011-01-14 23:11:13 +00:00
*/
2013-03-14 15:50:49 -04:00
private function addToBackup ( $backup , $filename , $pathRoot , $archiveRoot = " " )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
if ( is_file ( $filename )) {
CLI :: logging ( " -> $filename\n " );
$backup -> addModify ( $filename , $archiveRoot , $pathRoot );
2012-10-18 13:05:23 -04:00
} else {
2013-03-14 15:50:49 -04:00
CLI :: logging ( " + $filename\n " );
$backup -> addModify ( $filename , $archiveRoot , $pathRoot );
2012-10-18 13:05:23 -04:00
//foreach (glob($filename . "/*") as $item) {
// $this->addToBackup($backup, $item, $pathRoot, $archiveRoot);
//}
}
2011-02-17 20:51:26 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* Creates a backup archive , which can be used instead of a filename to backup
*
* @ param string $filename the backup filename
* @ param bool $compress wheter to compress or not
*/
2013-03-14 15:50:49 -04:00
static public function createBackup ( $filename , $compress = true )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
G :: LoadThirdParty ( 'pear/Archive' , 'Tar' );
if ( ! file_exists ( dirname ( $filename ))) {
mkdir ( dirname ( $filename ));
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
if ( file_exists ( $filename )) {
unlink ( $filename );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
$backup = new Archive_Tar ( $filename );
2012-10-18 13:05:23 -04:00
return $backup ;
2011-02-17 20:51:26 +00:00
}
2012-10-18 13:05:23 -04:00
/**
* create a backup of this workspace
*
* Exports the database and copies the files to an archive specified , so this
* workspace can later be restored .
*
* @ param string | archive $filename archive filename to use as backup or
* archive object created by createBackup
* @ param bool $compress specifies wheter the backup is compressed or not
2011-01-14 23:11:13 +00:00
*/
2013-03-14 15:50:49 -04:00
public function backup ( $backupFile , $compress = true )
2014-10-27 11:25:17 -04:00
{
2012-10-18 13:05:23 -04:00
/* $filename can be a string , in which case it ' s used as the filename of
* the backup , or it can be a previously created tar , which allows for
* multiple workspaces in one backup .
*/
2013-03-14 15:50:49 -04:00
if ( ! $this -> workspaceExists ()) {
throw new Exception ( " Workspace ' { $this -> name } ' not found " );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
if ( is_string ( $backupFile )) {
$backup = $this -> createBackup ( $backupFile );
2012-10-18 13:05:23 -04:00
$filename = $backupFile ;
} else {
$backup = $backupFile ;
$filename = $backup -> _tarname ;
}
2013-03-14 15:50:49 -04:00
if ( ! file_exists ( PATH_DATA . " upgrade/ " )) {
mkdir ( PATH_DATA . " upgrade/ " );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
$tempDirectory = PATH_DATA . " upgrade/ " . basename ( tempnam ( __FILE__ , '' ));
mkdir ( $tempDirectory );
2012-10-18 13:05:23 -04:00
$metadata = $this -> getMetadata ();
2013-03-14 15:50:49 -04:00
CLI :: logging ( " Backing up database... \n " );
$metadata [ " databases " ] = $this -> exportDatabase ( $tempDirectory );
$metadata [ " directories " ] = array ( " { $this -> name } .files " );
2012-10-18 13:05:23 -04:00
$metadata [ " version " ] = 1 ;
$metaFilename = " $tempDirectory / { $this -> name } .meta " ;
/* Write metadata to file , but make it prettier before . The metadata is just
* a JSON codified array .
*/
2013-03-14 15:50:49 -04:00
if ( ! file_put_contents ( $metaFilename , str_replace ( array ( " , " , " { " , " } "
), array ( " , \n " , " { \n " , " \n } \n "
), G :: json_encode ( $metadata )))) {
throw new Exception ( " Could not create backup metadata " );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
CLI :: logging ( " Copying database to backup... \n " );
$this -> addToBackup ( $backup , $tempDirectory , $tempDirectory );
CLI :: logging ( " Copying files to backup... \n " );
2012-10-18 13:05:23 -04:00
2013-03-14 15:50:49 -04:00
$this -> addToBackup ( $backup , $this -> path , $this -> path , " { $this -> name } .files " );
2012-10-18 13:05:23 -04:00
//Remove leftovers.
2013-03-14 15:50:49 -04:00
G :: rm_dir ( $tempDirectory );
2011-02-17 20:51:26 +00:00
}
2012-10-18 13:05:23 -04:00
//TODO: Move to class.dbMaintenance.php
/**
* create a user in the database
*
* Create a user specified by the parameters and grant all priviledges for
* the database specified , when the user connects from the hostname .
* Drops the user if it already exists .
* This function only supports MySQL .
*
* @ param string $username username
* @ param string $password password
* @ param string $hostname the hostname the user will be connecting from
* @ param string $database the database to grant permissions
*/
2013-03-14 15:50:49 -04:00
private function createDBUser ( $username , $password , $hostname , $database )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
mysql_select_db ( " mysql " );
$hostname = array_shift ( explode ( " : " , $hostname ));
2012-10-18 13:05:23 -04:00
$sqlstmt = " SELECT * FROM user WHERE user = ' $username ' AND host = ' $hostname ' " ;
2013-03-14 15:50:49 -04:00
$result = mysql_query ( $sqlstmt );
2012-10-18 13:05:23 -04:00
if ( $result === false ) {
2013-03-14 15:50:49 -04:00
throw new Exception ( " Unable to retrieve users: " . mysql_error ());
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
$users = mysql_num_rows ( $result );
2012-10-18 13:05:23 -04:00
if ( $users != 0 ) {
2013-03-14 15:50:49 -04:00
$result = mysql_query ( " DROP USER ' $username '@' $hostname ' " );
2012-10-18 13:05:23 -04:00
if ( $result === false ) {
2013-03-14 15:50:49 -04:00
throw new Exception ( " Unable to drop user: " . mysql_error ());
2012-10-18 13:05:23 -04:00
}
}
2013-03-14 15:50:49 -04:00
CLI :: logging ( " Creating user $username for $hostname\n " );
$result = mysql_query ( " CREATE USER ' $username '@' $hostname ' IDENTIFIED BY ' $password ' " );
2012-10-18 13:05:23 -04:00
if ( $result === false ) {
2013-03-14 15:50:49 -04:00
throw new Exception ( " Unable to create user $username : " . mysql_error ());
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
$result = mysql_query ( " GRANT ALL ON $database .* TO ' $username '@' $hostname ' " );
2012-10-18 13:05:23 -04:00
if ( $result === false ) {
2013-03-14 15:50:49 -04:00
throw new Exception ( " Unable to grant priviledges to user $username : " . mysql_error ());
2012-10-18 13:05:23 -04:00
}
2011-01-14 23:11:13 +00:00
}
2012-10-18 13:05:23 -04:00
//TODO: Move to class.dbMaintenance.php
/**
* executes a mysql script
*
* This function supports scripts with -- comments in the beginning of a line
* and multi - line statements .
* It does not support other forms of comments ( such as /*... or {{ ... }}) .
*
* @ param string $filename the script filename
* @ param string $database the database to execute this script into
*/
2013-08-15 13:27:29 -04:00
private function executeSQLScript ( $database , $filename , $parameters )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
mysql_query ( " CREATE DATABASE IF NOT EXISTS " . mysql_real_escape_string ( $database ));
2013-08-21 16:59:33 -04:00
2014-10-31 17:38:55 -04:00
//check function shell_exec
$disabled_functions = ini_get ( 'disable_functions' );
$flag = false ;
if ( $disabled_functions != '' ) {
$arr = explode ( ',' , $disabled_functions );
sort ( $arr );
if ( in_array ( " shell_exec " , $arr )) {
$flag = true ;
}
}
// Check if mysql exist on server
2014-10-03 13:38:16 -04:00
$flagFunction = null ;
2014-10-31 17:38:55 -04:00
if ( ! $flag ) {
2013-08-15 16:05:27 -04:00
$flagFunction = shell_exec ( 'mysql --version' );
}
2013-08-21 16:59:33 -04:00
2014-10-31 17:38:55 -04:00
if ( ! $flag && ! is_null ( $flagFunction ) ) {
2013-08-15 13:27:29 -04:00
$command = 'mysql'
. ' --host=' . $parameters [ 'dbHost' ]
. ' --user=' . $parameters [ 'dbUser' ]
2014-01-30 11:03:21 -04:00
. ' --password=' . str_replace ( '"' , '\"' , str_replace ( " ' " , " \ ' " , quotemeta ( $parameters [ 'dbPass' ]))) //no change! supports the type passwords: .\+*?[^]($)'"\"'
2013-08-15 13:27:29 -04:00
. ' --database=' . mysql_real_escape_string ( $database )
2013-08-21 16:59:33 -04:00
. ' --default_character_set utf8'
2013-08-15 13:27:29 -04:00
. ' --execute="SOURCE ' . $filename . '"' ;
shell_exec ( $command );
} else {
//If the safe mode of the server is actived
try {
mysql_select_db ( $database );
$script = file_get_contents ( $filename );
2013-08-21 16:59:33 -04:00
2013-10-28 13:53:03 -04:00
$lines = explode ( " \n " , $script );
2013-08-15 13:27:29 -04:00
$previous = null ;
2014-10-03 10:31:50 -04:00
$insert = false ;
2013-08-15 13:27:29 -04:00
foreach ( $lines as $j => $line ) {
// Remove comments from the script
$line = trim ( $line );
if ( strpos ( $line , " -- " ) === 0 ) {
$line = substr ( $line , 0 , strpos ( $line , " -- " ));
}
if ( empty ( $line )) {
continue ;
}
// Concatenate the previous line, if any, with the current
if ( $previous ) {
$line = $previous . " " . $line ;
}
$previous = null ;
2013-11-11 10:46:22 -04:00
2013-08-15 13:27:29 -04:00
// If the current line doesnt end with ; then put this line together
// with the next one, thus supporting multi-line statements.
if ( strrpos ( $line , " ; " ) != strlen ( $line ) - 1 ) {
$previous = $line ;
continue ;
}
$line = substr ( $line , 0 , strrpos ( $line , " ; " ));
2013-11-11 10:46:22 -04:00
if ( strrpos ( $line , " INSERT INTO " ) !== false ) {
2014-10-03 10:31:50 -04:00
$insert = true ;
2013-11-11 10:46:22 -04:00
if ( $insert ) {
$result = mysql_query ( " START TRANSACTION " );
$insert = false ;
}
$result = mysql_query ( $line );
continue ;
} else {
if ( ! $insert ) {
$result = mysql_query ( " COMMIT " );
$insert = true ;
}
}
2013-08-15 13:27:29 -04:00
$result = mysql_query ( $line );
if ( $result === false ) {
throw new Exception ( " Error when running script ' $filename ', line $j , query ' $line ': " . mysql_error ());
}
}
2013-11-11 10:46:22 -04:00
if ( ! $insert ) {
$result = mysql_query ( " COMMIT " );
}
2013-08-15 13:27:29 -04:00
} catch ( Exception $e ) {
CLI :: logging ( CLI :: error ( " Error: " . " There are problems running script ' $filename ': " . $e ));
2012-10-18 13:05:23 -04:00
}
}
2011-01-14 23:11:13 +00:00
}
2012-10-18 13:05:23 -04:00
2014-10-09 10:36:34 -04:00
public function executeScript ( $database , $filename , $parameters )
{
$this -> executeSQLScript ( $database , $filename , $parameters );
return true ;
}
2013-03-14 15:50:49 -04:00
static public function restoreLegacy ( $directory )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
throw new Exception ( " Use gulliver to restore backups from old versions " );
2011-02-17 20:51:26 +00:00
}
2011-11-08 17:37:47 -04:00
2013-03-14 15:50:49 -04:00
static public function getBackupInfo ( $filename )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
G :: LoadThirdParty ( 'pear/Archive' , 'Tar' );
$backup = new Archive_Tar ( $filename );
2012-10-18 13:05:23 -04:00
//Get a temporary directory in the upgrade directory
2013-03-14 15:50:49 -04:00
$tempDirectory = PATH_DATA . " upgrade/ " . basename ( tempnam ( __FILE__ , '' ));
mkdir ( $tempDirectory );
$metafiles = array ();
2012-10-18 13:05:23 -04:00
foreach ( $backup -> listContent () as $backupFile ) {
$filename = $backupFile [ " filename " ];
2013-03-14 15:50:49 -04:00
if ( strpos ( $filename , " / " ) === false && substr_compare ( $filename , " .meta " , - 5 , 5 , true ) === 0 ) {
if ( ! $backup -> extractList ( array ( $filename ), $tempDirectory )) {
throw new Exception ( " Could not extract backup " );
2012-10-18 13:05:23 -04:00
}
$metafiles [] = " $tempDirectory / $filename " ;
}
}
2011-02-17 20:51:26 +00:00
2013-03-14 15:50:49 -04:00
CLI :: logging ( " Found " . count ( $metafiles ) . " workspace(s) in backup \n " );
2011-02-17 20:51:26 +00:00
2012-10-18 13:05:23 -04:00
foreach ( $metafiles as $metafile ) {
2013-03-14 15:50:49 -04:00
$data = file_get_contents ( $metafile );
$workspaceData = G :: json_decode ( $data );
CLI :: logging ( " \n " );
workspaceTools :: printInfo (( array ) $workspaceData );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
G :: rm_dir ( $tempDirectory );
2011-01-14 23:11:13 +00:00
}
2011-02-17 20:51:26 +00:00
2013-03-14 15:50:49 -04:00
static public function dirPerms ( $filename , $owner , $group , $perms )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
$chown = @ chown ( $filename , $owner );
$chgrp = @ chgrp ( $filename , $group );
$chmod = @ chmod ( $filename , $perms );
2012-10-18 13:05:23 -04:00
if ( $chgrp === false || $chmod === false || $chown === false ) {
2013-10-22 12:34:08 -04:00
if ( strtoupper ( substr ( PHP_OS , 0 , 3 ) ) === 'WIN' ) {
2014-10-03 13:38:16 -04:00
exec ( 'icacls ' . $filename . ' /grant Administrador:(D,WDAC) /T' , $res );
2013-10-22 12:34:08 -04:00
} else {
CLI :: logging ( CLI :: error ( " Failed to set permissions for $filename " ) . " \n " );
}
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
if ( is_dir ( $filename )) {
foreach ( array_merge ( glob ( $filename . " /* " ), glob ( $filename . " /.* " )) as $item ) {
if ( basename ( $item ) == " . " || basename ( $item ) == " .. " ) {
2012-10-18 13:05:23 -04:00
continue ;
}
2013-03-14 15:50:49 -04:00
workspaceTools :: dirPerms ( $item , $owner , $group , $perms );
2012-10-18 13:05:23 -04:00
}
}
2011-01-14 23:11:13 +00:00
}
2011-03-10 17:14:07 +00:00
2012-10-18 13:05:23 -04:00
/**
* restore an archive into a workspace
*
* Restores any database and files included in the backup , either as a new
* workspace , or overwriting a previous one
*
* @ param string $filename the backup filename
* @ param string $newWorkspaceName if defined , supplies the name for the
* workspace to restore to
*/
2013-05-17 10:39:48 -04:00
static public function restore ( $filename , $srcWorkspace , $dstWorkspace = null , $overwrite = true , $lang = 'en' )
2012-10-18 13:05:23 -04:00
{
2013-03-14 15:50:49 -04:00
G :: LoadThirdParty ( 'pear/Archive' , 'Tar' );
$backup = new Archive_Tar ( $filename );
2012-10-18 13:05:23 -04:00
//Get a temporary directory in the upgrade directory
2013-03-14 15:50:49 -04:00
$tempDirectory = PATH_DATA . " upgrade/ " . basename ( tempnam ( __FILE__ , '' ));
2012-10-18 13:05:23 -04:00
$parentDirectory = PATH_DATA . " upgrade " ;
2013-03-14 15:50:49 -04:00
if ( is_writable ( $parentDirectory )) {
mkdir ( $tempDirectory );
2012-10-18 13:05:23 -04:00
} else {
2013-03-14 15:50:49 -04:00
throw new Exception ( " Could not create directory: " . $parentDirectory );
2012-10-18 13:05:23 -04:00
}
//Extract all backup files, including database scripts and workspace files
2013-03-14 15:50:49 -04:00
if ( ! $backup -> extract ( $tempDirectory )) {
throw new Exception ( " Could not extract backup " );
2012-10-18 13:05:23 -04:00
}
//Search for metafiles in the new standard (the old standard would contain
//txt files).
2013-03-14 15:50:49 -04:00
$metaFiles = glob ( $tempDirectory . " /*.meta " );
if ( empty ( $metaFiles )) {
$metaFiles = glob ( $tempDirectory . " /*.txt " );
if ( ! empty ( $metaFiles )) {
return workspaceTools :: restoreLegacy ( $tempDirectory );
2012-10-18 13:05:23 -04:00
} else {
2013-03-14 15:50:49 -04:00
throw new Exception ( " No metadata found in backup " );
2012-10-18 13:05:23 -04:00
}
} else {
2013-03-14 15:50:49 -04:00
CLI :: logging ( " Found " . count ( $metaFiles ) . " workspaces in backup: \n " );
2012-10-18 13:05:23 -04:00
foreach ( $metaFiles as $metafile ) {
2013-03-14 15:50:49 -04:00
CLI :: logging ( " -> " . basename ( $metafile ) . " \n " );
2012-10-18 13:05:23 -04:00
}
}
2013-03-14 15:50:49 -04:00
if ( count ( $metaFiles ) > 1 && ( ! isset ( $srcWorkspace ))) {
throw new Exception ( " Multiple workspaces in backup but no workspace specified to restore " );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
if ( isset ( $srcWorkspace ) && ! in_array ( " $srcWorkspace .meta " , array_map ( BASENAME , $metaFiles ))) {
throw new Exception ( " Workspace $srcWorkspace not found in backup " );
2012-10-18 13:05:23 -04:00
}
2013-06-26 13:15:43 -04:00
2013-05-17 10:39:48 -04:00
$version = System :: getVersion ();
$version = explode ( '-' , $version );
$versionPresent = ( isset ( $version [ 0 ])) ? $version [ 0 ] : '' ;
CLI :: logging ( CLI :: warning ( "
2013-06-26 13:15:43 -04:00
Note .- If you try to execute a restore from a generated backup on a recent version of Processmaker
2013-05-17 10:39:48 -04:00
than version you are using currently to restore it , it may be occur errors on the restore process ,
it shouldn ' t be restaured generated backups on later versions than version when the restore is executed " ) . " \n " );
2012-10-18 13:05:23 -04:00
foreach ( $metaFiles as $metaFile ) {
2013-03-14 15:50:49 -04:00
$metadata = G :: json_decode ( file_get_contents ( $metaFile ));
2012-10-18 13:05:23 -04:00
if ( $metadata -> version != 1 ) {
2013-03-14 15:50:49 -04:00
throw new Exception ( " Backup version { $metadata -> version } not supported " );
2012-10-18 13:05:23 -04:00
}
$backupWorkspace = $metadata -> WORKSPACE_NAME ;
2014-10-27 11:25:17 -04:00
2014-10-09 10:36:34 -04:00
if ( strpos ( $metadata -> DB_RBAC_NAME , 'rb_' ) === false ) {
$onedb = true ;
2014-10-30 17:32:31 -04:00
$oldDatabases = 1 ;
2014-10-09 10:36:34 -04:00
} else {
$onedb = false ;
2014-10-30 17:32:31 -04:00
$oldDatabases = 3 ;
2014-10-09 10:36:34 -04:00
}
2014-10-27 11:25:17 -04:00
2013-03-14 15:50:49 -04:00
if ( isset ( $dstWorkspace )) {
2012-10-18 13:05:23 -04:00
$workspaceName = $dstWorkspace ;
$createWorkspace = true ;
} else {
$workspaceName = $metadata -> WORKSPACE_NAME ;
$createWorkspace = false ;
}
2013-03-14 15:50:49 -04:00
if ( isset ( $srcWorkspace ) && strcmp ( $metadata -> WORKSPACE_NAME , $srcWorkspace ) != 0 ) {
CLI :: logging ( CLI :: warning ( " > Workspace $backupWorkspace found, but not restoring. " ) . " \n " );
2012-10-18 13:05:23 -04:00
continue ;
} else {
2013-03-14 15:50:49 -04:00
CLI :: logging ( " > Restoring " . CLI :: info ( $backupWorkspace ) . " to " . CLI :: info ( $workspaceName ) . " \n " );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
$workspace = new workspaceTools ( $workspaceName );
2014-10-27 11:25:17 -04:00
2012-10-18 13:05:23 -04:00
if ( $workspace -> workspaceExists ()) {
2014-10-03 10:31:50 -04:00
2012-10-18 13:05:23 -04:00
if ( $overwrite ) {
2014-11-10 09:01:51 -04:00
if ( $workspace -> dbInfo [ 'DB_NAME' ] == $workspace -> dbInfo [ 'DB_RBAC_NAME' ]) {
2014-10-30 17:32:31 -04:00
$newDatabases = 1 ;
} else {
$newDatabases = 3 ;
}
if ( $newDatabases != $oldDatabases ) {
throw new Exception ( " We can't overwrite this workspace because it has a different amount of databases. Not only the 'source' but also the 'target' must have the same amount of databases. " );
}
2013-03-14 15:50:49 -04:00
CLI :: logging ( CLI :: warning ( " > Workspace $workspaceName already exist, overwriting! " ) . " \n " );
2012-10-18 13:05:23 -04:00
} else {
2013-03-14 15:50:49 -04:00
throw new Exception ( " Destination workspace already exist (use -o to overwrite) " );
2012-10-18 13:05:23 -04:00
}
}
2013-03-14 15:50:49 -04:00
if ( file_exists ( $workspace -> path )) {
G :: rm_dir ( $workspace -> path );
2012-10-18 13:05:23 -04:00
}
foreach ( $metadata -> directories as $dir ) {
2013-03-14 15:50:49 -04:00
CLI :: logging ( " +> Restoring directory ' $dir ' \n " );
2012-10-18 13:05:23 -04:00
2013-11-11 10:46:22 -04:00
if ( file_exists ( " $tempDirectory / $dir " . " /ee " )) {
2013-05-13 09:45:56 -04:00
G :: rm_dir ( " $tempDirectory / $dir " . " /ee " );
}
2013-11-11 10:46:22 -04:00
if ( file_exists ( " $tempDirectory / $dir " . " /plugin.singleton " )) {
2013-05-13 09:45:56 -04:00
G :: rm_dir ( " $tempDirectory / $dir " . " /plugin.singleton " );
2013-04-30 16:28:12 -04:00
}
2013-03-14 15:50:49 -04:00
if ( ! rename ( " $tempDirectory / $dir " , $workspace -> path )) {
throw new Exception ( " There was an error copying the backup files ( $tempDirectory / $dir ) to the workspace directory { $workspace -> path } . " );
2012-10-18 13:05:23 -04:00
}
}
2013-03-14 15:50:49 -04:00
CLI :: logging ( " > Changing file permissions \n " );
$shared_stat = stat ( PATH_DATA );
2012-10-18 13:05:23 -04:00
if ( $shared_stat !== false ) {
2013-03-14 15:50:49 -04:00
workspaceTools :: dirPerms ( $workspace -> path , $shared_stat [ 'uid' ], $shared_stat [ 'gid' ], $shared_stat [ 'mode' ]);
2012-10-18 13:05:23 -04:00
} else {
2013-03-14 15:50:49 -04:00
CLI :: logging ( CLI :: error ( " Could not get the shared folder permissions, not changing workspace permissions " ) . " \n " );
2012-10-18 13:05:23 -04:00
}
2013-03-14 15:50:49 -04:00
list ( $dbHost , $dbUser , $dbPass ) = @ explode ( SYSTEM_HASH , G :: decrypt ( HASH_INSTALLATION , SYSTEM_HASH ));
2013-08-15 13:27:29 -04:00
$aParameters = array ( 'dbHost' => $dbHost , 'dbUser' => $dbUser , 'dbPass' => $dbPass );
2013-03-14 15:50:49 -04:00
CLI :: logging ( " > Connecting to system database in ' $dbHost ' \n " );
$link = mysql_connect ( $dbHost , $dbUser , $dbPass );
@ mysql_query ( " SET NAMES 'utf8'; " );
@ mysql_query ( " SET FOREIGN_KEY_CHECKS=0; " );
if ( ! $link ) {
throw new Exception ( 'Could not connect to system database: ' . mysql_error ());
2012-10-18 13:05:23 -04:00
}
2014-10-03 10:31:50 -04:00
2014-10-09 10:36:34 -04:00
$dbName = '' ;
$newDBNames = $workspace -> resetDBInfo ( $dbHost , $createWorkspace , $onedb );
2012-10-18 13:05:23 -04:00
foreach ( $metadata -> databases as $db ) {
2014-10-27 11:25:17 -04:00
if ( $dbName != $newDBNames [ $db -> name ]) {
2014-10-09 10:36:34 -04:00
$dbName = $newDBNames [ $db -> name ];
2014-11-19 16:47:22 -04:00
2014-11-05 12:02:02 -04:00
if ( mysql_select_db ( $dbName , $link )) {
2014-11-05 09:34:49 -04:00
if ( ! $overwrite ) {
throw new Exception ( " Destination Database already exist (use -o to overwrite) " );
}
}
2014-10-09 10:36:34 -04:00
CLI :: logging ( " +> Restoring database { $db -> name } to $dbName\n " );
$workspace -> executeSQLScript ( $dbName , " $tempDirectory / { $db -> name } .sql " , $aParameters );
$workspace -> createDBUser ( $dbName , $db -> pass , " localhost " , $dbName );
$workspace -> createDBUser ( $dbName , $db -> pass , " % " , $dbName );
}
2012-10-18 13:05:23 -04:00
}
2013-05-17 10:39:48 -04:00
$version = explode ( '-' , $metadata -> PM_VERSION );
$versionOld = ( isset ( $version [ 0 ])) ? $version [ 0 ] : '' ;
CLI :: logging ( CLI :: info ( " $versionOld < $versionPresent " ) . " \n " );
2014-10-08 10:07:39 -04:00
$start = microtime ( true );
2014-10-17 12:30:25 -04:00
CLI :: logging ( " > Verify files enterprise old... \n " );
$workspace -> verifyFilesOldEnterprise ( $workspaceName );
2014-10-08 10:07:39 -04:00
$stop = microtime ( true );
$final = $stop - $start ;
CLI :: logging ( " <*> Verify took $final seconds. \n " );
2014-10-01 18:01:17 -04:00
if ( $versionOld < $versionPresent || strpos ( $versionPresent , " Branch " )) {
2013-05-17 10:39:48 -04:00
$start = microtime ( true );
CLI :: logging ( " > Updating database... \n " );
2014-10-09 10:36:34 -04:00
$workspace -> upgradeDatabase ( $onedb );
2013-05-17 10:39:48 -04:00
$stop = microtime ( true );
$final = $stop - $start ;
2013-05-20 10:02:16 -04:00
CLI :: logging ( " <*> Database Upgrade Process took $final seconds. \n " );
2013-05-17 10:39:48 -04:00
}
2014-10-17 12:30:25 -04:00
$start = microtime ( true );
CLI :: logging ( " > Verify License Enterprise... \n " );
$workspace -> verifyLicenseEnterprise ( $workspaceName );
$stop = microtime ( true );
$final = $stop - $start ;
CLI :: logging ( " <*> Verify took $final seconds. \n " );
2013-05-17 10:39:48 -04:00
$start = microtime ( true );
CLI :: logging ( " > Updating cache view... \n " );
$workspace -> upgradeCacheView ( true , false , $lang );
$stop = microtime ( true );
$final = $stop - $start ;
2013-05-20 10:02:16 -04:00
CLI :: logging ( " <*> Updating cache view Process took $final seconds. \n " );
2013-06-26 13:15:43 -04:00
2013-03-14 15:50:49 -04:00
mysql_close ( $link );
2012-10-18 13:05:23 -04:00
}
2011-03-10 17:14:07 +00:00
2013-03-14 15:50:49 -04:00
CLI :: logging ( " Removing temporary files \n " );
2010-12-20 15:26:23 +00:00
2013-03-14 15:50:49 -04:00
G :: rm_dir ( $tempDirectory );
2012-10-18 13:05:23 -04:00
2013-03-14 15:50:49 -04:00
CLI :: logging ( CLI :: info ( " Done restoring " ) . " \n " );
2012-10-18 13:05:23 -04:00
}
2013-06-26 13:15:43 -04:00
2013-06-26 14:54:37 -04:00
public static function hotfixInstall ( $file )
2013-06-26 13:15:43 -04:00
{
$result = array ();
2013-06-26 14:54:37 -04:00
$dirHotfix = PATH_DATA . " hotfixes " ;
2013-06-26 13:15:43 -04:00
$arrayPathInfo = pathinfo ( $file );
2013-06-26 14:54:37 -04:00
$f = ( $arrayPathInfo [ " dirname " ] == " . " ) ? $dirHotfix . PATH_SEP . $file : $file ;
2013-06-26 13:15:43 -04:00
$swv = 1 ;
$msgv = " " ;
2013-06-26 14:54:37 -04:00
if ( ! file_exists ( $dirHotfix )) {
G :: mk_dir ( $dirHotfix , 0777 );
2013-06-26 13:15:43 -04:00
}
if ( ! file_exists ( $f )) {
$swv = 0 ;
$msgv = $msgv . (( $msgv != " " ) ? " \n " : null ) . " - The file \" $f\ " does not exist " ;
}
if ( $arrayPathInfo [ " extension " ] != " tar " ) {
$swv = 0 ;
2013-06-26 15:24:18 -04:00
$msgv = $msgv . (( $msgv != " " ) ? " \n " : null ) . " - The file extension \" $file\ " is not \ " tar \" " ;
2013-06-26 13:15:43 -04:00
}
if ( $swv == 1 ) {
G :: LoadThirdParty ( " pear/Archive " , " Tar " );
//Extract
$tar = new Archive_Tar ( $f );
2013-11-06 17:06:53 -04:00
$swTar = $tar -> extractModify ( PATH_TRUNK , " processmaker " ); //true on success, false on error
2013-06-26 13:15:43 -04:00
if ( $swTar ) {
$result [ " status " ] = 1 ;
2013-06-26 15:24:18 -04:00
$result [ " message " ] = " - Hotfix installed successfully \" $f\ " " ;
2013-06-26 13:15:43 -04:00
} else {
$result [ " status " ] = 0 ;
$result [ " message " ] = " - Could not extract file \" $f\ " " ;
}
} else {
$result [ " status " ] = 0 ;
$result [ " message " ] = $msgv ;
}
return $result ;
}
2014-01-17 14:39:29 -04:00
2013-11-22 17:05:10 -04:00
public function backupLogFiles ()
{
2013-11-25 17:58:52 -04:00
$config = System :: getSystemConfiguration ();
2014-01-17 14:39:29 -04:00
2013-11-22 17:05:10 -04:00
clearstatcache ();
$path = PATH_DATA . " log " . PATH_SEP ;
$filePath = $path . " cron.log " ;
if ( file_exists ( $filePath )) {
$size = filesize ( $filePath );
2013-11-25 17:58:52 -04:00
/* $config['size_log_file'] has the value 5000000 -> approximately 5 megabytes */
if ( $size > $config [ 'size_log_file' ]) {
2013-11-22 17:05:10 -04:00
rename ( $filePath , $filePath . " .bak " );
}
}
}
2014-05-13 17:15:44 -04:00
public function checkMafeRequirements ( $workspace , $lang ) {
2014-10-03 10:31:50 -04:00
$this -> initPropel ( true );
2014-05-13 17:15:44 -04:00
$pmRestClient = OauthClientsPeer :: retrieveByPK ( 'x-pm-local-client' );
if ( empty ( $pmRestClient )) {
if ( is_file ( PATH_DATA . 'sites/' . $workspace . '/' . '.server_info' )) {
$SERVER_INFO = file_get_contents ( PATH_DATA . 'sites/' . $workspace . '/' . '.server_info' );
$SERVER_INFO = unserialize ( $SERVER_INFO );
$envFile = PATH_CONFIG . 'env.ini' ;
$skin = 'neoclassic' ;
if ( file_exists ( $envFile ) ) {
$sysConf = System :: getSystemConfiguration ( $envFile );
$lang = $sysConf [ 'default_lang' ];
$skin = $sysConf [ 'default_skin' ];
}
$endpoint = sprintf (
'%s/sys%s/%s/%s/oauth2/grant' ,
2014-10-31 16:37:50 -04:00
isset ( $SERVER_INFO [ 'HTTP_ORIGIN' ]) ? $SERVER_INFO [ 'HTTP_ORIGIN' ] : '' ,
2014-05-13 17:15:44 -04:00
$workspace ,
$lang ,
$skin
);
$oauthClients = new OauthClients ();
$oauthClients -> setClientId ( 'x-pm-local-client' );
$oauthClients -> setClientSecret ( '179ad45c6ce2cb97cf1029e212046e81' );
$oauthClients -> setClientName ( 'PM Web Designer' );
$oauthClients -> setClientDescription ( 'ProcessMaker Web Designer App' );
$oauthClients -> setClientWebsite ( 'www.processmaker.com' );
$oauthClients -> setRedirectUri ( $endpoint );
$oauthClients -> save ();
} else {
eprintln ( " WARNING! No server info found! " , 'red' );
}
}
}
2014-09-25 16:55:16 -04:00
public function changeHashPassword ( $workspace , $response )
{
2014-09-22 09:58:50 -04:00
$this -> initPropel ( true );
2014-09-25 16:55:16 -04:00
G :: LoadClass ( " enterprise " );
2014-10-10 16:17:07 -04:00
$licensedFeatures = & PMLicensedFeatures :: getSingleton ();
2014-11-24 11:06:28 -04:00
/*----------------------------------********---------------------------------*/
2014-10-10 16:17:07 -04:00
if ( $licensedFeatures -> verifyfeature ( '95OY24wcXpEMzIyRmlNSnF0STNFSHJzMG9wYTJKekpLNmY2ZmRCeGtuZk5oUDloaUNhUGVjTDJBPT0=' )) {
enterpriseClass :: setHashPassword ( $response );
} else {
return false ;
}
2014-11-24 11:06:28 -04:00
/*----------------------------------********---------------------------------*/
2014-10-10 16:17:07 -04:00
return true ;
2014-09-22 09:58:50 -04:00
}
2014-09-26 13:00:16 -04:00
2014-10-17 12:30:25 -04:00
public function verifyFilesOldEnterprise ( $workspace )
2014-09-26 13:00:16 -04:00
{
$this -> initPropel ( true );
$pathBackup = PATH_DATA . 'backups' ;
if ( ! file_exists ( $pathBackup )) {
G :: mk_dir ( $pathBackup , 0777 );
}
$pathNewFile = PATH_DATA . 'backups' . PATH_SEP . 'enterpriseBackup' ;
$pathDirectoryEnterprise = PATH_CORE . 'plugins' . PATH_SEP . 'enterprise' ;
$pathFileEnterprise = PATH_CORE . 'plugins' . PATH_SEP . 'enterprise.php' ;
2014-10-02 18:07:57 -04:00
if ( ! file_exists ( $pathDirectoryEnterprise ) && ! file_exists ( $pathFileEnterprise )) {
2014-09-26 13:00:16 -04:00
CLI :: logging ( " Without changes... \n " );
return true ;
}
2014-09-29 11:38:08 -04:00
CLI :: logging ( " Migrating Enterprise Core version... \n " );
2014-09-26 13:00:16 -04:00
if ( ! file_exists ( $pathNewFile )) {
CLI :: logging ( " Creating folder in $pathNewFile\n " );
G :: mk_dir ( $newDiretory , 0777 );
}
$shared_stat = stat ( PATH_DATA );
if ( file_exists ( $pathDirectoryEnterprise )) {
2014-09-29 11:38:08 -04:00
CLI :: logging ( " Copying Enterprise Directory to $pathNewFile ... \n " );
2014-09-26 13:00:16 -04:00
if ( $shared_stat !== false ) {
workspaceTools :: dirPerms ( $pathDirectoryEnterprise , $shared_stat [ 'uid' ], $shared_stat [ 'gid' ], $shared_stat [ 'mode' ]);
} else {
2014-09-29 11:38:08 -04:00
CLI :: logging ( CLI :: error ( " Could not get shared folder permissions, workspace permissions couldn't be changed " ) . " \n " );
2014-09-26 13:00:16 -04:00
}
if ( G :: recursive_copy ( $pathDirectoryEnterprise , $pathNewFile . PATH_SEP . 'enterprise' )) {
CLI :: logging ( " Removing $pathDirectoryEnterprise ... \n " );
G :: rm_dir ( $pathDirectoryEnterprise );
} else {
2014-09-29 11:38:08 -04:00
CLI :: logging ( CLI :: error ( " Error: Failure to copy from $pathDirectoryEnterprise ... \n " ));
2014-09-26 13:00:16 -04:00
}
if ( file_exists ( $pathDirectoryEnterprise )) {
CLI :: logging ( CLI :: info ( " Remove manually $pathDirectoryEnterprise ... \n " ));
}
}
if ( file_exists ( $pathFileEnterprise )) {
2014-09-29 11:38:08 -04:00
CLI :: logging ( " Copying Enterprise.php file to $pathNewFile ... \n " );
2014-09-26 13:00:16 -04:00
if ( $shared_stat !== false ) {
workspaceTools :: dirPerms ( $pathFileEnterprise , $shared_stat [ 'uid' ], $shared_stat [ 'gid' ], $shared_stat [ 'mode' ]);
} else {
2014-09-29 11:38:08 -04:00
CLI :: logging ( CLI :: error ( " Could not get shared folder permissions, workspace permissions couldn't be changed " ) . " \n " );
2014-09-26 13:00:16 -04:00
}
CLI :: logging ( " Removing $pathFileEnterprise ... \n " );
copy ( $pathFileEnterprise , $pathNewFile . PATH_SEP . 'enterprise.php' );
2014-09-26 14:18:59 -04:00
G :: rm_dir ( $pathFileEnterprise );
2014-09-26 13:00:16 -04:00
if ( file_exists ( $pathFileEnterprise )) {
CLI :: logging ( CLI :: info ( " Remove manually $pathFileEnterprise ... \n " ));
}
}
}
2014-10-17 12:30:25 -04:00
public function verifyLicenseEnterprise ( $workspace )
{
$this -> initPropel ( true );
require_once ( " classes/model/LicenseManager.php " );
$oCriteria = new Criteria ( 'workflow' );
$oCriteria -> add ( LicenseManagerPeer :: LICENSE_STATUS , 'ACTIVE' );
$oDataset = LicenseManagerPeer :: doSelectRS ( $oCriteria );
$oDataset -> setFetchmode ( ResultSet :: FETCHMODE_ASSOC );
$row = array ();
if ( $oDataset -> next ()) {
$row = $oDataset -> getRow ();
$tr = LicenseManagerPeer :: retrieveByPK ( $row [ 'LICENSE_UID' ] );
$pos = strpos ( $row [ 'LICENSE_PATH' ], 'license_' );
$license = substr ( $row [ 'LICENSE_PATH' ], $pos , strlen ( $row [ 'LICENSE_PATH' ]));
$tr -> setLicensePath ( PATH_DATA . " sites/ " . $workspace . " /licenses/ " . $license );
$tr -> setLicenseWorkspace ( $workspace );
$res = $tr -> save ();
}
}
2014-10-27 11:25:17 -04:00
/**
* Generate data for table APP_ASSIGN_SELF_SERVICE_VALUE
*
* return void
*/
public function appAssignSelfServiceValueTableGenerateData ()
{
try {
$this -> initPropel ( true );
$appAssignSelfServiceValue = new AppAssignSelfServiceValue ();
$appAssignSelfServiceValue -> generateData ();
} catch ( Exception $e ) {
throw $e ;
}
}
2014-11-19 16:47:22 -04:00
/**
* Get disabled code
*
* return array Return array with disabled code found , array empty otherwise
*/
public function getDisabledCode ()
{
try {
$this -> initPropel ( true );
G :: LoadClass ( " processes " );
$process = new Processes ();
//Return
return $process -> getDisabledCode ();
} catch ( Exception $e ) {
throw $e ;
}
}
2010-12-02 23:34:41 +00:00
}
2014-11-19 16:47:22 -04:00