From ec566baa4275c14f32f58aea765ffca31161163b Mon Sep 17 00:00:00 2001 From: Yugo Nagata Date: Fri, 21 Jun 2013 11:25:05 +0900 Subject: [PATCH] Add heartbeat_destination_port paramater and fix bug about heartbeat parameters. Patameters about heartbeat signal dstination wad not able to be added/deleted. --- common.php | 35 +++++++++---- definePgpoolConfParam.php | 31 ++++++----- install/checkParameter.php | 2 +- lang/en.lang.php | 3 +- lang/ja.lang.php | 1 + pgconfig.php | 95 ++++++++++++++++++++++------------ templates/help/en/pgconfig.tpl | 43 ++++++++++----- templates/help/ja/pgconfig.tpl | 33 ++++++++---- templates/pgconfig.tpl | 78 +++++++++++++++++----------- 9 files changed, 212 insertions(+), 109 deletions(-) diff --git a/common.php b/common.php index ea26b23..6435bbb 100644 --- a/common.php +++ b/common.php @@ -472,6 +472,19 @@ function readConfigParams($paramList = FALSE) $num = str_replace('other_wd_port', '', $key); $configParam['other_wd_port'][$num] = $value; + // params about watchdog heartbeat + } elseif (preg_match("/^heartbeat_destination_port/", $key)) { + $num = str_replace('heartbeat_destination_port', '', $key); + $configParam['heartbeat_destination_port'][$num] = $value; + + } elseif (preg_match("/^heartbeat_destination/", $key)) { + $num = str_replace('heartbeat_destination', '', $key); + $configParam['heartbeat_destination'][$num] = str_replace("'", "", $value); + + } elseif (preg_match("/^heartbeat_device/", $key)) { + $num = str_replace('heartbeat_device', '', $key); + $configParam['heartbeat_device'][$num] = str_replace("'", "", $value); + } else { $configParam[$key] = str_replace("'", "", $value); } @@ -484,14 +497,17 @@ function readConfigParams($paramList = FALSE) $results[$key] = $configParam[$key]; } else { require_once('definePgpoolConfParam.php'); - if(!preg_match("/^backend_hostname/", $key) && - !preg_match("/^backend_port/", $key) && - !preg_match("/^backend_weight/", $key) && - !preg_match("/^backend_data_directory/", $key) && - !preg_match("/^backend_flag/", $key) && - !preg_match("/^other_pgpool_hostname/", $key) && - !preg_match("/^other_pgpool_port/", $key) && - !preg_match("/^other_wd_port/", $key) + if(!preg_match("/^backend_hostname/", $key) && + !preg_match("/^backend_port/", $key) && + !preg_match("/^backend_weight/", $key) && + !preg_match("/^backend_data_directory/", $key) && + !preg_match("/^backend_flag/", $key) && + !preg_match("/^other_pgpool_hostname/", $key) && + !preg_match("/^other_pgpool_port/", $key) && + !preg_match("/^other_wd_port/", $key) && + !preg_match("/^heartbeat_destination/", $key) && + !preg_match("/^heartbeat_destination_port/", $key) && + !preg_match("/^heartbeat_device/", $key) ) { if (isset($configParam[$key])) { @@ -544,8 +560,9 @@ function paramExists($param) // params added in 3.3 case 'clear_memqcache_on_escalation': - case 'heartbeat_device': case 'heartbeat_destination': + case 'heartbeat_destination_port': + case 'heartbeat_device': case 'wd_authkey': case 'wd_escalation_command': case 'wd_lifecheck_method': diff --git a/definePgpoolConfParam.php b/definePgpoolConfParam.php index 7036e64..2be6763 100644 --- a/definePgpoolConfParam.php +++ b/definePgpoolConfParam.php @@ -25,6 +25,8 @@ $pgpoolConfigParam = array(); $pgpoolConfigBackendParam = array(); +$pgpoolConfigWdOtherParam = array(); +$pgpoolConfigHbDestinationParam = array(); define('NUM_MAX', 65535); @@ -35,7 +37,6 @@ $hostreg = '^[0-9a-zA-Z\._\-]*$'; $sslreg = '^(|\/[0-9a-zA-Z_\/\.\-]*)$'; $commandreg = '^[0-9a-zA-Z_\/\.\-]*$'; $addressreg = '^([0-9a-zA-Z\._\-]+|[\*]{1})$'; -$addressreg = '^([0-9a-zA-Z\._\-]+|[\*]{1})$'; $listreg = '^[0-9a-zA-Z_,]*$'; $queryreg = '^[0-9a-zA-Z; ]+$'; $userreg = "^[0-9a-zA-Z_\.\-]+$"; @@ -235,7 +236,7 @@ $pgpoolConfigParam[$key]['type'] = 'C'; $pgpoolConfigParam[$key]['default'] = 'none'; $pgpoolConfigParam[$key]['regexp'] = selectreg(array('always', 'if_over_threshold', 'none')); -# - Syslog specific - +# - Syslog specific - $key = 'syslog_facility'; $pgpoolConfigParam[$key]['type'] = 'C'; @@ -535,7 +536,7 @@ $pgpoolConfigParam[$key]['default'] = 'off'; $key = 'wd_hostname'; $pgpoolConfigParam[$key]['type'] = 'C'; $pgpoolConfigParam[$key]['default'] = ''; -$pgpoolConfigParam[$key]['regexp'] = $addressreg; +$pgpoolConfigParam[$key]['regexp'] = $hostreg; $pgpoolConfigParam[$key]['null_ok'] = TRUE; $key = 'wd_port'; @@ -567,7 +568,7 @@ $pgpoolConfigParam[$key]['regexp'] = $anyelse; $key = 'delegate_IP'; $pgpoolConfigParam[$key]['type'] = 'C'; $pgpoolConfigParam[$key]['default'] = ''; -$pgpoolConfigParam[$key]['regexp'] = $addressreg; +$pgpoolConfigParam[$key]['regexp'] = $hostreg; $pgpoolConfigParam[$key]['null_ok'] = TRUE; $key = 'ifconfig_path'; @@ -641,15 +642,21 @@ $pgpoolConfigParam[$key]['default'] = 30; $pgpoolConfigParam[$key]['max'] = NUM_MAX; $pgpoolConfigParam[$key]['min'] = 0; -$key = 'heartbeat_device'; -$pgpoolConfigHbDeviceParam[$key]['type'] = 'C'; -$pgpoolConfigHbDeviceParam[$key]['default'] = 'eth0'; -$pgpoolConfigHbDeviceParam[$key]['regexp'] = $anyelse; - $key = 'heartbeat_destination'; -$pgpoolConfigHbDeviceParam[$key]['type'] = 'C'; -$pgpoolConfigHbDeviceParam[$key]['default'] = ''; -$pgpoolConfigHbDeviceParam[$key]['regexp'] = $anyelse; +$pgpoolConfigHbDestinationParam[$key]['type'] = 'C'; +$pgpoolConfigHbDestinationParam[$key]['default'] = ''; +$pgpoolConfigHbDestinationParam[$key]['regexp'] = $hostreg; + +$key = 'heartbeat_destination_port'; +$pgpoolConfigHbDestinationParam[$key]['type'] = 'N'; +$pgpoolConfigHbDestinationParam[$key]['default'] = 9694; +$pgpoolConfigHbDestinationParam[$key]['min'] = 1024; +$pgpoolConfigHbDestinationParam[$key]['max'] = NUM_MAX; + +$key = 'heartbeat_device'; +$pgpoolConfigHbDestinationParam[$key]['type'] = 'C'; +$pgpoolConfigHbDestinationParam[$key]['default'] = 'eth0'; +$pgpoolConfigHbDestinationParam[$key]['regexp'] = $anyelse; # (Configuration of query mode) diff --git a/install/checkParameter.php b/install/checkParameter.php index b41d658..681aff3 100644 --- a/install/checkParameter.php +++ b/install/checkParameter.php @@ -424,7 +424,7 @@ else { function versions() { - return array('3.2', '3.1', '3.0', + return array('3.3', '3.2', '3.1', '3.0', '2.3', '2.2', '2.1', '2.0'); } diff --git a/lang/en.lang.php b/lang/en.lang.php index fdb6b95..b3c694f 100644 --- a/lang/en.lang.php +++ b/lang/en.lang.php @@ -59,7 +59,8 @@ $message = array( 'in UPDATE/DELETE', 'descFail_over_on_backend_error' => 'Fail over when socket communication error to backend occurs', 'descFollow_master_command' => 'Command to run only after a master failover', - 'descHeartbeat_destination' => 'The destination of heartbeat signals which is sent from the device. Specify by hostname or IP address.', + 'descHeartbeat_destination' => 'The destination of heartbeat signals. Specify by hostname or IP address.', + 'descHeartbeat_destination_port' => 'The port number of the destination of heartbeat signals.', 'descHeartbeat_device' => 'The network device name for sending heartbeat signals', 'descHealth_check_period' => 'Specifies the interval for next health checking. 0 means no health checking, '. '-1 means no wait', diff --git a/lang/ja.lang.php b/lang/ja.lang.php index e1ea239..b56fe1a 100644 --- a/lang/ja.lang.php +++ b/lang/ja.lang.php @@ -57,6 +57,7 @@ $message = array( 'descFail_over_on_backend_error' => 'DBノードへのソケット通信エラー時にフェイルオーバ', 'descFollow_master_command' => 'マスタのフェイルオーバ後に実行するコマンド', 'descHeartbeat_destination' => 'ハートビート信号の送信先ホスト名または IP アドレス', + 'descHeartbeat_destination_port' => 'ハートビート信号の送信先ポート番号', 'descHeartbeat_device' => 'ハートビートの送受信に用いるネットワークデバイス名', 'descHealth_check_period' => 'ヘルスチェックを行う間隔(秒)', 'descHealth_check_timeout' => 'ヘルスチェックが長時間待たされるのを防ぐためのタイムアウト値(秒)', diff --git a/pgconfig.php b/pgconfig.php index 189512d..3ad10e4 100644 --- a/pgconfig.php +++ b/pgconfig.php @@ -48,28 +48,28 @@ if (isset($_POST['action'])) { switch ($action) { case 'add': case 'add_wd': - case 'add_heartbeat_device': + case 'add_heartbeat_destination': $configValue = arrangePostData(); $configValue = doAdd($configValue); $tpl->assign('params', $configValue); $tpl->assign('isAdd', ($action == 'add')); $tpl->assign('isAddWd', ($action == 'add_wd')); - $tpl->assign('isAddHeartbeatDevice', ($action == 'add_heartbeat_device')); + $tpl->assign('isAddHeartbeatDestination', ($action == 'add_heartbeat_destination')); $tpl->display('pgconfig.tpl'); return; case 'cancel': case 'cancel_wd': - case 'cancel_heartbeat_device': + case 'cancel_heartbeat_destination': $configValue = arrangePostData(); $configValue = doCancel($configValue, $action); $tpl->assign('params', $configValue); $tpl->assign('isAdd', FALSE); $tpl->assign('isAddWd', FALSE); - $tpl->assign('isAddHeartbeatDevice', FALSE); + $tpl->assign('isAddHeartbeatDestination', FALSE); $tpl->display('pgconfig.tpl'); return; @@ -115,7 +115,7 @@ switch ($action) { case 'delete': case 'delete_wd': - case 'delete_heartbeat_device': + case 'delete_heartbeat_destination': $num = $_POST['num']; switch ($action) { @@ -123,8 +123,8 @@ switch ($action) { deleteBackendHost($num, $configValue); break; case 'delete_wd': deleteWdOther($num, $configValue); break; - case 'cancel_heartbeat_device': - deleteHeartbeatDevice($num, $configValue); break; + case 'delete_heartbeat_destination': + deleteHeartbeatDestination($num, $configValue); break; } if (is_writable(_PGPOOL2_CONFIG_FILE)) { @@ -153,9 +153,10 @@ if (!isset($configValue['backend_hostname'])) { $configValue['backend_flag'][0] = NULL; } -if (!isset($configValue['heartbeat_device'])) { - $configValue['heartbeat_device'][0] = NULL; +if (!isset($configValue['heartbeat_destination'])) { $configValue['heartbeat_destination'][0] = NULL; + $configValue['heartbeat_destination_port'][0] = NULL; + $configValue['heartbeat_device'][0] = NULL; } if (!isset($configValue['other_pgpool_hostname'])) { @@ -183,7 +184,8 @@ $tpl->display('pgconfig.tpl'); */ function check($key, $value, &$configParam ,&$error) { - if (!isset($configParam[$key])) { continue; } + //if (!isset($configParam[$key])) { continue; } + if (!isset($configParam[$key])) { return; } $type = $value['type']; $result = FALSE; @@ -398,6 +400,7 @@ function writeConfigFile($configValue, $pgpoolConfigParam) !preg_match("/^other_pgpool_port/", $key) && !preg_match("/^other_wd_port/", $key) && !preg_match("/^heartbeat_device/", $key) && + !preg_match("/^heartbeat_destination_port/", $key) && !preg_match("/^heartbeat_destination/", $key) ) { @@ -458,10 +461,11 @@ function writeConfigFile($configValue, $pgpoolConfigParam) } } - if (isset($configValue['heartbeat_device'])) { - for ($i = 0; $i < count($configValue['heartbeat_device']); $i++) { - $configFile[] = "heartbeat_device$i = '" . $configValue['heartbeat_device'][$i] . "'\n"; + if (isset($configValue['heartbeat_destination'])) { + for ($i = 0; $i < count($configValue['heartbeat_destination']); $i++) { $configFile[] = "heartbeat_destination$i = " . $configValue['heartbeat_destination'][$i] . "\n"; + $configFile[] = "heartbeat_destination_port$i = " . $configValue['heartbeat_destination_port'][$i] . "\n"; + $configFile[] = "heartbeat_device$i = '" . $configValue['heartbeat_device'][$i] . "'\n"; } } @@ -520,15 +524,18 @@ function deleteWdOther($num, &$configValue) /** * Delete an heartbeat device */ -function deleteHeartbeatDevice($num, &$configValue) +function deleteHeartbeatDestination($num, &$configValue) { - if (!isset($configValue['heartbeat_device'])) { return; } - - unset($configValue['heartbeat_device'][$num]); - $configValue['heartbeat_device'] = array_values($configValue['heartbeat_device']); + if (!isset($configValue['heartbeat_destination'])) { return; } unset($configValue['heartbeat_destination'][$num]); $configValue['heartbeat_destination'] = array_values($configValue['heartbeat_destination']); + + unset($configValue['heartbeat_destination_port'][$num]); + $configValue['heartbeat_destination_port'] = array_values($configValue['heartbeat_destination_port']); + + unset($configValue['heartbeat_device'][$num]); + $configValue['heartbeat_device'] = array_values($configValue['heartbeat_device']); } /** @@ -592,13 +599,19 @@ function doAdd($configValue) } } - // watchdog's device settings + // watchdog's heartbeat destination settings if (isset($_POST['heartbeat_device'])) { $configValue['heartbeat_device'] = $_POST['heartbeat_device']; } else { $configValue['heartbeat_device'][0] = NULL; } + if (isset($_POST['heartbeat_destination_port'])) { + $configValue['heartbeat_destination_port'] = $_POST['heartbeat_destination_port']; + } else { + $configValue['heartbeat_destination_port'][0] = NULL; + } + if (isset($_POST['heartbeat_destination'])) { $configValue['heartbeat_destination'] = $_POST['heartbeat_destination']; } else { @@ -666,9 +679,13 @@ function doCancel($configValue, $action) if (isset($_POST['heartbeat_destination'])) { $configValue['heartbeat_destination'] = $_POST['heartbeat_destination']; } - if ($action == 'cancel_heartbeat_device') { - array_pop($configValue['heartbeat_device']); + if (isset($_POST['heartbeat_destination_port'])) { + $configValue['heartbeat_destination_port'] = $_POST['heartbeat_destination_port']; + } + if ($action == 'cancel_heartbeat_destination') { array_pop($configValue['heartbeat_destination']); + array_pop($configValue['heartbeat_destination_port']); + array_pop($configValue['heartbeat_device']); } // watchdog's other pgpool settings @@ -698,6 +715,7 @@ function doCheck() global $pgpoolConfigParam; global $configValue; global $pgpoolConfigBackendParam; + global $pgpoolConfigHbDestinationParam; global $pgpoolConfigWdOtherParam; global $_POST; @@ -768,25 +786,38 @@ function doCheck() } /* - * check watchdof's device value + * check watchdog heartbeat destination value */ - if (isset($configValue['heartbeat_device'])) { - for ($i = 0; $i < count($configValue['heartbeat_device']); $i++) { + foreach ($pgpoolConfigHbDestinationParam as $key => $value) { + if (isset($_POST[$key])) { + $configValue[$key] = $_POST[$key]; + } + } + if (isset($configValue['heartbeat_destination'])) { + for ($i = 0; $i < count($configValue['heartbeat_destination']); $i++) { $result = FALSE; - // heartbeat_device - $result = checkString($configValue['heartbeat_device'][$i], - $pgpoolConfigWdOtherParam['heartbeat_device']['regexp']); - if (!$result) { - $error['heartbeat_device'][$i] = TRUE; - } - // heartbeat_destination $result = checkString($configValue['heartbeat_destination'][$i], - $pgpoolConfigWdOtherParam['heartbeat_destination']['regexp']); + $pgpoolConfigHbDestinationParam['heartbeat_destination']['regexp']); if (!$result) { $error['heartbeat_destination'][$i] = TRUE; } + + // heartbeat_destination_port + $result = checkInteger($configValue['heartbeat_destination_port'][$i], + $pgpoolConfigHbDestinationParam['heartbeat_destination_port']['min'], + $pgpoolConfigHbDestinationParam['heartbeat_destination_port']['max']); + if (!$result) { + $error['heartbeat_destination_port'][$i] = TRUE; + } + + // heartbeat_device + $result = checkString($configValue['heartbeat_device'][$i], + $pgpoolConfigHbDestinationParam['heartbeat_device']['regexp']); + if (!$result) { + $error['heartbeat_device'][$i] = TRUE; + } } } diff --git a/templates/help/en/pgconfig.tpl b/templates/help/en/pgconfig.tpl index 2449653..280e0e3 100644 --- a/templates/help/en/pgconfig.tpl +++ b/templates/help/en/pgconfig.tpl @@ -1819,25 +1819,44 @@ black_function_list = 'nextval,setval,lastval,currval' - -

