2 /* vim: set expandtab sw=4 ts=4 sts=4: */
12 require_once './libraries/common.inc.php';
15 * Does the common work
17 $GLOBALS['js_include'][] = 'server_privileges.js';
18 $GLOBALS['js_include'][] = 'functions.js';
19 $GLOBALS['js_include'][] = 'mootools.js';
20 $GLOBALS['js_include'][] = 'mootools_common.js';
22 require './libraries/server_common.inc.php';
23 require './libraries/replication.inc.php';
24 require './libraries/replication_gui.lib.php';
25 require_once './libraries/server_synchronize.lib.php';
28 * Checks if the user is allowed to do what he tries to...
31 require './libraries/server_links.inc.php';
33 . PMA_getIcon('s_replication.png')
34 . $GLOBALS['strReplication'] . "\n"
36 PMA_Message
::error('strNoPrivileges')->display();
37 require_once './libraries/footer.inc.php';
41 * Handling control requests
44 if (isset($GLOBALS['sr_take_action'])) {
46 if (isset($GLOBALS['slave_changemaster'])) {
47 $_SESSION['replication']['m_username'] = $sr['username'] = PMA_sqlAddslashes($GLOBALS['username']);
48 $_SESSION['replication']['m_password'] = $sr['pma_pw'] = PMA_sqlAddslashes($GLOBALS['pma_pw']);
49 $_SESSION['replication']['m_hostname'] = $sr['hostname'] = PMA_sqlAddslashes($GLOBALS['hostname']);
50 $_SESSION['replication']['m_port'] = $sr['port'] = PMA_sqlAddslashes($GLOBALS['port']);
51 $_SESSION['replication']['m_correct'] = '';
52 $_SESSION['replication']['sr_action_status'] = 'error';
53 $_SESSION['replication']['sr_action_info'] = $strReplicationUnknownError;
54 $url = $sr['hostname'];
56 if ($sr['port'] != '') {
57 $url .= ':' . $sr['port'];
60 // Attempt to connect to the new master server
62 $old_error_reporting = error_reporting(0);
63 $check_master = @mysql_connect
($url, $sr['username'], $sr['pma_pw']);
64 error_reporting($old_error_reporting);
68 $_SESSION['replication']['sr_action_status'] = 'error';
69 $_SESSION['replication']['sr_action_info'] = sprintf($GLOBALS['strReplicationErrorMasterConnect'], $sr['hostname']);
71 $link_to_master = PMA_replication_connect_to_master($sr['username'], $sr['pma_pw'], $sr['hostname'], $sr['port']);
73 // Read the current master position
74 $position = PMA_replication_slave_bin_log_master($link_to_master);
76 if (empty($position)) {
77 $_SESSION['replication']['sr_action_status'] = 'error';
78 $_SESSION['replication']['sr_action_info'] = $GLOBALS['strReplicationErrorGetPosition'];
80 $_SESSION['replication']['m_correct'] = true;
82 if (!PMA_replication_slave_change_master($sr['username'], $sr['pma_pw'], $sr['hostname'], $sr['port'], $position, true, false)) {
83 $_SESSION['replication']['sr_action_status'] = 'error';
84 $_SESSION['replication']['sr_action_info'] = $GLOBALS['strReplicationUnableToChange'];
86 $_SESSION['replication']['sr_action_status'] = 'success';
87 $_SESSION['replication']['sr_action_info'] = sprintf($GLOBALS['strReplicationChangedSuccesfully'], $sr['hostname']);
91 } elseif (isset($GLOBALS['sr_slave_server_control'])) {
92 if ($GLOBALS['sr_slave_action'] == 'reset') {
93 PMA_replication_slave_control("STOP");
94 PMA_DBI_try_query("RESET SLAVE;");
95 PMA_replication_slave_control("START");
97 PMA_replication_slave_control($GLOBALS['sr_slave_action'], $GLOBALS['sr_slave_control_parm']);
101 } elseif (isset($GLOBALS['sr_slave_skip_error'])) {
103 if (isset($GLOBALS['sr_skip_errors_count'])) {
104 $count = $GLOBALS['sr_skip_errors_count'] * 1;
106 PMA_replication_slave_control("STOP");
107 PMA_DBI_try_query("SET GLOBAL SQL_SLAVE_SKIP_COUNTER = ".$count.";");
108 PMA_replication_slave_control("START");
110 } elseif (isset($GLOBALS['sl_sync'])) {
111 // TODO username, host and port could be read from 'show slave status',
112 // when asked for a password this might work in more situations the just after changing master (where the master password is stored in session)
113 $src_link = PMA_replication_connect_to_master($_SESSION['replication']['m_username'], $_SESSION['replication']['m_password'], $_SESSION['replication']['m_hostname'], $_SESSION['replication']['m_port']);
114 $trg_link = null; // using null to indicate the current PMA server
116 $data = PMA_DBI_fetch_result('SHOW MASTER STATUS', null, null, $src_link); // let's find out, which databases are replicated
119 $ignore_db = array();
122 if (!empty($data[0]['Binlog_Do_DB'])) {
123 $do_db = explode(',', $data[0]['Binlog_Do_DB']);
125 if (!empty($data[0]['Binlog_Ignore_DB'])) {
126 $ignore_db = explode(',', $data[0]['Binlog_Ignore_DB']);
129 $tmp_alldbs = PMA_DBI_query('SHOW DATABASES;', $src_link);
130 while ($tmp_row = PMA_DBI_fetch_row($tmp_alldbs)) {
131 if ($tmp_row[0] == 'information_schema') {
134 if (count($do_db) == 0) {
135 if (array_search($tmp_row[0], $ignore_db) !== false) {
138 $dblist[] = $tmp_row[0];
140 PMA_DBI_query('CREATE DATABASE IF NOT EXISTS '.$tmp_row[0], $trg_link);
142 if (array_search($tmp_row[0], $do_db) !== false) {
143 $dblist[] = $tmp_row[0];
144 PMA_DBI_query('CREATE DATABASE IF NOT EXISTS '.$tmp_row[0], $trg_link);
149 unset($do_db, $ignore_db, $data);
151 if (isset($GLOBALS['repl_data'])) {
152 $include_data = true;
154 $include_data = false;
156 foreach ($dblist as $db) {
157 PMA_replication_synchronize_db($db, $src_link, $trg_link, $include_data);
159 // TODO some form of user feedback error/success would be nice
160 // What happens if $dblist is empty?
165 Header("Location: ". PMA_generate_common_url($GLOBALS['url_params']));
172 require './libraries/server_links.inc.php';
174 echo '<div id="replication">'."\n";
176 echo ' <img class="icon" src="'. $GLOBALS['pmaThemeImage'] .'s_replication.png" width="16" height="16" alt="" />'."\n";
177 echo $GLOBALS['strReplication']."\n";
180 // Display error messages
181 if (isset($_SESSION['replication']['sr_action_status']) && isset($_SESSION['replication']['sr_action_info'])) {
182 if ($_SESSION['replication']['sr_action_status'] == 'error') {
183 PMA_Message
::error($_SESSION['replication']['sr_action_info'])->display();
184 $_SESSION['replication']['sr_action_status'] = 'unknown';
185 } elseif ($_SESSION['replication']['sr_action_status'] == 'success') {
186 PMA_Message
::success($_SESSION['replication']['sr_action_info'])->display();
187 $_SESSION['replication']['sr_action_status'] = 'unknown';
191 if ($server_master_status) {
192 if (!isset($GLOBALS['repl_clear_scr'])) {
193 echo PMA_js_mootools_domready($jscode['master_replication']);
194 echo '<fieldset>'."\n";
195 echo '<legend>'. $GLOBALS['strReplicationMaster'] .'</legend>'."\n";
196 echo $GLOBALS['strReplicationConfiguredMaster']."\n";
198 echo ' <li><a href="#" id="master_status_href">'. $GLOBALS['strReplicationShowMasterStatus'] .'</a></li>' . "\n";
199 PMA_replication_print_status_table('master', true, false);
201 echo ' <li><a href="#" id="master_slaves_href">'. $GLOBALS['strReplicationShowConnectedSlaves'] .'</a></li>' . "\n";
202 PMA_replication_print_slaves_table(true);
204 $_url_params = $GLOBALS['url_params'];
205 $_url_params['mr_adduser'] = true;
206 $_url_params['repl_clear_scr'] = true;
208 echo ' <li><a href="'.PMA_generate_common_url($_url_params).'" id="master_addslaveuser_href">'. $GLOBALS['strReplicationAddSlaveUser'] .'</a></li>';
211 // Display 'Add replication slave user' form
212 if (isset($GLOBALS['mr_adduser'])) {
213 PMA_replication_gui_master_addslaveuser();
214 } elseif (!isset($GLOBALS['repl_clear_scr'])) {
216 echo "</fieldset>\n";
218 } elseif (!isset($GLOBALS['mr_configure']) && !isset($GLOBALS['repl_clear_scr'])) {
219 $_url_params = $GLOBALS['url_params'];
220 $_url_params['mr_configure'] = true;
222 echo '<fieldset>'."\n";
223 echo '<legend>'. $GLOBALS['strReplicationMaster'] .'</legend>'."\n";
224 echo sprintf($GLOBALS['strReplicationServernConfiguredMaster'], PMA_generate_common_url($_url_params)) ."\n";
225 echo '</fieldset>'."\n";
228 if (isset($GLOBALS['mr_configure'])) {
229 // Render the 'Master configuration' section
230 echo PMA_js_mootools_domready($jscode['configure_master']);
231 echo '<fieldset>'."\n";
232 echo '<legend>'. $GLOBALS['strReplicationMasterConfiguration'] .'</legend>'."\n";
233 echo $GLOBALS['strReplicationMasterChooseMode'].'<br /><br />'."\n";
235 echo '<select name="db_type" id="db_type">'."\n";
236 echo '<option value="all">'. $GLOBALS['strReplicationMasterChooseAll'] .'</option>'."\n";
237 echo '<option value="ign">'. $GLOBALS['strReplicationMasterChooseIgn'] .'</option>'."\n";
238 echo '</select>'."\n";
239 echo '<br /><br />'."\n";
240 echo $GLOBALS['strReplicationSelectDatabases'].'<br />'."\n";
241 echo PMA_replication_db_multibox();
242 echo '<br /><br />'."\n";
243 echo $GLOBALS['strReplicationAddLines'].'<br />'."\n";
244 echo '<pre><div id="rep">server-id='. $serverid .'<br />log-bin=mysql-bin<br />log-error=mysql-bin.err<br /></div></pre>'."\n";
245 echo $GLOBALS['strReplicationRestartServer'] ."\n";
246 echo '</fieldset>'."\n";
247 echo '<fieldset class="tblFooters">';
248 echo ' <form autocomplete="off" method="post" action="server_replication.php" >'."\n";
249 echo PMA_generate_common_hidden_inputs('', '');
250 echo ' <input type="submit" value="' . $GLOBALS['strGo'] . '" id="goButton" />';
251 echo ' </form>'."\n";
254 require_once './libraries/footer.inc.php';
260 if (!isset($GLOBALS['repl_clear_scr'])) {
261 // Render the 'Slave configuration' section
262 echo '<fieldset>'."\n";
263 echo '<legend>' . $GLOBALS['strReplicationSlave'] . '</legend>'."\n";
264 if ($server_slave_status) {
265 echo PMA_js_mootools_domready($jscode['slave_control']);
266 echo '<div id="slave_configuration_gui">'."\n";
268 $_url_params = $GLOBALS['url_params'];
269 $_url_params['sr_take_action'] = true;
270 $_url_params['sr_slave_server_control'] = true;
272 if ($server_slave_replication[0]['Slave_IO_Running'] == 'No') {
273 $_url_params['sr_slave_action'] = 'start';
275 $_url_params['sr_slave_action'] = 'stop';
278 $_url_params['sr_slave_control_parm'] = 'IO_THREAD';
279 $slave_control_io_link = PMA_generate_common_url($_url_params);
281 if ($server_slave_replication[0]['Slave_SQL_Running'] == 'No') {
282 $_url_params['sr_slave_action'] = 'start';
284 $_url_params['sr_slave_action'] = 'stop';
287 $_url_params['sr_slave_control_parm'] = 'SQL_THREAD';
288 $slave_control_sql_link = PMA_generate_common_url($_url_params);
290 if ($server_slave_replication[0]['Slave_IO_Running'] == 'No'
291 ||
$server_slave_replication[0]['Slave_SQL_Running'] == 'No'
293 $_url_params['sr_slave_action'] = 'start';
295 $_url_params['sr_slave_action'] = 'stop';
298 $_url_params['sr_slave_control_parm'] = null;
299 $slave_control_full_link = PMA_generate_common_url($_url_params);
301 $_url_params['sr_slave_action'] = 'reset';
302 $slave_control_reset_link = PMA_generate_common_url($_url_params);
304 $_url_params = $GLOBALS['url_params'];
305 $_url_params['sr_slave_skip_error'] = true;
306 $slave_skip_error_link = PMA_generate_common_url($_url_params);
308 if ($server_slave_replication[0]['Slave_SQL_Running'] == 'No')
309 PMA_Message
::warning('Slave SQL Thread not running!')->display();
310 if ($server_slave_replication[0]['Slave_IO_Running'] == 'No')
311 PMA_Message
::warning('Slave IO Thread not running!')->display();
313 $_url_params = $GLOBALS['url_params'];
314 $_url_params['sl_configure'] = true;
315 $_url_params['repl_clear_scr'] = true;
317 $reconfiguremaster_link = PMA_generate_common_url($_url_params);
319 echo $GLOBALS['strReplicationSlaveConfigured']."\n";
322 echo ' <li><a href="#" id="slave_status_href">'. $GLOBALS['strReplicationSlaveSeeStatus'].'</a></li>'."\n";
323 echo PMA_replication_print_status_table('slave', true, false);
324 if (isset($_SESSION['replication']['m_correct']) && $_SESSION['replication']['m_correct'] == true) {
325 echo PMA_js_mootools_domready($jscode['slave_control_sync']);
326 echo ' <li><a href="#" id="slave_synchronization_href">'.$GLOBALS['strReplicationSynchronize'].'</a></li>'."\n";
327 echo ' <div id="slave_synchronization_gui" style="display: none">'."\n";
328 echo ' <form method="post" action="server_replication.php">'."\n";
329 echo PMA_generate_common_hidden_inputs('', '');
330 echo ' <input type="checkbox" name="repl_struc" value="1" checked disabled /> '. $GLOBALS['strStructure']. '<br />'."\n"; // this is just for vizualization, it has no other purpose
331 echo ' <input type="checkbox" name="repl_data" value="1" checked /> '. $GLOBALS['strData'] .' <br />'."\n";
332 echo ' <input type="hidden" name="sr_take_action" value="1" />'."\n";
333 echo ' <input type="submit" name="sl_sync" value="'. $GLOBALS['strGo'] .'" />'."\n";
334 echo ' </form>'."\n";
337 echo ' <li><a href="#" id="slave_control_href">'. $GLOBALS['strReplicationControlSlave'] .'</a>'."\n";
338 echo ' <div id="slave_control_gui" style="display: none">'."\n";
340 echo ' <li><a href="'. $slave_control_full_link .'">'. (($server_slave_replication[0]['Slave_IO_Running'] == 'No' ||
$server_slave_replication[0]['Slave_SQL_Running'] == 'No') ?
$GLOBALS['strFullStart'] : $GLOBALS['strFullStop']). ' </a></li>'."\n";
341 echo ' <li><a href="'. $slave_control_reset_link .'">'. $GLOBALS['strReplicationSlaveReset'] .'</a></li>'."\n";
342 echo ' <li><a href="'. $slave_control_sql_link .'">'. sprintf($GLOBALS['strReplicationSlaveSQLThread'], ($server_slave_replication[0]['Slave_SQL_Running'] == 'No' ?
$GLOBALS['strStart'] : $GLOBALS['strStop'])) .'</a></li>'."\n";
343 echo ' <li><a href="'. $slave_control_io_link .'">'. sprintf($GLOBALS['strReplicationSlaveIOThread'], ($server_slave_replication[0]['Slave_IO_Running'] == 'No' ?
$GLOBALS['strStart'] : $GLOBALS['strStop'])) .'</a></li>'."\n";
347 echo ' <li><a href="#" id="slave_errormanagement_href">'. $GLOBALS['strReplicationSlaveErrorManagement'] .'</a>'."\n";
348 echo ' <div id="slave_errormanagement_gui" style="display: none">'."\n";
349 PMA_Message
::warning($GLOBALS['strReplicationSkippingErrorWarn'])->display();
351 echo ' <li><a href="'. $slave_skip_error_link .'">'. $GLOBALS['strReplicationSlaveSkipCurrentError'] .'</a></li>'."\n";
352 echo ' <li>'.$GLOBALS['strReplicationSlaveSkipNext']."\n";
353 echo ' <form method="post" action="server_replication.php">'."\n";
354 echo PMA_generate_common_hidden_inputs('', '');
355 echo ' <input type="text" name="sr_skip_errors_count" value="1" style="width: 30px" />'.$GLOBALS['strReplicationSlaveSkipNextErrors']."\n";
356 echo ' <input type="submit" name="sr_slave_skip_error" value="'. $GLOBALS['strGo'] .'" />'."\n";
357 echo ' <input type="hidden" name="sr_take_action" value="1" />'."\n";
358 echo ' </form></li>'."\n";
362 echo ' <li><a href="'. $reconfiguremaster_link .'">'.$GLOBALS['strReplicationSlaveChangeMaster'].'</a></li>'."\n";
365 } elseif (!isset($GLOBALS['sl_configure'])) {
366 $_url_params = $GLOBALS['url_params'];
367 $_url_params['sl_configure'] = true;
368 $_url_params['repl_clear_scr'] = true;
370 echo sprintf($GLOBALS['strReplicationSlaveNotConfigured'], PMA_generate_common_url($_url_params))."\n";
373 echo '</fieldset>'."\n";
375 if (isset($GLOBALS['sl_configure'])) {
376 PMA_replication_gui_changemaster("slave_changemaster");
378 require_once './libraries/footer.inc.php';