diff --git a/src/main/kotlin/app/termora/EditHostOptionsPane.kt b/src/main/kotlin/app/termora/EditHostOptionsPane.kt index 8a41fbb..07c3087 100644 --- a/src/main/kotlin/app/termora/EditHostOptionsPane.kt +++ b/src/main/kotlin/app/termora/EditHostOptionsPane.kt @@ -31,6 +31,7 @@ class EditHostOptionsPane(private val host: Host) : HostOptionsPane() { terminalOption.charsetComboBox.selectedItem = host.options.encoding terminalOption.environmentTextArea.text = host.options.env terminalOption.startupCommandTextField.text = host.options.startupCommand + terminalOption.heartbeatIntervalTextField.value = host.options.heartbeatInterval tunnelingOption.tunnelings.addAll(host.tunnelings) } diff --git a/src/main/kotlin/app/termora/Host.kt b/src/main/kotlin/app/termora/Host.kt index 54911c4..0e62658 100644 --- a/src/main/kotlin/app/termora/Host.kt +++ b/src/main/kotlin/app/termora/Host.kt @@ -58,6 +58,10 @@ data class Options( * 连接成功后立即发送命令 */ val startupCommand: String = StringUtils.EMPTY, + /** + * SSH 心跳间隔 + */ + val heartbeatInterval: Int = 30 ) { companion object { val Default = Options() diff --git a/src/main/kotlin/app/termora/HostOptionsPane.kt b/src/main/kotlin/app/termora/HostOptionsPane.kt index 7238c29..cbb5591 100644 --- a/src/main/kotlin/app/termora/HostOptionsPane.kt +++ b/src/main/kotlin/app/termora/HostOptionsPane.kt @@ -67,7 +67,8 @@ open class HostOptionsPane : OptionsPane() { val options = Options.Default.copy( encoding = terminalOption.charsetComboBox.selectedItem as String, env = terminalOption.environmentTextArea.text, - startupCommand = terminalOption.startupCommandTextField.text + startupCommand = terminalOption.startupCommandTextField.text, + heartbeatInterval = (terminalOption.heartbeatIntervalTextField.value ?: 30) as Int, ) return Host( @@ -508,6 +509,7 @@ open class HostOptionsPane : OptionsPane() { protected inner class TerminalOption : JPanel(BorderLayout()), Option { val charsetComboBox = JComboBox() val startupCommandTextField = OutlineTextField() + val heartbeatIntervalTextField = IntSpinner(30, minimum = 3, maximum = Int.MAX_VALUE) val environmentTextArea = FixedLengthTextArea(2048) @@ -563,7 +565,7 @@ open class HostOptionsPane : OptionsPane() { private fun getCenterComponent(): JComponent { val layout = FormLayout( "left:pref, $formMargin, default:grow, $formMargin, default:grow", - "pref, $formMargin, pref, $formMargin, pref, $formMargin" + "pref, $formMargin, pref, $formMargin, pref, $formMargin, pref" ) var rows = 1 @@ -571,6 +573,8 @@ open class HostOptionsPane : OptionsPane() { val panel = FormBuilder.create().layout(layout) .add("${I18n.getString("termora.new-host.terminal.encoding")}:").xy(1, rows) .add(charsetComboBox).xy(3, rows).apply { rows += step } + .add("${I18n.getString("termora.new-host.terminal.heartbeat-interval")}:").xy(1, rows) + .add(heartbeatIntervalTextField).xy(3, rows).apply { rows += step } .add("${I18n.getString("termora.new-host.terminal.startup-commands")}:").xy(1, rows) .add(startupCommandTextField).xy(3, rows).apply { rows += step } .add("${I18n.getString("termora.new-host.terminal.env")}:").xy(1, rows) diff --git a/src/main/kotlin/app/termora/SshClients.kt b/src/main/kotlin/app/termora/SshClients.kt index 53e01fb..6f87b02 100644 --- a/src/main/kotlin/app/termora/SshClients.kt +++ b/src/main/kotlin/app/termora/SshClients.kt @@ -19,6 +19,7 @@ import org.eclipse.jgit.transport.sshd.ProxyData import java.net.InetSocketAddress import java.net.Proxy import java.time.Duration +import kotlin.math.max object SshClients { private val timeout = Duration.ofSeconds(30) @@ -83,7 +84,8 @@ object SshClients { } val sshClient = builder.build() as JGitSshClient - CoreModuleProperties.HEARTBEAT_INTERVAL.set(sshClient, timeout) + val heartbeatInterval = max(host.options.heartbeatInterval, 3) + CoreModuleProperties.HEARTBEAT_INTERVAL.set(sshClient, Duration.ofSeconds(heartbeatInterval.toLong())) sshClient.setKeyPasswordProviderFactory { IdentityPasswordProvider(CredentialsProvider.getDefault()) } if (host.proxy.type != ProxyType.No) { diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index d675738..7c122ed 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -127,6 +127,7 @@ termora.new-host.proxy=Proxy termora.new-host.terminal=${termora.settings.terminal} termora.new-host.terminal.encoding=Encoding +termora.new-host.terminal.heartbeat-interval=Heartbeat Interval termora.new-host.terminal.startup-commands=Startup Command termora.new-host.terminal.env=Environment diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index e2cbf05..cb97e4d 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -118,6 +118,7 @@ termora.new-host.proxy=代理 termora.new-host.terminal=${termora.settings.terminal} termora.new-host.terminal.encoding=编码 +termora.new-host.terminal.heartbeat-interval=心跳间隔 termora.new-host.terminal.startup-commands=启动命令 termora.new-host.terminal.env=环境 diff --git a/src/main/resources/i18n/messages_zh_TW.properties b/src/main/resources/i18n/messages_zh_TW.properties index 17bc5d0..141adac 100644 --- a/src/main/resources/i18n/messages_zh_TW.properties +++ b/src/main/resources/i18n/messages_zh_TW.properties @@ -116,6 +116,7 @@ termora.new-host.proxy=代理 termora.new-host.terminal=${termora.settings.terminal} termora.new-host.terminal.encoding=編碼 termora.new-host.terminal.startup-commands=啟動命令 +termora.new-host.terminal.heartbeat-interval=心跳間隔 termora.new-host.terminal.env=環境 termora.new-host.tunneling=隧道