install =& $install;
}
// SQL > FINAL > SETTINGS > ACPPERMS / HELP FILE > DB CHECKER
// After all sets have run: SKIN REVERT > TEMPLATES > OTHER [ Email Templates? ] > Build Caches > DB Check
function run()
{
$this->install->get_version_latest();
$this->install->saved_data['helpfile'] = intval($this->install->ipsclass->input['helpfile']) ? intval($this->install->ipsclass->input['helpfile']) : $this->install->saved_data['helpfile'];
$this->install->saved_data['man'] = intval($this->install->ipsclass->input['man']) ? intval($this->install->ipsclass->input['man']) : $this->install->saved_data['man'];
/* Switch */
switch( $this->install->ipsclass->input['sub'] )
{
case 'sql':
$this->install_sql();
break;
case 'settings':
$this->install_settings();
break;
case 'acpperms':
$this->install_acpperms();
break;
case 'finish':
$this->install_finish();
break;
case 'checkdb':
$this->install_checkdb();
break;
case 'skinrevert':
$this->install_skinrevert();
break;
case 'templates':
$this->install_templates();
break;
case 'caches':
$this->install_caches();
break;
default:
/* Output */
$count = $this->install->ipsclass->DB->build_and_exec_query( array( 'select' => 'count(*) as num', 'from' => 'posts' ) );
if( $count['num'] > 100000 )
{
$do_manual = 1;
}
else
{
$do_manual = 0;
}
$this->install->template->append( $this->install->template->install_page( $do_manual ) );
$this->install->template->next_action = '?p=install&sub=sql';
$this->install->template->hide_next = 1;
break;
}
//----------------------------------------------
// Log errors for tech support
//----------------------------------------------
if( count($this->install->error) > 0 )
{
$file_name = ROOT_PATH . 'cache/sql_upgrade_log_'.date('m_d_y').'.cgi';
$_error_string = "\n===================================================";
$_error_string .= "\n Date: ". date( 'r' );
$_error_string .= "\n IP Address: " . $_SERVER['REMOTE_ADDR'];
$_error_string .= "\n Member ID: " . $this->install->ipsclass->member['id'];
$_error_string .= "\n Version Folder: " .$this->install->current_upgrade;
$_error_string .= "\n Current Sub Step: " .$this->install->ipsclass->input['sub'];
$_error_string .= "\n Current workact: " .$this->install->saved_data['workact'];
$_error_string .= "\n\n\n ".$this->install->ipsclass->my_br2nl(implode( "\n", $this->install->error ));
$fh = fopen( $file_name, "a" );
fwrite( $fh, $_error_string, strlen( $_error_string ) );
fclose( $fh );
}
}
/*-------------------------------------------------------------------------*/
// Installs the SQL
/*-------------------------------------------------------------------------*/
/**
* Installs SQL schematic
*
* @return void
*/
function install_sql()
{
if ( $this->install->current_upgrade AND $this->install->current_upgrade < 20000 )
{
// Jump right to the finish routine for 1.x
$this->install_finish();
return;
}
$output = "";
$message = array();
$this->install->error = array();
$SQL = array();
$cnt = 0;
if ( file_exists( INS_ROOT_PATH.'installfiles/upg_'.$this->install->current_upgrade.'/'.strtolower($this->install->ipsclass->vars['sql_driver']).'_updates.php' ) )
{
require_once ( INS_ROOT_PATH.'installfiles/upg_'.$this->install->current_upgrade.'/'.strtolower($this->install->ipsclass->vars['sql_driver']).'_updates.php' );
}
// Create/Alter tables
if ( count( $SQL ) > 0 )
{
$this->sqlcount = 0;
$this->install->ipsclass->DB->return_die = 1;
foreach( $SQL as $q )
{
$this->install->ipsclass->DB->allow_sub_select = 1;
$this->install->ipsclass->DB->error = '';
$q = str_replace( "<%time%>", time(), $q );
if( $this->install->ipsclass->vars['mysql_tbl_type'] )
{
if( preg_match( "/^create table(.+?)/i", $q ) )
{
$q = preg_replace( "/^(.+?)\);$/is", "\\1) TYPE={$this->install->ipsclass->vars['mysql_tbl_type']};", $q );
}
}
if( $this->install->saved_data['man'] )
{
$output .= preg_replace("/\sibf_(\S+?)([\s\.,]|$)/", " ".$this->install->ipsclass->DB->obj['sql_tbl_prefix']."\\1\\2", preg_replace( "/\s{1,}/", " ", $q ) )."\n\n";
}
else
{
$this->install->ipsclass->DB->query( $q );
if ( $this->install->ipsclass->DB->error )
{
$this->install->error[] = $q."
".$this->install->ipsclass->DB->error;
}
else
{
$this->sqlcount++;
}
}
}
$message[] = $this->sqlcount." queries run...";
}
else
{
// If there are no SQL queries to run, jump to settings
$this->install_finish();
return;
}
if ( count( $this->install->error ) > 0 )
{
$this->install->message = count($message) ? implode( "
", $message ) : "Proceeding with update";
$this->install->template->warning( array_merge( array( $this->install->message ),
array( 'Error in upgrade '.$this->install->versions[ $this->install->current_upgrade ]. ' (' . $this->install->current_upgrade . ')' ),
array( "".count($this->install->error).' errors found' ),
$this->install->error ) );
$this->install->template->in_error = 1;
$this->install->template->next_action = '?p=install&sub=finish';
return;
}
if( $this->install->saved_data['man'] AND $output )
{
$output = "
Please run these queries in your MySQL database before continuing..
".nl2br(htmlspecialchars($output));
$this->install->template->next_action = '?p=install&sub=finish';
$this->install->template->append( $output );
}
else
{
$output[] = count($message) ? implode( "
", $message ) : "No queries, settings, or permissions to import...
Proceeding with update";
$this->install->template->next_action = '?p=install&sub=finish';
$this->install->template->append( $this->install->template->install_page_refresh( $output ) );
$this->install->template->hide_next = 1;
}
}
/*-------------------------------------------------------------------------*/
// Installs the Settings
/*-------------------------------------------------------------------------*/
/**
* Installs Partial Settings
*
* @return void
*/
function install_settings()
{
if ( $this->install->current_upgrade AND $this->install->current_upgrade < 20000 )
{
// Jump right to the finish routine for 1.x
// Reorganized - should never hit here
$this->install_finish();
return;
}
$message = array();
$this->install->error = array();
//-------------------------------
// Load module...
//-------------------------------
require_once( ROOT_PATH . 'sources/action_admin/settings.php' );
$settings = new ad_settings();
$settings->ipsclass =& $this->install->ipsclass;
//-------------------------------
// Set location
//-------------------------------
$this->install->ipsclass->input['file_location'] = 'resources/settings.xml';
//-------------------------------
// Run it
//-------------------------------
$settings->settings_do_import( 1 );
$message[] = $this->install->ipsclass->main_msg;
// 2.2.0 preserve login type
if( $this->install->saved_data['ipbli_usertype'] )
{
$this->install->ipsclass->DB->do_update( "conf_settings", array( 'conf_value' => $this->install->saved_data['ipbli_usertype'] ), "conf_key='ipbli_usertype'" );
$this->install->ipsclass->DB->do_update( "login_methods", array( 'login_user_id' => $this->install->saved_data['ipbli_usertype'] ), "login_folder_name='internal'" );
}
if ( count( $this->install->error ) > 0 )
{
$this->install->message = count($message) ? implode( "
", $message ) : "Proceeding with update";
$this->install->template->warning( array_merge( array( $this->install->message ),
array( 'Error in upgrade '.$this->install->versions[ $this->install->current_upgrade ]. ' (' . $this->install->current_upgrade . ')' ),
array( "".count($this->install->error).' errors found' ),
$this->install->error ) );
$this->install->template->in_error = 1;
$this->install->template->next_action = '?p=install&sub=acpperms';
return;
}
$output[] = count($message) ? implode( "
", $message ) : "No settings to import...
Proceeding with update";
$this->install->template->next_action = '?p=install&sub=acpperms';
$this->install->template->append( $this->install->template->install_page_refresh( $output ) );
$this->install->template->hide_next = 1;
}
/*-------------------------------------------------------------------------*/
// Installs the ACP Permissions
/*-------------------------------------------------------------------------*/
/**
* Installs ACP Permissions
*
* @return void
*/
function install_acpperms()
{
if( $this->install->current_upgrade AND $this->install->current_upgrade < 20000 )
{
// Jump right to the finish routine for 1.x
// Reorganized - should never hit here
$this->install_finish();
return;
}
$message = array();
$this->install->error = array();
//-----------------------------------------
// Do Tasks - Just stick it here shall we
//-----------------------------------------
require_once( ROOT_PATH . 'sources/api/api_tasks.php' );
$api = new api_tasks();
$api->ipsclass =& $this->install->ipsclass;
$api->api_init();
$api->add_task();
$message[] = $api->error ? "Could not rebuild tasks. Please rebuild tasks in the ACP from the Task Manager page" : "Rebuilt Tasks from XML...";
//-------------------------------
// Load module...
//-------------------------------
require_once( ROOT_PATH . 'sources/action_admin/acppermissions.php' );
$settings = new ad_acppermissions();
$settings->ipsclass =& $this->install->ipsclass;
//-------------------------------
// Set location
//-------------------------------
$this->install->ipsclass->input['file_location'] = 'resources/acpperms.xml';
//-------------------------------
// Run it
//-------------------------------
$settings->acpperms_xml_import( 1 );
$message[] = $this->install->ipsclass->main_msg;
//-----------------------------------------
// Install FAQ
//-----------------------------------------
$message[] = "Updating FAQ information...";
$xml = new class_xml();
$xml->lite_parser = 1;
$updatehelp = ( isset( $this->install->saved_data['helpfile'] ) && $this->install->saved_data['helpfile'] ) ? 1 : 0;
$content = implode( "", file( ROOT_PATH . 'resources/faq.xml' ) );
if ( $content )
{
$xml->xml_parse_document( $content );
foreach( $xml->xml_array['export']['group']['row'] as $id => $entry )
{
$newrow = array();
foreach( $entry as $f => $data )
{
if ( $f == 'VALUE' or $f == 'id' )
{
continue;
}
$newrow[$f] = $entry[ $f ]['VALUE'];
}
if ( $newrow['title'] )
{
$cur_faq = $this->install->ipsclass->DB->build_and_exec_query( array( 'select' => 'id', 'from' => 'faq', 'where' => "title = '".$this->install->ipsclass->DB->add_slashes( $newrow['title'] )."'" ) );
if ( $cur_faq['id'] )
{
if ( $updatehelp )
{
$this->install->ipsclass->DB->do_update( 'faq', $newrow, "id = ".$cur_faq['id'] );
}
}
else
{
$this->install->ipsclass->DB->do_insert( 'faq', $newrow );
}
}
}
}
//-----------------------------------------
// XML: Help Information
//-----------------------------------------
$message[] = "Inserting ACP help files...";
$keys = array();
$this->install->ipsclass->DB->build_query( array( 'select' => 'page_key', 'from' => 'acp_help' ) );
$this->install->ipsclass->DB->exec_query();
while( $r = $this->install->ipsclass->DB->fetch_row() )
{
$keys[] = $r['page_key'];
}
$xml = new class_xml();
$xml->lite_parser = 1;
$content = implode( "", file( ROOT_PATH . 'resources/help_sections.xml' ) );
$xml->xml_parse_document( $content );
foreach( $xml->xml_array['helpsectionsexport']['helpsectionsgroup']['helpsections'] as $id => $entry )
{
$newrow = array(
'is_setting' => 0,
'page_key' => $entry['key']['VALUE'],
'help_title' => $entry['title']['VALUE'],
'help_body' => $entry['helptext']['VALUE'],
);
if( in_array( $newrow['page_key'], $keys ) )
{
$this->install->ipsclass->DB->do_update( 'acp_help', $newrow, "page_key='{$newrow['page_key']}'" );
}
else
{
$this->install->ipsclass->DB->do_insert( 'acp_help', $newrow );
}
}
$xml = new class_xml();
$xml->lite_parser = 1;
$content = implode( "", file( ROOT_PATH . 'resources/help_settings.xml' ) );
$xml->xml_parse_document( $content );
foreach( $xml->xml_array['helpsettingsexport']['helpsettingsgroup']['helpsettings'] as $id => $entry )
{
$newrow = array(
'is_setting' => 1,
'page_key' => $entry['key']['VALUE'],
'help_title' => $entry['title']['VALUE'],
'help_body' => $entry['helptext']['VALUE'],
'help_mouseover'=> $entry['mouseover']['VALUE'],
);
if( in_array( $newrow['page_key'], $keys ) )
{
$this->install->ipsclass->DB->do_update( 'acp_help', $newrow, "page_key='{$newrow['page_key']}'" );
}
else
{
$this->install->ipsclass->DB->do_insert( 'acp_help', $newrow );
}
}
if ( count( $this->install->error ) > 0 )
{
$this->install->message = count($message) ? implode( "
", $message ) : "Proceeding with update";
$this->install->template->warning( array_merge( array( $this->install->message ),
array( 'Error in upgrade '.$this->install->versions[ $this->install->current_upgrade ]. ' (' . $this->install->current_upgrade . ')' ),
array( "".count($this->install->error).' errors found' ),
$this->install->error ) );
$this->install->template->in_error = 1;
$this->install->template->next_action = '?p=install&sub=finish';
return;
}
$this->install->template->next_action = '?p=install&sub=checkdb';
$this->install->template->append( $this->install->template->install_page_refresh( $message ) );
$this->install->template->hide_next = 1;
}
/*-------------------------------------------------------------------------*/
// Finishes the version
/*-------------------------------------------------------------------------*/
/**
* Runs version upgrade script and finishes the version
*
* @return void
*/
function install_finish()
{
$continue = 0;
if ( $this->install->current_upgrade < 20000 )
{
$driver = $this->install->ipsclass->vars['sql_driver'] ? trim(strtolower($this->install->ipsclass->vars['sql_driver'])) : 'mysql';
$upg_file = INS_ROOT_PATH.'installfiles/upg_'.$this->install->current_upgrade.'/version_upgrade_' . $driver . '.php';
}
else
{
$upg_file = INS_ROOT_PATH.'installfiles/upg_'.$this->install->current_upgrade.'/version_upgrade.php';
}
if ( file_exists( $upg_file ) )
{
require_once( $upg_file );
$upgrade = new version_upgrade( $this->install );
$result = $upgrade->auto_run();
if ( count( $this->install->error ) > 0 )
{
$this->install->template->warning( array_merge( array( $this->install->message ),
array( 'Error in upgrade '.$this->install->versions[ $this->install->current_upgrade ]. ' (' . $this->install->current_upgrade . ')' ),
array( "".count($this->install->error).' errors found' ),
$this->install->error ) );
$this->install->template->in_error = 1;
if ( ! $result )
{
$this->install->template->next_action = '?p=install&sub=finish';
}
elseif ( $this->install->current_upgrade >= $this->install->last_poss_id || $this->install->current_upgrade == 0 )
{
$this->install->template->next_action = '?p=install&sub=settings';
}
else
{
$this->install->template->next_action = '?p=install&sub=sql';
}
$in_error = 1;
}
//-----------------------------------------
// 'version_upgrade.php' is now done
//-----------------------------------------
if ( $result )
{
// The individual upgrade files all shoot you to 2.0...
if ( $this->install->current_upgrade < 20000 )
{
$this->install->current_upgrade = '10004';
unset($this->install->saved_data['vid']);
}
//------------------------------------------
// Update DB
//------------------------------------------
$this->install->ipsclass->DB->do_insert( 'upgrade_history', array( 'upgrade_version_id' => $this->install->current_upgrade,
'upgrade_version_human' => $this->install->versions[ $this->install->current_upgrade ],
'upgrade_date' => time(),
'upgrade_mid' => $this->install->saved_data['mid'],
) );
if ( $in_error == 1 )
{
return;
}
if ( $this->install->message )
{
$output[] = $this->install->message;
}
$output[] = "Succesfully upgraded to version {$this->install->versions[ $this->install->current_upgrade ]}";
}
else
{
if ( $in_error == 1 )
{
return;
}
if ( $this->install->message )
{
$output[] = $this->install->message;
}
else
{
$output[] = "Proceeding with update...";
}
$continue = 1;
}
}
else
{
//------------------------------------------
// Update DB
//------------------------------------------
if ( $this->install->current_upgrade )
{
$this->install->ipsclass->DB->do_insert( 'upgrade_history', array( 'upgrade_version_id' => $this->install->current_upgrade,
'upgrade_version_human' => $this->install->versions[ $this->install->current_upgrade ],
'upgrade_date' => time(),
'upgrade_mid' => $this->install->saved_data['mid'],
) );
$output[] = "Succesfully upgraded to version {$this->install->versions[ $this->install->current_upgrade ]}";
}
}
//-----------------------------------------
// Next...
//-----------------------------------------
if ( $continue )
{
//-----------------------------------------
// More to do?
//-----------------------------------------
$this->install->template->next_action = '?p=install&sub=finish';
}
elseif ( $this->install->current_upgrade >= $this->install->last_poss_id || $this->install->current_upgrade == 0 )
{
//-----------------------------------------
// Last update?
//-----------------------------------------
$this->install->template->next_action = '?p=install&sub=settings';
}
else
{
//-----------------------------------------
// Do SQL
//-----------------------------------------
$this->install->template->next_action = '?p=install&sub=sql';
}
if ( $this->install->do_man )
{
$this->install->template->append( implode( "
", $output ) );
}
else
{
$this->install->template->append( $this->install->template->install_page_refresh( $output ) );
$this->install->template->hide_next = 1;
}
}
/*-------------------------------------------------------------------------*/
// Runs the DB Checker after install
/*-------------------------------------------------------------------------*/
/**
* Checks DB for errors
*
* @return void
*/
function install_checkdb()
{
$message = array();
$this->install->error = array();
if ( @file_exists( ROOT_PATH."/install/sql/{$this->install->ipsclass->vars['sql_driver']}_tables.php" ) )
{
//-------------------------------
// Load ACP Skin...
//-------------------------------
require_once( ROOT_PATH . "sources/lib/admin_skin.php" );
$this->install->ipsclass->skin_acp = 'IPB2_Standard';
$this->install->ipsclass->skin_acp_url = $this->install->ipsclass->vars['board_url'] . "/skin_acp/" . $this->install->ipsclass->skin_acp;
$this->install->ipsclass->adskin = new admin_skin();
$this->install->ipsclass->adskin->ipsclass =& $this->install->ipsclass;
$this->install->ipsclass->adskin->init_admin_skin();
//-----------------------------------------
// Fixing something?
//-----------------------------------------
$queries_to_run = array();
foreach( $this->install->ipsclass->input as $k => $v )
{
if( preg_match( "/^query(\d+)$/", $k, $matches ) )
{
$queries_to_run[] = $v;
}
}
if( isset($this->install->ipsclass->input['query']) AND $this->install->ipsclass->input['query'] )
{
$queries_to_run[] = $this->install->ipsclass->input['query'];
}
if( count($queries_to_run) > 0 )
{
foreach( $queries_to_run as $the_query )
{
$sql = trim( urldecode( base64_decode($the_query) ) );
if ( preg_match( "/^(DROP|FLUSH)/i", trim($sql) ) )
{
$this->install->ipsclass->main_msg = "Sorry, those queries are not allowed for your safety";
continue;
}
else if ( preg_match( "/^(DELETE|UPDATE|TRUNCATE)/i", preg_replace( "#\s{1,}#s", "", $sql ) ) and preg_match( "/admin_login_logs/i", preg_replace( "#\s{1,}#s", "", $sql ) ) )
{
$this->install->ipsclass->main_msg = "Sorry, those queries are not allowed for your safety";
continue;
}
else
{
$this->install->ipsclass->DB->return_die = 1;
$this->install->ipsclass->DB->query($sql,1);
if( $this->install->ipsclass->DB->error != "" )
{
$this->install->ipsclass->main_msg .= "SQL Error
{$this->install->ipsclass->DB->error}
";
}
else
{
$this->install->ipsclass->main_msg .= "Query: ".htmlspecialchars($sql)."
Executed Successfully
";
}
$this->install->ipsclass->DB->error = "";
$this->install->ipsclass->DB->failed = 0;
}
}
}
//-------------------------------
// Load module...
//-------------------------------
require_once( KERNEL_PATH . 'db_lib/' . strtolower($this->install->ipsclass->vars['sql_driver']) . '_tools.php' );
require_once( ROOT_PATH . 'install/sql/' . strtolower($this->install->ipsclass->vars['sql_driver']) . '_tables.php' );
$db_tools = new db_tools( $this->install->ipsclass );
$output = array();
$output = $db_tools->db_table_diag( $TABLE );
#print_r($output);
$our_output = "
";
if( $output['error_count'] > 0 )
{
$this->install->ipsclass->adskin->td_header[] = array( "{none}" , "50%" );
$this->install->ipsclass->adskin->td_header[] = array( "{none}" , "50%" );
$our_output .= "";
$our_output .= $this->install->ipsclass->adskin->start_table( "WARNING: ERRORS FOUND" );
$our_output .= $this->install->ipsclass->adskin->add_td_row( array( array( "