diff options
Diffstat (limited to 'hugo/libraries/replication_gui.lib.php')
| -rw-r--r-- | hugo/libraries/replication_gui.lib.php | 401 |
1 files changed, 401 insertions, 0 deletions
diff --git a/hugo/libraries/replication_gui.lib.php b/hugo/libraries/replication_gui.lib.php new file mode 100644 index 0000000..3743f39 --- /dev/null +++ b/hugo/libraries/replication_gui.lib.php @@ -0,0 +1,401 @@ +<?php +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * + * @package PhpMyAdmin + */ +if (! defined('PHPMYADMIN')) { + exit; +} + +/** + * returns code for selecting databases + * + * @return String HTML code + */ +function PMA_replication_db_multibox() +{ + $multi_values = ''; + $multi_values .= '<select name="db_select[]" size="6" multiple="multiple" id="db_select">'; + + foreach ($GLOBALS['pma']->databases as $current_db) { + if (PMA_is_system_schema($current_db)) { + continue; + } + if (! empty($selectall) || (isset($tmp_select) && strpos(' ' . $tmp_select, '|' . $current_db . '|'))) { + $is_selected = ' selected="selected"'; + } else { + $is_selected = ''; + } + $current_db = htmlspecialchars($current_db); + $multi_values .= ' <option value="' . $current_db . '" ' . $is_selected . '>' . $current_db . '</option>'; + } // end while + + $multi_values .= '</select>'; + $multi_values .= '<br /><a href="#" id="db_reset_href">' . __('Uncheck All') . '</a>'; + + return $multi_values; +} + +/** + * prints out code for changing master + * + * @param String $submitname - submit button name + * + * @return void + */ + +function PMA_replication_gui_changemaster($submitname) +{ + + list($username_length, $hostname_length) = PMA_replication_get_username_hostname_length(); + + echo '<form method="post" action="server_replication.php">'; + echo PMA_generate_common_hidden_inputs('', ''); + echo ' <fieldset id="fieldset_add_user_login">'; + echo ' <legend>' . __('Slave configuration') . ' - ' . __('Change or reconfigure master server') . '</legend>'; + echo __('Make sure, you have unique server-id in your configuration file (my.cnf). If not, please add the following line into [mysqld] section:') . '<br />'; + echo '<pre>server-id=' . time() . '</pre>'; + echo ' <div class="item">'; + echo ' <label for="text_username">' . __('User name') . ':</label>'; + echo ' <input type="text" name="username" id="text_username" maxlength="'. $username_length . '" title="' . __('User name') . '" />'; + echo ' </div>'; + echo ' <div class="item">'; + echo ' <label for="text_pma_pw">' . __('Password') .' :</label>'; + echo ' <input type="password" id="text_pma_pw" name="pma_pw" title="' . __('Password') . '" />'; + echo ' </div>'; + echo ' <div class="item">'; + echo ' <label for="text_hostname">' . __('Host') . ' :</label>'; + echo ' <input type="text" id="text_hostname" name="hostname" maxlength="' . $hostname_length . '" value="" />'; + echo ' </div>'; + echo ' <div class="item">'; + echo ' <label for="text_port">' . __('Port') . ':</label>'; + echo ' <input type="text" id="text_port" name="port" maxlength="6" value="3306" />'; + echo ' </div>'; + echo ' </fieldset>'; + echo ' <fieldset id="fieldset_user_privtable_footer" class="tblFooters">'; + echo ' <input type="hidden" name="sr_take_action" value="true" />'; + echo ' <input type="hidden" name="' . $submitname . '" value="1" />'; + echo ' <input type="submit" id="confslave_submit" value="' . __('Go') . '" />'; + echo ' </fieldset>'; + echo '</form>'; +} + +/** + * This function prints out table with replication status. + * + * @param string $type either master or slave + * @param boolean $hidden if true, then default style is set to hidden, default value false + * @param boolen $title if true, then title is displayed, default true + * + * @return void + */ +function PMA_replication_print_status_table($type, $hidden = false, $title = true) +{ + global ${"{$type}_variables"}; + global ${"{$type}_variables_alerts"}; + global ${"{$type}_variables_oks"}; + global ${"server_{$type}_replication"}; + global ${"strReplicationStatus_{$type}"}; + + // TODO check the Masters server id? + // seems to default to '1' when queried via SHOW VARIABLES , but resulted in error on the master when slave connects + // [ERROR] Error reading packet from server: Misconfigured master - server id was not set ( server_errno=1236) + // [ERROR] Got fatal error 1236: 'Misconfigured master - server id was not set' from master when reading data from binary log + // + //$server_id = PMA_DBI_fetch_value("SHOW VARIABLES LIKE 'server_id'", 0, 1); + + echo '<div id="replication_' . $type . '_section" style="' . ($hidden ? 'display: none;' : '') . '"> '; + + if ($title) { + if ($type == 'master') { + echo '<h4><a name="replication_' . $type . '"></a>' . __('Master status') . '</h4>'; + } else { + echo '<h4><a name="replication_' . $type . '"></a>' . __('Slave status') . '</h4>'; + } + } else { + echo '<br />'; + } + + echo ' <table id="server' . $type . 'replicationsummary" class="data"> '; + echo ' <thead>'; + echo ' <tr>'; + echo ' <th>' . __('Variable') . '</th>'; + echo ' <th>' . __('Value') . '</th>'; + echo ' </tr>'; + echo ' </thead>'; + echo ' <tbody>'; + + $odd_row = true; + foreach (${"{$type}_variables"} as $variable) { + echo ' <tr class="' . ($odd_row ? 'odd' : 'even') . '">'; + echo ' <td class="name">'; + echo $variable; + echo ' </td>'; + echo ' <td class="value">'; + + + // TODO change to regexp or something, to allow for negative match + if (isset(${"{$type}_variables_alerts"}[$variable]) + && ${"{$type}_variables_alerts"}[$variable] == ${"server_{$type}_replication"}[0][$variable] + ) { + echo '<span class="attention">'; + + } elseif (isset(${"{$type}_variables_oks"}[$variable]) + && ${"{$type}_variables_oks"}[$variable] == ${"server_{$type}_replication"}[0][$variable] + ) { + echo '<span class="allfine">'; + } else { + echo '<span>'; + } + // allow wrapping long table lists into multiple lines + static $variables_wrap = array( + 'Replicate_Do_DB', 'Replicate_Ignore_DB', + 'Replicate_Do_Table', 'Replicate_Ignore_Table', + 'Replicate_Wild_Do_Table', 'Replicate_Wild_Ignore_Table'); + if (in_array($variable, $variables_wrap)) { + echo str_replace(',', ', ', ${"server_{$type}_replication"}[0][$variable]); + } else { + echo ${"server_{$type}_replication"}[0][$variable]; + } + echo '</span>'; + + echo ' </td>'; + echo ' </tr>'; + + $odd_row = ! $odd_row; + } + + echo ' </tbody>'; + echo ' </table>'; + echo ' <br />'; + echo '</div>'; + +} + +/** + * Prints table with slave users connected to this master + * + * @param boolean $hidden - if true, then default style is set to hidden, default value false + * + * @return void + */ +function PMA_replication_print_slaves_table($hidden = false) +{ + + // Fetch data + $data = PMA_DBI_fetch_result('SHOW SLAVE HOSTS', null, null); + + echo ' <br />'; + echo ' <div id="replication_slaves_section" style="' . ($hidden ? 'display: none;' : '') . '"> '; + echo ' <table class="data">'; + echo ' <thead>'; + echo ' <tr>'; + echo ' <th>' . __('Server ID') . '</th>'; + echo ' <th>' . __('Host') . '</th>'; + echo ' </tr>'; + echo ' </thead>'; + echo ' <tbody>'; + + $odd_row = true; + foreach ($data as $slave) { + echo ' <tr class="' . ($odd_row ? 'odd' : 'even') . '">'; + echo ' <td class="value">' . $slave['Server_id'] . '</td>'; + echo ' <td class="value">' . $slave['Host'] . '</td>'; + echo ' </tr>'; + + $odd_row = ! $odd_row; + } + + echo ' </tbody>'; + echo ' </table>'; + echo ' <br />'; + PMA_Message::notice(__('Only slaves started with the --report-host=host_name option are visible in this list.'))->display(); + echo ' <br />'; + echo ' </div>'; +} + +/** + * get the correct username and hostname lengths for this MySQL server + * + * @return array username length, hostname length + */ + +function PMA_replication_get_username_hostname_length() +{ + $fields_info = PMA_DBI_get_columns('mysql', 'user'); + $username_length = 16; + $hostname_length = 41; + foreach ($fields_info as $val) { + if ($val['Field'] == 'User') { + strtok($val['Type'], '()'); + $v = strtok('()'); + if (is_int($v)) { + $username_length = $v; + } + } elseif ($val['Field'] == 'Host') { + strtok($val['Type'], '()'); + $v = strtok('()'); + if (is_int($v)) { + $hostname_length = $v; + } + } + } + return array($username_length, $hostname_length); +} + +/** + * Print code to add a replication slave user to the master + * + * @return void + */ +function PMA_replication_gui_master_addslaveuser() +{ + + list($username_length, $hostname_length) = PMA_replication_get_username_hostname_length(); + + if (isset($GLOBALS['username']) && strlen($GLOBALS['username']) === 0) { + $GLOBALS['pred_username'] = 'any'; + } + echo '<div id="master_addslaveuser_gui">'; + echo '<form autocomplete="off" method="post" action="server_privileges.php" onsubmit="return checkAddUser(this);">'; + echo PMA_generate_common_hidden_inputs('', ''); + echo '<fieldset id="fieldset_add_user_login">' + . '<legend>'.__('Add slave replication user').'</legend>' + . '<input type="hidden" name="grant_count" value="25" />' + . '<input type="hidden" name="createdb" id="createdb_0" value="0" />' + . '<input id="checkbox_Repl_slave_priv" type="hidden" title="Needed for the replication slaves." value="Y" name="Repl_slave_priv"/>' + . '<input id="checkbox_Repl_client_priv" type="hidden" title="Needed for the replication slaves." value="Y" name="Repl_client_priv"/>' + . '' + . '<input type="hidden" name="sr_take_action" value="true" />' + . '<div class="item">' + . '<label for="select_pred_username">' + . ' ' . __('User name') . ':' + . '</label>' + . '<span class="options">' + . ' <select name="pred_username" id="select_pred_username" title="' . __('User name') . '"' + . ' onchange="if (this.value == \'any\') { username.value = \'\'; } else if (this.value == \'userdefined\') { username.focus(); username.select(); }">' + . ' <option value="any"' . ((isset($GLOBALS['pred_username']) && $GLOBALS['pred_username'] == 'any') ? ' selected="selected"' : '') . '>' . __('Any user') . '</option>' + . ' <option value="userdefined"' . ((! isset($GLOBALS['pred_username']) || $GLOBALS['pred_username'] == 'userdefined') ? ' selected="selected"' : '') . '>' . __('Use text field') . ':</option>' + . ' </select>' + . '</span>' + . '<input type="text" name="username" maxlength="' + . $username_length . '" title="' . __('User name') . '"' + . (empty($GLOBALS['username']) + ? '' + : ' value="' . (isset($GLOBALS['new_username']) + ? $GLOBALS['new_username'] + : $GLOBALS['username']) . '"') + . ' onchange="pred_username.value = \'userdefined\';" />' + . '</div>' + . '<div class="item">' + . '<label for="select_pred_hostname">' + . ' ' . __('Host') . ':' + . '</label>' + . '<span class="options">' + . ' <select name="pred_hostname" id="select_pred_hostname" title="' . __('Host') . '"'; + $_current_user = PMA_DBI_fetch_value('SELECT USER();'); + if (! empty($_current_user)) { + $thishost = str_replace("'", '', substr($_current_user, (strrpos($_current_user, '@') + 1))); + if ($thishost == 'localhost' || $thishost == '127.0.0.1') { + unset($thishost); + } + } + echo ' onchange="if (this.value == \'any\') { hostname.value = \'%\'; } else if (this.value == \'localhost\') { hostname.value = \'localhost\'; } ' + . (empty($thishost) ? '' : 'else if (this.value == \'thishost\') { hostname.value = \'' . addslashes(htmlspecialchars($thishost)) . '\'; } ') + . 'else if (this.value == \'hosttable\') { hostname.value = \'\'; } else if (this.value == \'userdefined\') { hostname.focus(); hostname.select(); }">' . "\n"; + unset($_current_user); + + // when we start editing a user, $GLOBALS['pred_hostname'] is not defined + if (! isset($GLOBALS['pred_hostname']) && isset($GLOBALS['hostname'])) { + switch (strtolower($GLOBALS['hostname'])) { + case 'localhost': + case '127.0.0.1': + $GLOBALS['pred_hostname'] = 'localhost'; + break; + case '%': + $GLOBALS['pred_hostname'] = 'any'; + break; + default: + $GLOBALS['pred_hostname'] = 'userdefined'; + break; + } + } + echo ' <option value="any"' + . ((isset($GLOBALS['pred_hostname']) && $GLOBALS['pred_hostname'] == 'any') + ? ' selected="selected"' : '') . '>' . __('Any host') + . '</option>' + . ' <option value="localhost"' + . ((isset($GLOBALS['pred_hostname']) && $GLOBALS['pred_hostname'] == 'localhost') + ? ' selected="selected"' : '') . '>' . __('Local') + . '</option>'; + + if (!empty($thishost)) { + echo ' <option value="thishost"' + . ((isset($GLOBALS['pred_hostname']) && $GLOBALS['pred_hostname'] == 'thishost') + ? ' selected="selected"' : '') . '>' . __('This Host') + . '</option>'; + } + unset($thishost); + echo ' <option value="hosttable"' + . ((isset($GLOBALS['pred_hostname']) && $GLOBALS['pred_hostname'] == 'hosttable') + ? ' selected="selected"' : '') . '>' . __('Use Host Table') + . '</option>' + . ' <option value="userdefined"' + . ((isset($GLOBALS['pred_hostname']) && $GLOBALS['pred_hostname'] == 'userdefined') + ? ' selected="selected"' : '') + . '>' . __('Use text field') . ':</option>' + . ' </select>' + . '</span>' + . '<input type="text" name="hostname" maxlength="' + . $hostname_length . '" value="' + . (isset($GLOBALS['hostname']) ? $GLOBALS['hostname'] : '') + . '" title="' . __('Host') + . '" onchange="pred_hostname.value = \'userdefined\';" />' + . PMA_Util::showHint( + __('When Host table is used, this field is ignored and values stored in Host table are used instead.') + ) + . '</div>' + . '<div class="item">' + . '<label for="select_pred_password">' + . ' ' . __('Password') . ':' + . '</label>' + . '<span class="options">' + . ' <select name="pred_password" id="select_pred_password" title="' + . __('Password') . '"' + . ' onchange="if (this.value == \'none\') { pma_pw.value = \'\'; pma_pw2.value = \'\'; } else if (this.value == \'userdefined\') { pma_pw.focus(); pma_pw.select(); }">' + . ' <option value="none"'; + if (isset($GLOBALS['username'])) { + echo ' selected="selected"'; + } + echo '>' . __('No Password') . '</option>' + . ' <option value="userdefined"' . (isset($GLOBALS['username']) ? '' : ' selected="selected"') . '>' . __('Use text field') . ':</option>' + . ' </select>' + . '</span>' + . '<input type="password" id="text_pma_pw" name="pma_pw" title="' . __('Password') . '" onchange="pred_password.value = \'userdefined\';" />' + . '</div>' + . '<div class="item">' + . '<label for="text_pma_pw2">' + . ' ' . __('Re-type') . ':' + . '</label>' + . '<span class="options"> </span>' + . '<input type="password" name="pma_pw2" id="text_pma_pw2" title="' . __('Re-type') . '" onchange="pred_password.value = \'userdefined\';" />' + . '</div>' + . '<div class="item">' + . '<label for="button_generate_password">' + . ' ' . __('Generate Password') . ':' + . '</label>' + . '<span class="options">' + . ' <input type="button" class="button" id="button_generate_password" value="' . __('Generate') . '" onclick="suggestPassword(this.form)" />' + . '</span>' + . '<input type="text" name="generated_pw" id="generated_pw" />' + . '</div>' + . '</fieldset>'; + echo '<fieldset id="fieldset_user_privtable_footer" class="tblFooters">' + . ' <input type="hidden" name="adduser_submit" value="1" />' + . ' <input type="submit" id="adduser_submit" value="' . __('Go') . '" />' + . '</fieldset>'; + echo '</form>'; + echo '</div>'; +} +?> |
