diff --git a/CHANGELOG.md b/CHANGELOG.md index 23ee1bf..145aff1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - WireGuard support. [#236](https://github.com/passepartoutvpn/tunnelkit/pull/236) +- Handle `--keepalive` option. ## 4.0.3 (2021-11-27) diff --git a/Sources/TunnelKitOpenVPNCore/ConfigurationParser.swift b/Sources/TunnelKitOpenVPNCore/ConfigurationParser.swift index c7a2581..aeb4735 100644 --- a/Sources/TunnelKitOpenVPNCore/ConfigurationParser.swift +++ b/Sources/TunnelKitOpenVPNCore/ConfigurationParser.swift @@ -60,6 +60,8 @@ extension OpenVPN { static let pingRestart = NSRegularExpression("^ping-restart +\\d+") + static let keepAlive = NSRegularExpression("^keepalive +\\d+ ++\\d+") + static let renegSec = NSRegularExpression("^reneg-sec +\\d+") static let xorMask = NSRegularExpression("^scramble +xormask +.$") @@ -457,6 +459,14 @@ extension OpenVPN { } optKeepAliveTimeoutSeconds = TimeInterval(arg) } + Regex.keepAlive.enumerateArguments(in: line) { + isHandled = true + guard let ping = $0.first, let pingRestart = $0.last else { + return + } + optKeepAliveSeconds = TimeInterval(ping) + optKeepAliveTimeoutSeconds = TimeInterval(pingRestart) + } Regex.renegSec.enumerateArguments(in: line) { isHandled = true guard let arg = $0.first else { diff --git a/Tests/TunnelKitOpenVPNTests/ConfigurationParserTests.swift b/Tests/TunnelKitOpenVPNTests/ConfigurationParserTests.swift index 1d845b2..10c31a7 100644 --- a/Tests/TunnelKitOpenVPNTests/ConfigurationParserTests.swift +++ b/Tests/TunnelKitOpenVPNTests/ConfigurationParserTests.swift @@ -50,6 +50,16 @@ class ConfigurationParserTests: XCTestCase { XCTAssertNoThrow(try OpenVPN.ConfigurationParser.parsed(fromLines: ["compress lzo"])) } + func testKeepAlive() throws { + let cfg1 = try OpenVPN.ConfigurationParser.parsed(fromLines: ["ping 10", "ping-restart 60"]) + let cfg2 = try OpenVPN.ConfigurationParser.parsed(fromLines: ["keepalive 10 60"]) + let cfg3 = try OpenVPN.ConfigurationParser.parsed(fromLines: ["keepalive 15 600"]) + XCTAssertEqual(cfg1.configuration.keepAliveInterval, cfg2.configuration.keepAliveInterval) + XCTAssertEqual(cfg1.configuration.keepAliveTimeout, cfg2.configuration.keepAliveTimeout) + XCTAssertNotEqual(cfg1.configuration.keepAliveInterval, cfg3.configuration.keepAliveInterval) + XCTAssertNotEqual(cfg1.configuration.keepAliveTimeout, cfg3.configuration.keepAliveTimeout) + } + func testDHCPOption() throws { let lines = [ "dhcp-option DNS 8.8.8.8",