zeek/scripts/policy/frameworks/cluster/nodes-experimental/manager.zeek
2023-04-21 19:04:52 +02:00

57 lines
1.6 KiB
Text

##! This script is loaded on the cluster manager to cover manager-related
##! parts of experimental features.
@load base/frameworks/cluster
@load policy/frameworks/cluster/experimental
module Cluster::Experimental;
global fully_connected_nodes_pending: set[string];
event zeek_init()
{
fully_connected_nodes_pending = table_keys(Cluster::nodes);
}
event node_fully_connected(name: string, id: string, resending: bool)
{
# If a node resends this event, it has already seen the cluster connected.
# That is, the manager most likely restarted. Adopt the view of the other
# nodes.
is_cluster_started = is_cluster_started || resending;
delete fully_connected_nodes_pending[name];
if ( !is_cluster_started && |fully_connected_nodes_pending| == 0 )
{
event cluster_started();
for ( topic in Cluster::broadcast_topics )
Broker::publish(topic, Cluster::Experimental::cluster_started);
}
}
event cluster_started()
{
Cluster::log("cluster connected");
}
# Handle some special cases for tracking connected nodes:
event zeek_init() &priority=-15
{
# Make sure the manager recognizes itself as ready if no
# connections have to be initiated.
if ( |connectees_pending| == 0 )
event node_fully_connected(Cluster::node, Broker::node_id(), F);
}
event Cluster::node_up(name: string, id: string)
{
# Loggers may not know any manager and would thus be unable to
# report successful setup. As they do not establish connections
# we can consider this case here.
local n = Cluster::nodes[name];
if ( n$node_type == Cluster::LOGGER && ! n?$manager )
event node_fully_connected(name, id, F);
}