heartbeat_device (string) * + +

heartbeat_destination (string) * -

Specifies the network device name for sending heartbeat signals. - You can use multiple devices. - The number at the end of the parameter name is referred as "device number", and it starts from 0. - If you want to set mutiple destination (heartbeat_destiationN) for one device, - specify the device name repeatedly using different numbers.

+

Specifies the destination of heartbeat signals by IP address or hostname. + You can use multiple destination. + The number at the end of the parameter name is referred as "destination number", + and it starts from 0. + This works only heartbeat mode.

- +

heartbeat_destination (string) * -

Specifies the destination of heartbeat signals which is sent from the device - specified by heartbeat_deviceX. - Use IP address or hostname. The number at the end of the parameter name is referred as "device number", - and it starts from 0. This works only heartbeat mode.

+

Specifies the port number of destination of heartbeat signals + which is specified by heartbeat_destinationX. + This is usually the same value as wd_heartbeat_port + You must use another value if the port number is unusable on a certain host or + there are more than two pgpool-IIs in a host. + The number at the end of the parameter name is referred as "destination number", + and it starts from 0. + This works only heartbeat mode.

+ + + + + +

heartbeat_device (string) * + +

Specifies the network device name for sending heartbeat signals to + destination specified by heartbeat_destinationX. + You can use the same device for different distinations. + The number at the end of the parameter name is referred as "destination number", + and it starts from 0. + This works only heartbeat mode. + In addition, this works only when pgpool-II has root privilege and are running on Linux, + because this uses SO_BINDTODEVICE socket option.

