$MAX_VALUE = PHP_INT_MAX;
+// node status in "pcp_node_info" result
+define('NODE_ACTIVE_NO_CONNECT', 1);
+define('NODE_ACTIVE_CONNECTED', 2);
+define('NODE_DOWN', 3);
+
if (!isset($_SESSION[SESSION_LOGIN_USER])) {
exit();
}
+// cout nodes
$ret = execPcp('PCP_NODE_COUNT');
if (!array_key_exists('SUCCESS', $ret)) {
$errorCode = 'e1002';
$tpl->assign('nodeCount', $nodeCount);
-$isParallelMode = isParallelMode();
-$isReplicationMode = isReplicationMode();
-$isMasterSlaveMode = isMasterSlaveMode();
-
$nodeInfo = array();
$node_alive = FALSE;
-for ($i = 0; $i<$nodeCount; $i++) {
+// get nodes' status
+for ($i = 0; $i < $nodeCount; $i++) {
+ // execute "pcp_node_info" command
+ // ex) host1 5432 1 1073741823.500000
$ret = execPcp('PCP_NODE_INFO', $i);
+
if (!array_key_exists('SUCCESS', $ret)) {
$errorCode = 'e1003';
$tpl->assign('errorCode', $errorCode);
}
$nodeInfo[$i] = explode(" ", $ret);
+
+ // load balance weight: normalize format
$nodeInfo[$i][3] = sprintf('%.3f', $nodeInfo[$i][3]);
- /* node is active? */
- if ($nodeInfo[$i][2] != 3) {
+ // node is active?
+ if ($nodeInfo[$i][2] != NODE_DOWN) {
$node_alive = TRUE;
}
}
+// select buttons to each nodes depending on their status
+$isParallelMode = isParallelMode();
+$isReplicationMode = isReplicationMode();
+$isMasterSlaveMode = isMasterSlaveMode();
+
for ($i = 0; $i < $nodeCount; $i++) {
if ($node_alive == FALSE) {
if (($isReplicationMode || $isMasterSlaveMode) && NodeActive($i)) {
array_push($nodeInfo[$i], 'none');
}
- } elseif( $isParallelMode ) {
+ } elseif ($isParallelMode ) {
array_push($nodeInfo[$i], 'none');
} else {
switch($nodeInfo[$i][2]) {
- case 1:
- case 2:
+ case NODE_ACTIVE_NO_CONNECT:
+ case NODE_ACTIVE_CONNECTED:
if ($isReplicationMode || $isMasterSlaveMode) {
array_push($nodeInfo[$i], 'disconnect');
} else {
array_push($nodeInfo[$i], 'none');
}
+ if (useStreaming()) {
+ array_push($nodeInfo[$i], 'promote');
+ }
break;
- case 3:
+ case NODE_DOWN:
if ($isReplicationMode || $isMasterSlaveMode) {
if (NodeActive($i)) {
array_push($nodeInfo[$i], 'return');
}
}
- $nodeInfo[$i][5] = NodeStandby($i);
+ // result of "SELECT pg_is_in_recovery()" as integer(0, 1, -1)
+ // (If pgpool don't act in Master/Slave & SR mode, this value will be ignored.)
+ $nodeInfo[$i][6] = NodeStandby($i);
}
-$tpl->assign('refreshTime', _PGPOOL2_STATUS_REFRESH_TIME*1000);
+$tpl->assign('refreshTime', _PGPOOL2_STATUS_REFRESH_TIME * 1000);
$tpl->assign('nodeInfo', $nodeInfo);
$tpl->assign('parallelMode', $isParallelMode);
$tpl->assign('msgStopPgpool', $message['msgStopPgpool']);
/**
* Set pgpool command option
*/
-
$tpl->assign('c', _PGPOOL2_CMD_OPTION_C);
$tpl->assign('D', _PGPOOL2_CMD_OPTION_LARGE_D);
$tpl->assign('d', _PGPOOL2_CMD_OPTION_D);
}
switch ($action) {
+
+ /* --------------------------------------------------------------------- */
+ /* start */
+ /* --------------------------------------------------------------------- */
+
case 'start':
$args = ' ';
$tpl->assign('pgpoolMessage', $ret);
} else {
for ($i = 0; $i < 10; $i++) {
- if(DoesPgpoolPidExist()) {
+ if (DoesPgpoolPidExist()) {
break;
} else {
sleep(1);
break;
+ /* --------------------------------------------------------------------- */
+ /* stop */
+ /* --------------------------------------------------------------------- */
+
case 'stop':
$m = $_POST['stop_mode'];
break;
+ /* --------------------------------------------------------------------- */
+ /* restart */
+ /* --------------------------------------------------------------------- */
+
case 'restart':
/**
* Stop pgpool
exit();
} else {
- for($i = 0; $i < 10; $i++) {
+ for ($i = 0; $i < 10; $i++) {
if (DoesPgpoolPidExist()) {
sleep(1);
} else {
}
break;
+ /* --------------------------------------------------------------------- */
+ /* other */
+ /* --------------------------------------------------------------------- */
+
case 'reload':
- /**
- * reload pgpool
- */
$args = ' ';
$ret = execPcp('PCP_RELOAD_PGPOOL', $args);
break;
-
case 'return':
$ret = execPcp('PCP_ATTACH_NODE', $nodeNumber);
if (!array_key_exists('SUCCESS', $ret)) {
}
break;
-
case 'detach':
$ret = execPcp('PCP_DETACH_NODE', $nodeNumber);
if (!array_key_exists('SUCCESS', $ret)) {
}
break;
+ case 'promote':
+ $ret = execPcp('PCP_PROMOTE_NODE', $nodeNumber);
+ if (!array_key_exists('SUCCESS', $ret)) {
+ $errorCode = 'e1007';
+ $tpl->assign('errorCode', $errorCode);
+ $tpl->display('error.tpl');
+ exit();
+ }
+ break;
+
case 'summary':
$viewPHP = 'innerSummary.php';
break;
$tpl->assign('pgpoolIsActive', FALSE);
}
-$tpl->assign('viewPHP', $viewPHP);
-
if (_PGPOOL2_STATUS_REFRESH_TIME >= 0 ) {
$refreshTime = _PGPOOL2_STATUS_REFRESH_TIME * 1000;
}
+$tpl->assign('viewPHP', $viewPHP);
$tpl->assign('pgpoolConf', _PGPOOL2_CONFIG_FILE);
$tpl->assign('pcpConf', _PGPOOL2_PASSWORD_FILE);
$tpl->assign('refreshTime', $refreshTime);
+$tpl->assign('useSyslog', useSyslog());
$tpl->assign('msgStopPgpool', $message['msgStopPgpool']);
$tpl->display('status.tpl');
<!--
var strConnError = "{$message.strConnectionError|escape}";
-var strUp = "{$message.strUp|escape}";
-var strDown = "{$message.strDown|escape}";
+var strUp = "{$message.strUp|escape}";
+var strDown = "{$message.strDown|escape}";
var strDataError = "{$message.strDataError|escape}";
-var refreshTime = "{$refreshTime|escape}";
-var view = "{$viewPHP|escape}";
-var msgStopPgpool = "{$message.msgStopPgpool|escape}";
+var refreshTime = "{$refreshTime|escape}";
+var view = "{$viewPHP|escape}";
+var msgStopPgpool = "{$message.msgStopPgpool|escape}";
var msgRestartPgpool = "{$message.msgRestartPgpool|escape}";
-var msgReloadPgpool = "{$message.msgReloadPgpool|escape}";
+var msgReloadPgpool = "{$message.msgReloadPgpool|escape}";
{literal}
+
function load() {
- var xmlhttp = false;
+ var xmlhttp = false;
- if (typeof XMLHttpRequest!='undefined')
+ if (typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
- else
+ } else {
xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
+ }
if (!xmlhttp) {
alert('Sorry, cannot use XMLHttpRequest');
xmlhttp.send("");
}
+/* --------------------------------------------------------------------- */
+
function reload() {
var xmlhttp = false;
- if (typeof XMLHttpRequest!='undefined')
+ if (typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
- else
- xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
+ } else {
+ xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
+ }
if (!xmlhttp) {
alert('Sorry, cannot use XMLHttpRequest');
xmlhttp.send("");
}
+/* --------------------------------------------------------------------- */
+
function timer(interval) {
- setTimeout("reload()",interval);
+ setTimeout("reload()",interval);
}
function sendCommand(command, nodeNumber, message){
}
}
+/* --------------------------------------------------------------------- */
+/* buttons */
+/* --------------------------------------------------------------------- */
+
function startPgpool() {
document.Command.action.value= "start";
document.Command.submit();
stopOption.style.visibility = "visible";
stopOption.style.position = "";
stopOption.style.height = "";
+
var cmdBtn = document.getElementById('cmdBtn');
cmdBtn.style.visibility = "hidden";
cmdBtn.style.position = "absolute";
stopOption.style.visibility = "hidden";
stopOption.style.position = "absolute";
stopOption.style.height = "0";
+
var restartOption = document.getElementById('restartOption');
restartOption.style.visibility = "visible";
restartOption.style.position = "";
restartOption.style.height = "";
+
var cmdBtn = document.getElementById('cmdBtn');
cmdBtn.style.visibility = "hidden";
cmdBtn.style.position = "absolute";
stopOption.style.visibility = "hidden";
stopOption.style.position = "absolute";
stopOption.style.height = "0";
+
var restartOption = document.getElementById('restartOption');
restartOption.style.visibility = "hidden";
restartOption.style.position = "absolute";
restartOption.style.height = "0";
+
var cmdBtn = document.getElementById('cmdBtn');
cmdBtn.style.visibility = "visible";
cmdBtn.style.position = "";
cmdBtn.style.height = "";
}
+/* --------------------------------------------------------------------- */
+/* execute */
+/* --------------------------------------------------------------------- */
+
function execRestartPgpool() {
- if(window.confirm(msgRestartPgpool)){
+ if (window.confirm(msgRestartPgpool)){
document.Command.action.value= "restart";
document.Command.submit();
}
}
function execReloadPgpool() {
- if(window.confirm(msgReloadPgpool)){
+ if (window.confirm(msgReloadPgpool)){
document.Command.action.value= "reload";
document.Command.submit();
}
}
function execStopPgpool() {
- if(window.confirm(msgStopPgpool)){
+ if (window.confirm(msgStopPgpool)){
document.Command.action.value= "stop";
document.Command.submit();
}
</script>
{/literal}
</head>
+
<body onload="load()">
<div id="header">
<h1><img src="images/logo.gif" alt="pgpoolAdmin" /></h1>
</div>
+
<div id="menu">
{include file="menu.tpl"}
</div>
<div id="content">
<div id="help"><a href="help.php?help={$help|escape}"><img src="images/question.gif" alt="help"/>{$message.strHelp|escape}</a></div>
+
<form action="status.php" name="Command" method="post">
<input type="hidden" name="action" value="" />
<input type="hidden" name="nodeNumber" value="" />
+
+{* --------------------------------------------------------------------- *}
+{* Status Info Buttons *}
+{* --------------------------------------------------------------------- *}
+
<h2>{$message.strPgpoolStatus|escape}</h2>
+
{if $pgpoolIsActive == true}
<p>
<input type="button" name="command" onclick="changeView('summary')" value="{$message.strPgpoolSummary|escape}" />
<input type="button" name="command" onclick="changeView('proc')" value="{$message.strProcInfo|escape}" />
<input type="button" name="command" onclick="changeView('node')" value="{$message.strNodeInfo|escape}" />
- {if $n == 1 && $pipe == 0}
+ {if $useSyslog == FALSE && $n == 1 && $pipe == 0}
<input type="button" name="command" onclick="changeView('log')" value="{$message.strLog|escape}" />
{/if}
-</p>
+</p>
<div id="status"></div>
<p>
<input type="button" name="command" onclick="changeView('summary')" value="{$message.strPgpoolSummary|escape}" />
<input type="button" name="command" onclick="changeView('proc')" value="{$message.strProcInfo|escape}" />
<input type="button" name="command" onclick="changeView('node')" value="{$message.strNodeInfo|escape}" />
- {if $n == 1 && $pipe == 0}
+ {if $useSyslog == FALSE && $n == 1 && $pipe == 0}
<input type="button" name="command" onclick="changeView('log')" value="{$message.strLog|escape}" />
{/if}
</p>
{else}
{$message.strStopPgpool|escape}
{/if}
+
+{* --------------------------------------------------------------------- *}
+
<h2>{$message.strPgpool|escape}</h2>
+
+ {* --------------------------------------------------------------------- *}
+ {* Start Options *}
+ {* --------------------------------------------------------------------- *}
+
{if $pgpoolIsActive == false}
<table>
<thead><tr><th colspan="2">{$message.strStartOption|escape}</th></tr></thead>
- <tfoot>
- <tr><td colspan="2"><input type="button" name="command" onclick="startPgpool()" value="{$message.strStartPgpool|escape}" /></td></tr></tfoot>
+ <tfoot><tr>
+ <td colspan="2">
+ <input type="button" name="command" onclick="startPgpool()"
+ value="{$message.strStartPgpool|escape}" />
+ </td>
+ </tr></tfoot>
<tbody>
- <tr>
- <tr><td>{$message.strCmdC|escape}(-c)</td>
+
+ <tr><td>{$message.strCmdC|escape} (-c)</td>
{if $c == 1}
<td><input type="checkbox" name="c" checked="checked" /></td>
{else}
<td><input type="checkbox" name="c" /></td>
{/if}
- </tr>
- <tr><td>{$message.strCmdLargeD|escape}(-D)</td>
+ </tr>
+
+ <tr><td>{$message.strCmdLargeD|escape} (-D)</td>
{if $n == 1}
<td><input type="checkbox" name="D" checked="checked" /></td>
{else}
<td><input type="checkbox" name="D" /></td>
{/if}
- </tr>
- <tr><td>{$message.strCmdN|escape}(-n)</td>
+ </tr>
+
+ <tr><td>{$message.strCmdN|escape} (-n)</td>
{if $n == 1}
<td><input type="checkbox" name="n" checked="checked" /></td>
{else}
<td><input type="checkbox" name="n" /></td>
{/if}
- </tr>
- <tr><td>{$message.strCmdD|escape}(-d)</td>
+ </tr>
+
+ <tr><td>{$message.strCmdD|escape} (-d)</td>
{if $d == 1}
<td><input type="checkbox" name="d" checked="checked" /></td>
{else}
<td><input type="checkbox" name="d" /></td>
{/if}
- </tr>
- <tr><td>{$message.strCmdPgpoolFile|escape}(-f)</td>
+ </tr>
+
+ <tr><td>{$message.strCmdPgpoolFile|escape} (-f)</td>
<td>{$pgpoolConf|escape}</td>
- </tr>
- <tr><td>{$message.strCmdPcpFile|escape}(-F)</td>
+ </tr>
+
+ <tr><td>{$message.strCmdPcpFile|escape} (-F)</td>
<td>{$pcpConf|escape}</td>
- </tr>
+ </tr>
+
</tbody>
</table>
{else}
+
+ {* --------------------------------------------------------------------- *}
+ {* Command Buttons *}
+ {* --------------------------------------------------------------------- *}
+
<div id="cmdBtn" style="visibility: visible">
<input type="button" name="command" onclick="stopPgpool()" value="{$message.strStopPgpool|escape}" />
<input type="button" name="command" onclick="restartPgpool()" value="{$message.strRestartPgpool|escape}" />
<input type="button" name="command" onclick="execReloadPgpool()" value="{$message.strReloadPgpool|escape}" />
</div>
+
+ {* --------------------------------------------------------------------- *}
+ {* Stop Options *}
+ {* --------------------------------------------------------------------- *}
<div id="stopOption" style="visibility: hidden; position: absolute">
+
<table>
<thead><tr><th colspan="2">{$message.strStopOption|escape}</th></tr></thead>
- <tfoot>
- <tr><td colspan="2">
- <input type="button" name="command" onclick="execStopPgpool()" value="{$message.strExecute|escape}" />
- <input type="button" name="command" onclick="cancelCmd()" value="{$message.strCancel|escape}" />
- </td></tr></tfoot>
+ <tfoot><tr>
+ <td colspan="2">
+ <input type="button" name="command" onclick="execStopPgpool()" value="{$message.strExecute|escape}" />
+ <input type="button" name="command" onclick="cancelCmd()" value="{$message.strCancel|escape}" />
+ </td>
+ </tr></tfoot>
<tbody>
- <tr><td>{$message.strCmdM|escape}(-m)</td><td><select name="stop_mode">
+ <tr><td>{$message.strCmdM|escape}(-m)</td>
+ <td><select name="stop_mode">
{if $m == 's'}
<option value="s" selected="selected">smart</option>
<option value="f">fast</option>
<option value="i">immediate</option>
- {elseif $m == 'f'}
+ {elseif $m == 'f'}
<option value="s">smart</option>
<option value="f" selected="selected">fast</option>
<option value="i">immediate</option>
- {elseif $m == 'i'}
+ {elseif $m == 'i'}
<option value="s">smart</option>
<option value="f">fast</option>
<option value="i" selected="selected">immediate</option>
- {else}
+ {else}
<option value="s">smart</option>
<option value="f">fast</option>
<option value="i">immediate</option>
- {/if}
+ {/if}
+ </select>
</td></tr>
</tbody>
</table>
</div>
+
+ {* --------------------------------------------------------------------- *}
+ {* Restart Options *}
+ {* --------------------------------------------------------------------- *}
<div id="restartOption" style="visibility: hidden; position: absolute">
+
<table>
<thead><tr><th colspan="2">{$message.strRestartOption|escape}</th></tr></thead>
- <tfoot>
- <tr><td colspan="2">
- <input type="button" name="command" onclick="execRestartPgpool()" value="{$message.strExecute|escape}" />
- <input type="button" name="command" onclick="cancelCmd()" value="{$message.strCancel|escape}" />
- </td></tr></tfoot>
+ <tfoot><tr>
+ <td colspan="2">
+ <input type="button" name="command" onclick="execRestartPgpool()" value="{$message.strExecute|escape}" />
+ <input type="button" name="command" onclick="cancelCmd()" value="{$message.strCancel|escape}" />
+ </td>
+ </tr></tfoot>
<tbody>
- <tr>
- <tr><td>{$message.strCmdC|escape}(-c)</td>
+
+ <tr><td>{$message.strCmdC|escape}(-c)</td>
{if $c == 1}
<td><input type="checkbox" name="c" checked="checked" /></td>
{else}
<td><input type="checkbox" name="c" /></td>
{/if}
- </tr>
- <tr><td>{$message.strCmdLargeD|escape}(-D)</td>
+ </tr>
+
+ <tr><td>{$message.strCmdLargeD|escape}(-D)</td>
{if $n == 1}
<td><input type="checkbox" name="D" checked="checked" /></td>
{else}
<td><input type="checkbox" name="D" /></td>
{/if}
- </tr>
- <tr><td>{$message.strCmdN|escape}(-n)</td>
+ </tr>
+
+ <tr><td>{$message.strCmdN|escape}(-n)</td>
{if $n == 1}
<td><input type="checkbox" name="n" checked="checked" /></td>
{else}
<td><input type="checkbox" name="n" /></td>
{/if}
- </tr>
- <tr><td>{$message.strCmdD|escape}(-d)</td>
+ </tr>
+
+ <tr><td>{$message.strCmdD|escape}(-d)</td>
{if $d == 1}
<td><input type="checkbox" name="d" checked="checked" /></td>
{else}
<td><input type="checkbox" name="d" /></td>
{/if}
- </tr>
- <tr><td>{$message.strCmdM|escape}(-m)</td><td><select name="restart_mode">
+ </tr>
+
+ <tr><td>{$message.strCmdM|escape}(-m)</td><td>
+ <select name="restart_mode">
{if $m == 's'}
<option value="s" selected="selected">smart</option>
<option value="f">fast</option>
<option value="i">immediate</option>
- {elseif $m == 'f'}
+ {elseif $m == 'f'}
<option value="s">smart</option>
<option value="f" selected="selected">fast</option>
<option value="i">immediate</option>
- {elseif $m == 'i'}
+ {elseif $m == 'i'}
<option value="s">smart</option>
<option value="f">fast</option>
<option value="i" selected="selected">immediate</option>
- {else}
+ {else}
<option value="s">smart</option>
<option value="f">fast</option>
<option value="i">immediate</option>
- {/if}
- </select>
- </td></tr>
- <tr><td>{$message.strCmdPgpoolFile|escape}(-f)</td>
+ {/if}
+ </select>
+ </td>
+ </tr>
+
+ <tr><td>{$message.strCmdPgpoolFile|escape}(-f)</td>
<td>{$pgpoolConf|escape}</td>
- </tr>
- <tr><td>{$message.strCmdPcpFile|escape}(-F)</td>
+ </tr>
+
+ <tr><td>{$message.strCmdPcpFile|escape}(-F)</td>
<td>{$pcpConf|escape}</td>
- </tr>
+ </tr>
+
</tbody>
</table>
</div>
{/if}
+
+{* --------------------------------------------------------------------- *}
+
<p>{$pgpoolStatus|escape}</p>
<p>
{foreach from=$pgpoolMessage item=lines}
{$lines|escape}<br />
{/foreach}
</p>
+
</form>
</div>
+
<div id="footer">
{include file='footer.tpl'}
</div>