' . "\n" . PMA_getIcon('s_replication.png') . __('Replication') . "\n" . '' . "\n"; PMA_Message::error(__('No Privileges'))->display(); include './libraries/footer.inc.php'; } /** * Sets globals from $_REQUEST */ if (isset($_REQUEST['hostname'])) { $GLOBALS['hostname'] = $_REQUEST['hostname']; } if (isset($_REQUEST['mr_adduser'])) { $GLOBALS['mr_adduser'] = $_REQUEST['mr_adduser']; } if (isset($_REQUEST['mr_configure'])) { $GLOBALS['mr_configure'] = $_REQUEST['mr_configure']; } if (isset($_REQUEST['pma_pw'])) { $GLOBALS['pma_pw'] = $_REQUEST['pma_pw']; } if (isset($_REQUEST['port'])) { $GLOBALS['port'] = $_REQUEST['port']; } if (isset($_REQUEST['repl_clear_scr'])) { $GLOBALS['repl_clear_scr'] = $_REQUEST['repl_clear_scr']; } if (isset($_REQUEST['repl_data'])) { $GLOBALS['repl_data'] = $_REQUEST['repl_data']; } if (isset($_REQUEST['sl_configure'])) { $GLOBALS['sl_configure'] = $_REQUEST['sl_configure']; } if (isset($_REQUEST['sl_sync'])) { $GLOBALS['sl_sync'] = $_REQUEST['sl_sync']; } if (isset($_REQUEST['slave_changemaster'])) { $GLOBALS['slave_changemaster'] = $_REQUEST['slave_changemaster']; } if (isset($_REQUEST['sr_skip_errors_count'])) { $GLOBALS['sr_skip_errors_count'] = $_REQUEST['sr_skip_errors_count']; } if (isset($_REQUEST['sr_slave_action'])) { $GLOBALS['sr_slave_action'] = $_REQUEST['sr_slave_action']; } if (isset($_REQUEST['sr_slave_control_parm'])) { $GLOBALS['sr_slave_control_parm'] = $_REQUEST['sr_slave_control_parm']; } if (isset($_REQUEST['sr_slave_server_control'])) { $GLOBALS['sr_slave_server_control'] = $_REQUEST['sr_slave_server_control']; } if (isset($_REQUEST['sr_slave_skip_error'])) { $GLOBALS['sr_slave_skip_error'] = $_REQUEST['sr_slave_skip_error']; } if (isset($_REQUEST['sr_take_action'])) { $GLOBALS['sr_take_action'] = $_REQUEST['sr_take_action']; } if (isset($_REQUEST['url_params'])) { $GLOBALS['url_params'] = $_REQUEST['url_params']; } if (isset($_REQUEST['username'])) { $GLOBALS['username'] = $_REQUEST['username']; } if (isset($_REQUEST[''])) { $GLOBALS[''] = $_REQUEST['']; } /** * Handling control requests */ if (isset($GLOBALS['sr_take_action'])) { $refresh = false; if (isset($GLOBALS['slave_changemaster'])) { $_SESSION['replication']['m_username'] = $sr['username'] = PMA_sqlAddSlashes($GLOBALS['username']); $_SESSION['replication']['m_password'] = $sr['pma_pw'] = PMA_sqlAddSlashes($GLOBALS['pma_pw']); $_SESSION['replication']['m_hostname'] = $sr['hostname'] = PMA_sqlAddSlashes($GLOBALS['hostname']); $_SESSION['replication']['m_port'] = $sr['port'] = PMA_sqlAddSlashes($GLOBALS['port']); $_SESSION['replication']['m_correct'] = ''; $_SESSION['replication']['sr_action_status'] = 'error'; $_SESSION['replication']['sr_action_info'] = __('Unknown error'); // Attempt to connect to the new master server $link_to_master = PMA_replication_connect_to_master($sr['username'], $sr['pma_pw'], $sr['hostname'], $sr['port']); if (! $link_to_master) { $_SESSION['replication']['sr_action_status'] = 'error'; $_SESSION['replication']['sr_action_info'] = sprintf(__('Unable to connect to master %s.'), htmlspecialchars($sr['hostname'])); } else { // Read the current master position $position = PMA_replication_slave_bin_log_master($link_to_master); if (empty($position)) { $_SESSION['replication']['sr_action_status'] = 'error'; $_SESSION['replication']['sr_action_info'] = __('Unable to read master log position. Possible privilege problem on master.'); } else { $_SESSION['replication']['m_correct'] = true; if (! PMA_replication_slave_change_master($sr['username'], $sr['pma_pw'], $sr['hostname'], $sr['port'], $position, true, false)) { $_SESSION['replication']['sr_action_status'] = 'error'; $_SESSION['replication']['sr_action_info'] = __('Unable to change master'); } else { $_SESSION['replication']['sr_action_status'] = 'success'; $_SESSION['replication']['sr_action_info'] = sprintf(__('Master server changed successfully to %s'), htmlspecialchars($sr['hostname'])); } } } } elseif (isset($GLOBALS['sr_slave_server_control'])) { if ($GLOBALS['sr_slave_action'] == 'reset') { PMA_replication_slave_control("STOP"); PMA_DBI_try_query("RESET SLAVE;"); PMA_replication_slave_control("START"); } else { PMA_replication_slave_control($GLOBALS['sr_slave_action'], $GLOBALS['sr_slave_control_parm']); } $refresh = true; } elseif (isset($GLOBALS['sr_slave_skip_error'])) { $count = 1; if (isset($GLOBALS['sr_skip_errors_count'])) { $count = $GLOBALS['sr_skip_errors_count'] * 1; } PMA_replication_slave_control("STOP"); PMA_DBI_try_query("SET GLOBAL SQL_SLAVE_SKIP_COUNTER = ".$count.";"); PMA_replication_slave_control("START"); } elseif (isset($GLOBALS['sl_sync'])) { // TODO username, host and port could be read from 'show slave status', // when asked for a password this might work in more situations then just after changing master (where the master password is stored in session) $src_link = PMA_replication_connect_to_master($_SESSION['replication']['m_username'], $_SESSION['replication']['m_password'], $_SESSION['replication']['m_hostname'], $_SESSION['replication']['m_port']); $trg_link = null; // using null to indicate the current PMA server $data = PMA_DBI_fetch_result('SHOW MASTER STATUS', null, null, $src_link); // let's find out, which databases are replicated $do_db = array(); $ignore_db = array(); $dblist = array(); if (! empty($data[0]['Binlog_Do_DB'])) { $do_db = explode(',', $data[0]['Binlog_Do_DB']); } if (! empty($data[0]['Binlog_Ignore_DB'])) { $ignore_db = explode(',', $data[0]['Binlog_Ignore_DB']); } $tmp_alldbs = PMA_DBI_query('SHOW DATABASES;', $src_link); while ($tmp_row = PMA_DBI_fetch_row($tmp_alldbs)) { if (PMA_is_system_schema($tmp_row[0])) { continue; } if (count($do_db) == 0) { if (array_search($tmp_row[0], $ignore_db) !== false) { continue; } $dblist[] = $tmp_row[0]; PMA_DBI_query('CREATE DATABASE IF NOT EXISTS '.PMA_backquote($tmp_row[0]), $trg_link); } else { if (array_search($tmp_row[0], $do_db) !== false) { $dblist[] = $tmp_row[0]; PMA_DBI_query('CREATE DATABASE IF NOT EXISTS '.PMA_backquote($tmp_row[0]), $trg_link); } } } // end while unset($do_db, $ignore_db, $data); if (isset($GLOBALS['repl_data'])) { $include_data = true; } else { $include_data = false; } foreach ($dblist as $db) { PMA_replication_synchronize_db($db, $src_link, $trg_link, $include_data); } // TODO some form of user feedback error/success would be nice // What happens if $dblist is empty? // or sync failed? } if ($refresh) { Header("Location: ". PMA_generate_common_url($GLOBALS['url_params'])); } unset($refresh); } /** * Displays the links */ require './libraries/server_links.inc.php'; echo '