{/if} diff --git a/templates/help/ja/pgconfig.tpl b/templates/help/ja/pgconfig.tpl index 2c21a0c..3ca126b 100644 --- a/templates/help/ja/pgconfig.tpl +++ b/templates/help/ja/pgconfig.tpl @@ -1894,23 +1894,34 @@ black_function_list = 'nextval,setval,lastval,currval' - -

heartbeat_device (string) * + +

heartbeat_destination (string) * -

ハートビートの送受信に用いるネットワークデバイス名を指定します。 複数のデバイスが設定可能です。 - 数値の部分はデバイスの番号です。 デバイス毎に 0 からの連番にします。 - 1つのデバイスに複数のハートビート送信先(heartbeat_destiationN)を設定する場合は、 - 重複するデバイス名を異なる番号で指定してください。

+

ハートビート信号の宛先をホスト名か IP で指定します。 + 数値の部分は送り先の番号です。 0 からの連番にします。

- -

heartbeat_destination (string) * + +

heartbeat_destination_port (string) * + +

heartbeat_destinationXに指定したハートビート信号の送り先のポート番号を指定します。 + 通常は wd_heartbeat_port と同じ値を指定します。 + そのポート番号が使用できないホストや、同じホストで複数の pgpool-II を動作させる場合には、異なる値を指定する必要があります。 + 数値の部分は送り先の番号です。0 からの連番にします。

