- add pcp_promote_node command
authorNozomi Anzai <anzai at sraoss.co.jp>
Tue, 11 Oct 2011 07:39:04 +0000 (07:39 +0000)
committerNozomi Anzai <anzai at sraoss.co.jp>
Tue, 11 Oct 2011 07:39:04 +0000 (07:39 +0000)
  (This will be shown in Master/Slave & SR mode.)

command.php
common.php
nodeStatus.php
status.php
templates/nodeStatus.tpl
templates/status.tpl

index 0c67c57f991c77c5d1b79e336a3bc54712c764b6..f316bad6b45a71f81698d9bd57ba01c64f2dbd48 100644 (file)
@@ -32,7 +32,7 @@ require_once('common.php');
  * @param srgs $num
  * @return array
  */
-function execPcp($command, $num='')
+function execPcp($command, $num = '')
 {
     $pcpStatus = array (
         '0'   => 'SUCCESS',
@@ -138,6 +138,13 @@ function execPcp($command, $num='')
             $ret = exec($cmd, $output, $return_var);
             break;
 
+        case 'PCP_PROMOTE_NODE':
+            // -g option means that standby doesn't become primary
+            // untill all connection get closed.
+            $cmd = _PGPOOL2_PCP_DIR . '/pcp_promote_node' .' -g '. $args;
+            $ret = exec($cmd, $output, $return_var);
+            break;
+
         case 'PCP_RECOVERY_NODE':
             $cmd = _PGPOOL2_PCP_DIR . '/pcp_recovery_node' . $args;
             $ret = exec($cmd, $output, $return_var);
index 11f3c1374e39c2f75dcd9dbd66629b9d45e684fa..120b3947bfb6c79a39fcfcd1d659c3f74df4f52c 100644 (file)
@@ -186,7 +186,7 @@ function selectLanguage($selectLang, $messageList)
             $lang = 'en';
 
         } else {
-            $langList = split(',|;', $acceptLanguages);
+            $langList = explode(',|;', $acceptLanguages);
             foreach ($langList as $acceptLanguage) {
                 foreach (array_keys($messageList) as $messageLanguage) {
                     if ($acceptLanguage == $messageLanguage ) {
@@ -260,20 +260,16 @@ function NodeActive($num)
  */
 function NodeStandby($num)
 {
-
-    $params = readConfigParams(array('master_slave_mode','master_slave_sub_mode'));
-
-    if ($params['master_slave_mode'] != 'true' || $params['master_slave_sub_mode'] != 'stream') {
+    if (isMasterSlaveMode() == FALSE || useStreaming() == FALSE) {
         return -1;
     }
 
-    $healthCheckDb = 'template1';
-
     $params = readHealthCheckParam();
 
     $healthCheckUser = $params['health_check_user'];
     $backendHostName = $params['backend_hostname'][$num];
     $backendPort     = $params['backend_port'][$num];
+    $healthCheckDb = 'template1';
 
     if ($backendHostName != '') {
         $conStr = "dbname=$healthCheckDb user=$healthCheckUser host=$backendHostName port=$backendPort" ;
@@ -374,7 +370,39 @@ function isMasterSlaveMode()
 {
     $params = readConfigParams(array('master_slave_mode'));
 
-    if ($params['master_slave_mode'] == 'true') {
+    if ($params['master_slave_mode'] == 'on') {
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+/**
+ * Whether pgpool is using stream sub mode in master slave mode or not?
+ *
+ * @return bool
+ */
+function useStreaming()
+{
+    $params = readConfigParams(array('master_slave_sub_mode'));
+
+    if (isMasterSlaveMode() && $params['master_slave_sub_mode'] == 'stream') {
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+/**
+ * Whether pgpool uses syslog or not?
+ *
+ * @return bool
+ */
+function useSyslog()
+{
+    $params = readConfigParams(array('log_destination'));
+
+    if ($params['log_destination'] == 'syslog') {
         return TRUE;
     } else {
         return FALSE;
index eb042d3d0253a5bd55e9d091025c9473061c798a..6b279ca80fb7b6c5e32f8e098e7be990d8abbf25 100644 (file)
@@ -29,10 +29,16 @@ $tpl->assign('help', basename( __FILE__, '.php'));
 
 $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';
@@ -45,15 +51,15 @@ if (!array_key_exists('SUCCESS', $ret)) {
 
 $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);
@@ -65,14 +71,21 @@ for ($i = 0; $i<$nodeCount; $i++) {
     }
 
     $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)) {
@@ -81,21 +94,24 @@ for ($i = 0; $i < $nodeCount; $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');
@@ -109,10 +125,12 @@ for ($i = 0; $i < $nodeCount; $i++) {
         }
     }
 
-    $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']);
index db4cc499f558b18556b877b90d4a8067986b026f..ce87a72ff7d397a8c4c4e29555a1d8f502927e4f 100644 (file)
@@ -50,7 +50,6 @@ if (isset($_POST['action'])) {
 /**
  * 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);
@@ -64,6 +63,11 @@ if (isPipe(_PGPOOL2_LOG_FILE)) {
 }
 
 switch ($action) {
+
+    /* --------------------------------------------------------------------- */
+    /* start                                                                 */
+    /* --------------------------------------------------------------------- */
+
     case 'start':
         $args = ' ';
 
@@ -95,7 +99,7 @@ switch ($action) {
             $tpl->assign('pgpoolMessage', $ret);
         } else {
             for ($i = 0; $i < 10; $i++) {
-                if(DoesPgpoolPidExist()) {
+                if (DoesPgpoolPidExist()) {
                     break;
                 } else {
                     sleep(1);
@@ -112,6 +116,10 @@ switch ($action) {
 
         break;
 
+    /* --------------------------------------------------------------------- */
+    /* stop                                                                  */
+    /* --------------------------------------------------------------------- */
+
     case 'stop':
         $m = $_POST['stop_mode'];
 
@@ -140,6 +148,10 @@ switch ($action) {
 
         break;
 
+    /* --------------------------------------------------------------------- */
+    /* restart                                                               */
+    /* --------------------------------------------------------------------- */
+
     case 'restart':
         /**
          * Stop pgpool
@@ -154,7 +166,7 @@ switch ($action) {
             exit();
 
         } else {
-            for($i = 0; $i < 10; $i++) {
+            for ($i = 0; $i < 10; $i++) {
                 if (DoesPgpoolPidExist()) {
                     sleep(1);
                 } else {
@@ -216,15 +228,15 @@ switch ($action) {
         }
         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)) {
@@ -245,7 +257,6 @@ switch ($action) {
         }
         break;
 
-
     case 'detach':
         $ret = execPcp('PCP_DETACH_NODE', $nodeNumber);
         if (!array_key_exists('SUCCESS', $ret)) {
@@ -256,6 +267,16 @@ switch ($action) {
         }
         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;
@@ -279,15 +300,15 @@ if (DoesPgpoolPidExist()) {
     $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');
 
index 00be20a549b8370b1ade3dba785c8acc6322fa8b..6b3cccd1086e817c14928e8ab163771937b7534b 100644 (file)
     <td>{$nodeInfo[num][1]|escape}</td>
 
     <td>
-    {if $nodeInfo[num][2] == 1}
+    {if $nodeInfo[num][2] == $smarty.const.NODE_ACTIVE_NO_CONNECT}
       {$message.strNodeStatus1|escape}
-    {elseif $nodeInfo[num][2] == 2}
+    {elseif $nodeInfo[num][2] == $smarty.const.NODE_ACTIVE_CONNECTED}
       {$message.strNodeStatus2|escape}
-    {elseif $nodeInfo[num][2] == 3}
+    {elseif $nodeInfo[num][2] == $smarty.const.NODE_DOWN}
       {$message.strNodeStatus3|escape}
     {/if}
-    {if $nodeInfo[num][5] == 1}
+    {if $nodeInfo[num][6] == 1}
       {$message.strStandbyRunning|escape}
-    {elseif $nodeInfo[num][5] == 0}
+    {elseif $nodeInfo[num][6] == 0}
       {$message.strPrimaryRunning|escape}
     {/if}
     </td>
        onclick="sendCommand('recovery', {$smarty.section.num.index|escape}, '{$message.msgRecoveryConfirm|escape}')"
        value="{$message.strRecovery|escape}" />
     {/if}
+    {if $nodeInfo[num][5] == 'promote' && $nodeInfo[num][6] == 1}
+      <input type="button" name="command"
+       onclick="sendCommand('promote', {$smarty.section.num.index|escape}, '{$message.msgRPromoteConfirm|escape}')"
+       value="{$message.strPromote|escape}" />
+    {/if}
     </td>
 
     </tr>
index b1ae2e724f06c104c1f6557829de0e5f0ff9f4b6..04068a156a042f56aa12cb24e4a57cbb52edeffc 100644 (file)
@@ -8,23 +8,25 @@
 <!--
 
 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');
@@ -46,12 +48,15 @@ function load() {
     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');
@@ -73,8 +78,10 @@ function reload() {
     xmlhttp.send("");
 }
 
+/* --------------------------------------------------------------------- */
+
 function timer(interval) {
-       setTimeout("reload()",interval);
+    setTimeout("reload()",interval);
 }
 
 function sendCommand(command, nodeNumber, message){
@@ -85,6 +92,10 @@ function sendCommand(command, nodeNumber, message){
     }
 }
 
+/* --------------------------------------------------------------------- */
+/* buttons                                                               */
+/* --------------------------------------------------------------------- */
+
 function startPgpool() {
     document.Command.action.value= "start";
     document.Command.submit();
@@ -95,6 +106,7 @@ function stopPgpool() {
     stopOption.style.visibility = "visible";
     stopOption.style.position = "";
     stopOption.style.height = "";
+
     var cmdBtn = document.getElementById('cmdBtn');
     cmdBtn.style.visibility = "hidden";
     cmdBtn.style.position = "absolute";
@@ -106,10 +118,12 @@ function restartPgpool() {
     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";
@@ -121,32 +135,38 @@ function cancelCmd() {
     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();
    }
@@ -161,197 +181,257 @@ function changeView(chView){
 </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>