diff --git a/scripts/base/frameworks/cluster/main.zeek b/scripts/base/frameworks/cluster/main.zeek index f6b79b07ca..199ae2e147 100644 --- a/scripts/base/frameworks/cluster/main.zeek +++ b/scripts/base/frameworks/cluster/main.zeek @@ -85,6 +85,9 @@ export { ## is incremented when the maximum queue size is reached. const default_websocket_max_event_queue_size = 32 &redef; + ## The default ping interval for WebSocket clients. + const default_websocket_ping_interval = 5 sec &redef; + ## Setting a default dir will, for persistent backends that have not ## been given an explicit file path via :zeek:see:`Cluster::stores`, ## automatically create a path within this dir that is based on the name of @@ -365,6 +368,10 @@ export { listen_port: port; ## The maximum event queue size for this server. max_event_queue_size: count &default=default_websocket_max_event_queue_size; + ## Ping interval to use. A WebSocket client not responding to + ## the pings will be disconnected. Set to a negative value to + ## disable pings. Subsecond intervals are currently not supported. + ping_interval: interval &default=default_websocket_ping_interval; ## The TLS options used for this WebSocket server. By default, ## TLS is disabled. See also :zeek:see:`Cluster::WebSocketTLSOptions`. tls_options: WebSocketTLSOptions &default=WebSocketTLSOptions(); diff --git a/src/cluster/cluster.bif b/src/cluster/cluster.bif index fc5a341f9e..83a7cd8f3e 100644 --- a/src/cluster/cluster.bif +++ b/src/cluster/cluster.bif @@ -198,6 +198,13 @@ function Cluster::__listen_websocket%(options: WebSocketServerOptions%): bool }; server_options.max_event_queue_size = options_rec->GetField("max_event_queue_size")->Get(); + + double ping_interval = options_rec->GetField("ping_interval")->Get(); + if ( ping_interval < 0.0 ) + server_options.ping_interval_seconds = -1; + else + server_options.ping_interval_seconds = static_cast(ping_interval); + server_options.tls_options = std::move(tls_options); auto result = zeek::cluster::manager->ListenWebSocket(server_options); diff --git a/testing/btest/Baseline.zam/cluster.websocket.listen-idempotent/.stderr b/testing/btest/Baseline.zam/cluster.websocket.listen-idempotent/.stderr index 38b947db5d..f55de0446c 100644 --- a/testing/btest/Baseline.zam/cluster.websocket.listen-idempotent/.stderr +++ b/testing/btest/Baseline.zam/cluster.websocket.listen-idempotent/.stderr @@ -1,5 +1,5 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -error in <...>/main.zeek, line 666: Already listening on 127.0.0.1: (Cluster::__listen_websocket(ws_opts_x)) -error in <...>/main.zeek, line 666: Already listening on 127.0.0.1: (Cluster::__listen_websocket(ws_opts_wss_port)) -error in <...>/main.zeek, line 666: Already listening on 127.0.0.1: (Cluster::__listen_websocket(ws_opts_qs)) +error in <...>/main.zeek, line 673: Already listening on 127.0.0.1: (Cluster::__listen_websocket(ws_opts_x)) +error in <...>/main.zeek, line 673: Already listening on 127.0.0.1: (Cluster::__listen_websocket(ws_opts_wss_port)) +error in <...>/main.zeek, line 673: Already listening on 127.0.0.1: (Cluster::__listen_websocket(ws_opts_qs)) received termination signal diff --git a/testing/btest/Baseline.zam/cluster.websocket.tls-usage-error/.stderr b/testing/btest/Baseline.zam/cluster.websocket.tls-usage-error/.stderr index 0a8d499f53..49a7f00389 100644 --- a/testing/btest/Baseline.zam/cluster.websocket.tls-usage-error/.stderr +++ b/testing/btest/Baseline.zam/cluster.websocket.tls-usage-error/.stderr @@ -1,3 +1,3 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -error in <...>/main.zeek, line 666: Invalid tls_options: No key_file field (Cluster::__listen_websocket(Cluster::options.0)) -error in <...>/main.zeek, line 666: Invalid tls_options: No cert_file field (Cluster::__listen_websocket(Cluster::options.3)) +error in <...>/main.zeek, line 673: Invalid tls_options: No key_file field (Cluster::__listen_websocket(Cluster::options.0)) +error in <...>/main.zeek, line 673: Invalid tls_options: No cert_file field (Cluster::__listen_websocket(Cluster::options.3))