+ + + + + +

heartbeat_device (string) * -

heartbeat_deviceX に指定したデバイスから送るハートビート信号の宛先を、 - ホスト名か IP で指定します。 - 数値の部分はデバイスの番号です。 デバイス毎に 0 からの連番にします。

+

heartbeat_destinationXに指定した送り先とのハートビートの送受信に用いるネットワークデバイス名を指定します。 + 数値の部分は送り先の番号です。デバイス毎に 0 からの連番にします。 + 複数の異なる送り先に同じデバイスを設定することが可能です。 + ハートビートモードの場合のみ有効です。 + また、SO_BINDTODEVICE ソケットオプションを使用しているため、pgpool-II が Linux で root 権限で起動している場合のみ有効です。

{/if} diff --git a/templates/pgconfig.tpl b/templates/pgconfig.tpl index 8422b60..75d96f4 100644 --- a/templates/pgconfig.tpl +++ b/templates/pgconfig.tpl @@ -27,8 +27,8 @@ function addOtherWatchdog() { document.pgconfig.action.value= "add_wd"; document.pgconfig.submit(); } -function addHeartbeatDevice() { - document.pgconfig.action.value= "add_heartbeat_device"; +function addHeartbeatDestination() { + document.pgconfig.action.value= "add_heartbeat_destination"; document.pgconfig.submit(); } @@ -40,8 +40,8 @@ function cancelOtherWatchdog() { document.pgconfig.action.value= "cancel_wd"; document.pgconfig.submit(); } -function cancelHeartbeatDevice() { - document.pgconfig.action.value= "cancel_heartbeat_device"; +function cancelHeartbeatDestination() { + document.pgconfig.action.value= "cancel_heartbeat_destination"; document.pgconfig.submit(); } @@ -59,9 +59,9 @@ function delOtherWatchdog(num){ document.pgconfig.submit(); } } -function delHeartbeatDevice(num){ +function delHeartbeatDestination(num){ if(window.confirm(msgDeleteConfirm)){ - document.pgconfig.action.value= "delete_heartbeat_device"; + document.pgconfig.action.value= "delete_heartbeat_destination"; document.pgconfig.num.value = num; document.pgconfig.submit(); } @@ -1363,7 +1363,7 @@ function delHeartbeatDevice(num){ {* --------------------------------------------------------------------- *} Lifecheck Setting (common) - {if paramExists('heartbeat_device')} + {if paramExists('wd_lifecheck_method')} @@ -1381,7 +1381,7 @@ function delHeartbeatDevice(num){ {* --------------------------------------------------------------------- *} - {if paramExists('heartbeat_device')} + {if paramExists('heartbeat_destination')} Lifecheck Setting (heartbeat mode) @@ -1408,53 +1408,69 @@ function delHeartbeatDevice(num){ - {if paramExists('heartbeat_device')} - {foreach from=$params.heartbeat_device key=device_num item=v} + {if paramExists('heartbeat_destination')} + {foreach from=$params.heartbeat_destination key=dest_num item=v} - device {$device_num} - - -
heartbeat_device{$device_num} (string) - - - - + destination {$dest_num} - -
heartbeat_destination{$device_num|escape} (integer) +
heartbeat_destination{$dest_num|escape} (string) + value="{$params.heartbeat_destination.$dest_num|escape}" /> + + + + + + + + +
heartbeat_destination_port{$dest_num} (integer) + + + + + + +
heartbeat_device{$dest_num} (string) + {/foreach} - {if isset($isAddHeartbeatDevice) && $isAddHeartbeatDevice == true} + {if isset($isAddHeartbeatDestination) && $isAddHeartbeatDestination == true} - device {$device_num + 1} - -
heartbeat_device{$smarty.section.device_num.index} (string) + destination {$dest_num + 1} + +
heartbeat_destination{$smarty.section.dest_num.index|escape} (string) - -
heartbeat_destination{$smarty.section.device_num.index|escape} (integer) + +
heartbeat_destination_port{$smarty.section.dest_num.index|escape} (integer) + + + + + +
heartbeat_device{$smarty.section.dest_num.index} (string) + onclick="cancelHeartbeatDestination()" /> {else} + onclick="addHeartbeatDestination()" /> {/if} {/if} -- 2.39.5