2017-08-08 12:06:05 +02:00
< ? php
if ( ! defined ( 'DUPLICATOR_VERSION' )) exit ; // Exit if accessed directly
class DUP_Installer
{
//PUBLIC
public $File ;
public $Size = 0 ;
public $OptsDBHost ;
public $OptsDBPort ;
public $OptsDBName ;
public $OptsDBUser ;
//PROTECTED
protected $Package ;
/**
* Init this object
*/
function __construct ( $package )
{
$this -> Package = $package ;
}
/**
* Build the installer script
*
* @ param obj $package A reference to the package that this installer object belongs to
*
* @ return null
*/
public function build ( $package )
{
$this -> Package = $package ;
DUP_Log :: Info ( " \n ******************************************************************************** " );
DUP_Log :: Info ( " MAKE INSTALLER: " );
DUP_Log :: Info ( " ******************************************************************************** " );
DUP_Log :: Info ( " Build Start " );
$template_uniqid = uniqid ( '' ) . '_' . time ();
$template_path = DUP_Util :: safePath ( DUPLICATOR_SSDIR_PATH_TMP . " /installer.template_ { $template_uniqid } .php " );
$main_path = DUP_Util :: safePath ( DUPLICATOR_PLUGIN_PATH . 'installer/build/main.installer.php' );
@ chmod ( $template_path , 0777 );
@ chmod ( $main_path , 0777 );
@ touch ( $template_path );
$main_data = file_get_contents ( " { $main_path } " );
$template_result = file_put_contents ( $template_path , $main_data );
if ( $main_data === false || $template_result == false ) {
$err_info = " These files may have permission issues. Please validate that PHP has read/write access. \n " ;
$err_info .= " Main Installer: ' { $main_path } ' \n Template Installer: ' $template_path ' " ;
DUP_Log :: Error ( " Install builder failed to generate files. " , " { $err_info } " );
}
$embeded_files = array (
" assets/inc.libs.css.php " => " @@INC.LIBS.CSS.PHP@@ " ,
" assets/inc.css.php " => " @@INC.CSS.PHP@@ " ,
" assets/inc.libs.js.php " => " @@INC.LIBS.JS.PHP@@ " ,
" assets/inc.js.php " => " @@INC.JS.PHP@@ " ,
" classes/utilities/class.u.php " => " @@CLASS.U.PHP@@ " ,
" classes/class.server.php " => " @@CLASS.SERVER.PHP@@ " ,
" classes/class.db.php " => " @@CLASS.DB.PHP@@ " ,
" classes/class.logging.php " => " @@CLASS.LOGGING.PHP@@ " ,
" classes/class.engine.php " => " @@CLASS.ENGINE.PHP@@ " ,
" classes/config/class.conf.wp.php " => " @@CLASS.CONF.WP.PHP@@ " ,
" classes/config/class.conf.srv.php " => " @@CLASS.CONF.SRV.PHP@@ " ,
" ctrls/ctrl.step1.php " => " @@CTRL.STEP1.PHP@@ " ,
" ctrls/ctrl.step2.php " => " @@CTRL.STEP2.PHP@@ " ,
" ctrls/ctrl.step3.php " => " @@CTRL.STEP3.PHP@@ " ,
" view.step1.php " => " @@VIEW.STEP1.PHP@@ " ,
" view.step2.php " => " @@VIEW.STEP2.PHP@@ " ,
" view.step3.php " => " @@VIEW.STEP3.PHP@@ " ,
" view.step4.php " => " @@VIEW.STEP4.PHP@@ " ,
" view.help.php " => " @@VIEW.HELP.PHP@@ " ,);
foreach ( $embeded_files as $name => $token ) {
$file_path = DUPLICATOR_PLUGIN_PATH . " installer/build/ { $name } " ;
@ chmod ( $file_path , 0777 );
$search_data = @ file_get_contents ( $template_path );
$insert_data = @ file_get_contents ( $file_path );
file_put_contents ( $template_path , str_replace ( " ${ token } " , " { $insert_data } " , $search_data ));
if ( $search_data === false || $insert_data == false ) {
DUP_Log :: Error ( " Installer generation failed at { $token } . " );
}
@ chmod ( $file_path , 0644 );
}
@ chmod ( $template_path , 0644 );
@ chmod ( $main_path , 0644 );
DUP_Log :: Info ( " Build Finished " );
$this -> createFromTemplate ( $template_path );
$storePath = " { $this -> Package -> StorePath } / { $this -> File } " ;
$this -> Size = @ filesize ( $storePath );
$this -> addBackup ();
}
/**
* Puts an installer zip file in the archive for backup purposes .
*
* @ return null
*/
private function addBackup ()
{
$zipPath = DUP_Util :: safePath ( " { $this -> Package -> StorePath } / { $this -> Package -> Archive -> File } " );
$installer = DUP_Util :: safePath ( DUPLICATOR_SSDIR_PATH_TMP ) . " / { $this -> Package -> NameHash } _installer.php " ;
$zipArchive = new ZipArchive ();
if ( $zipArchive -> open ( $zipPath , ZIPARCHIVE :: CREATE ) === TRUE ) {
if ( $zipArchive -> addFile ( $installer , " installer-backup.php " )) {
DUP_Log :: Info ( " Added to archive " );
} else {
DUP_Log :: Info ( " Unable to add installer-backup.php to archive. " , " Installer File Path [ { $installer } ] " );
}
$zipArchive -> close ();
}
}
/**
* Generates the final installer file from the template file
*
2017-09-06 14:18:47 +02:00
* @ param string $template The path to the installer template which is originally copied from main . installer . php
2017-08-08 12:06:05 +02:00
*
* @ return null
*/
private function createFromTemplate ( $template )
{
global $wpdb ;
DUP_Log :: Info ( " Preping for use " );
$installer = DUP_Util :: safePath ( DUPLICATOR_SSDIR_PATH_TMP ) . " / { $this -> Package -> NameHash } _installer.php " ;
//Option values to delete at install time
$deleteOpts = $GLOBALS [ 'DUPLICATOR_OPTS_DELETE' ];
2017-09-06 14:18:47 +02:00
DUP_Log :: Info ( " PACK SIZE: { $this -> Package -> Size } " );
2017-08-08 12:06:05 +02:00
$replace_items = Array (
//COMPARE VALUES
" fwrite_created " => $this -> Package -> Created ,
" fwrite_version_dup " => DUPLICATOR_VERSION ,
" fwrite_version_wp " => $this -> Package -> VersionWP ,
" fwrite_version_db " => $this -> Package -> VersionDB ,
" fwrite_version_php " => $this -> Package -> VersionPHP ,
" fwrite_version_os " => $this -> Package -> VersionOS ,
//GENERAL
" fwrite_url_old " => get_option ( 'siteurl' ),
" fwrite_archive_name " => " { $this -> Package -> NameHash } _archive.zip " ,
" fwrite_archive_onlydb " => $this -> Package -> Archive -> ExportOnlyDB ,
" fwrite_package_notes " => $this -> Package -> Notes ,
2017-09-06 14:18:47 +02:00
" fwrite_package_size " => $this -> Package -> Archive -> Size ,
2017-08-08 12:06:05 +02:00
" fwrite_secure_name " => $this -> Package -> NameHash ,
" fwrite_dbhost " => $this -> Package -> Installer -> OptsDBHost ,
" fwrite_dbport " => $this -> Package -> Installer -> OptsDBPort ,
" fwrite_dbname " => $this -> Package -> Installer -> OptsDBName ,
" fwrite_dbuser " => $this -> Package -> Installer -> OptsDBUser ,
" fwrite_dbpass " => '' ,
" fwrite_wp_tableprefix " => $wpdb -> prefix ,
" fwrite_opts_delete " => json_encode ( $deleteOpts ),
" fwrite_blogname " => esc_html ( get_option ( 'blogname' )),
" fwrite_wproot " => DUPLICATOR_WPROOTPATH ,
" fwrite_wplogin_url " => wp_login_url (),
" fwrite_duplicator_version " => DUPLICATOR_VERSION );
if ( file_exists ( $template ) && is_readable ( $template )) {
$err_msg = " ERROR: Unable to read/write installer. \n ERROR INFO: Check permission/owner on file and parent folder. \n Installer File = < { $installer } > " ;
$install_str = $this -> parseTemplate ( $template , $replace_items );
( empty ( $install_str )) ? DUP_Log :: Error ( " { $err_msg } " , " DUP_Installer::createFromTemplate => file-empty-read " ) : DUP_Log :: Info ( " Template parsed with new data " );
//INSTALLER FILE
$fp = ( ! file_exists ( $installer )) ? fopen ( $installer , 'x+' ) : fopen ( $installer , 'w' );
if ( ! $fp || ! fwrite ( $fp , $install_str , strlen ( $install_str ))) {
DUP_Log :: Error ( " { $err_msg } " , " DUP_Installer::createFromTemplate => file-write-error " );
}
@ fclose ( $fp );
} else {
DUP_Log :: Error ( " Installer Template missing or unreadable. " , " Template [ { $template } ] " );
}
@ unlink ( $template );
DUP_Log :: Info ( " Complete [ { $installer } ] " );
}
/**
* Tokenize a file based on an array key
*
* @ param string $filename The filename to tokenize
* @ param array $data The array of key value items to tokenize
*/
private function parseTemplate ( $filename , $data )
{
$q = file_get_contents ( $filename );
foreach ( $data as $key => $value ) {
//NOTE: Use var_export as it's probably best and most "thorough" way to
//make sure the values are set correctly in the template. But in the template,
//need to make things properly formatted so that when real syntax errors
//exist they are easy to spot. So the values will be surrounded by quotes
$find = array ( " '% { $key } %' " , " \" % { $key } % \" " );
$q = str_replace ( $find , var_export ( $value , true ), $q );
//now, account for places that do not surround with quotes... these
//places do NOT need to use var_export as they are not inside strings
$q = str_replace ( '%' . $key . '%' , $value , $q );
}
return $q ;
}
}
?>