mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
plugin: Add HookPublishEvent hook
This commit is contained in:
parent
b9b268bd86
commit
621fd2ab39
4 changed files with 155 additions and 1 deletions
|
@ -961,6 +961,38 @@ void Manager::HookUnprocessedPacket(const Packet* packet) const {
|
||||||
MetaHookPost(HOOK_UNPROCESSED_PACKET, args, HookArgument());
|
MetaHookPost(HOOK_UNPROCESSED_PACKET, args, HookArgument());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Manager::HookPublishEvent(zeek::cluster::Backend& backend, const std::string& topic,
|
||||||
|
zeek::cluster::detail::Event& event) const {
|
||||||
|
HookArgumentList args;
|
||||||
|
|
||||||
|
if ( HavePluginForHook(META_HOOK_PRE) ) {
|
||||||
|
args.emplace_back(&backend);
|
||||||
|
args.emplace_back(topic);
|
||||||
|
args.emplace_back(&event);
|
||||||
|
MetaHookPre(HOOK_PUBLISH_EVENT, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
hook_list* l = hooks[HOOK_PUBLISH_EVENT];
|
||||||
|
|
||||||
|
bool result = true;
|
||||||
|
|
||||||
|
if ( l ) {
|
||||||
|
for ( hook_list::iterator i = l->begin(); i != l->end(); ++i ) {
|
||||||
|
Plugin* p = (*i).second;
|
||||||
|
|
||||||
|
if ( ! p->HookPublishEvent(backend, topic, event) ) {
|
||||||
|
result = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( HavePluginForHook(META_HOOK_POST) )
|
||||||
|
MetaHookPost(HOOK_PUBLISH_EVENT, args, HookArgument(result));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void Manager::MetaHookPre(HookType hook, const HookArgumentList& args) const {
|
void Manager::MetaHookPre(HookType hook, const HookArgumentList& args) const {
|
||||||
if ( hook_list* l = hooks[META_HOOK_PRE] )
|
if ( hook_list* l = hooks[META_HOOK_PRE] )
|
||||||
for ( const auto& [hook_type, plugin] : *l )
|
for ( const auto& [hook_type, plugin] : *l )
|
||||||
|
|
|
@ -13,6 +13,15 @@
|
||||||
#include "zeek/plugin/Plugin.h"
|
#include "zeek/plugin/Plugin.h"
|
||||||
|
|
||||||
namespace zeek {
|
namespace zeek {
|
||||||
|
|
||||||
|
namespace cluster {
|
||||||
|
class Backend;
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
class Event;
|
||||||
|
}
|
||||||
|
} // namespace cluster
|
||||||
|
|
||||||
namespace plugin {
|
namespace plugin {
|
||||||
|
|
||||||
// Macros that trigger plugin hooks. We put this into macros to short-cut the
|
// Macros that trigger plugin hooks. We put this into macros to short-cut the
|
||||||
|
@ -427,6 +436,28 @@ public:
|
||||||
*/
|
*/
|
||||||
void HookUnprocessedPacket(const Packet* packet) const;
|
void HookUnprocessedPacket(const Packet* packet) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hook for intercepting remote event publish operations.
|
||||||
|
*
|
||||||
|
* This hook is invoked when Cluster::publish(), Cluster::publish_hrw() or
|
||||||
|
* Cluster::publish_rr() is used in the scripting layer to publish a remote
|
||||||
|
* event to a topic. It is also invoked when calling PublishEvent() on the
|
||||||
|
* active cluster backend directly from C++ plugins. This hook can be used
|
||||||
|
* for metrics collection, modifying or redirecting events to a different
|
||||||
|
* topic. It's event possible to translate an event to another one. A plugin
|
||||||
|
* should return false if it took responsibility of publishing the event, or
|
||||||
|
* the verdict is to skip the publish operation.
|
||||||
|
*
|
||||||
|
* @param backend The backend publishing this event
|
||||||
|
* @param topic The topic to which to publish this event
|
||||||
|
* @param event The event itself
|
||||||
|
*
|
||||||
|
* @return true if event should be published, false if the publish
|
||||||
|
* operation should be skipped.
|
||||||
|
*/
|
||||||
|
bool HookPublishEvent(zeek::cluster::Backend& backend, const std::string& topic,
|
||||||
|
zeek::cluster::detail::Event& event) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal method that registers a freshly instantiated plugin with
|
* Internal method that registers a freshly instantiated plugin with
|
||||||
* the manager.
|
* the manager.
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "zeek/Event.h"
|
#include "zeek/Event.h"
|
||||||
#include "zeek/Func.h"
|
#include "zeek/Func.h"
|
||||||
#include "zeek/Val.h"
|
#include "zeek/Val.h"
|
||||||
|
#include "zeek/cluster/Backend.h"
|
||||||
#include "zeek/input.h"
|
#include "zeek/input.h"
|
||||||
#include "zeek/plugin/Component.h"
|
#include "zeek/plugin/Component.h"
|
||||||
#include "zeek/plugin/Manager.h"
|
#include "zeek/plugin/Manager.h"
|
||||||
|
@ -31,6 +32,7 @@ const char* hook_name(HookType h) {
|
||||||
"Reporter",
|
"Reporter",
|
||||||
"UnprocessedPacket",
|
"UnprocessedPacket",
|
||||||
"ObjDtor",
|
"ObjDtor",
|
||||||
|
"PublishEvent",
|
||||||
// MetaHooks
|
// MetaHooks
|
||||||
"MetaHookPre",
|
"MetaHookPre",
|
||||||
"MetaHookPost",
|
"MetaHookPost",
|
||||||
|
@ -214,6 +216,23 @@ void HookArgument::Describe(ODesc* d) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
case PACKET: d->Add("<packet>"); break;
|
case PACKET: d->Add("<packet>"); break;
|
||||||
|
|
||||||
|
case CLUSTER_BACKEND: {
|
||||||
|
d->Add("<cluster backend ");
|
||||||
|
d->Add(arg.cluster_backend->Name());
|
||||||
|
d->Add(">");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case CLUSTER_EVENT: {
|
||||||
|
auto* ce = arg.cluster_event;
|
||||||
|
d->Add("<cluster event ");
|
||||||
|
d->AddN(ce->HandlerName().data(), static_cast<int>(ce->HandlerName().size()));
|
||||||
|
d->Add(", ");
|
||||||
|
d->Add(static_cast<uint64_t>(ce->Args().size()));
|
||||||
|
d->Add(util::fmt(" argument%s>", ce->Args().size() != 1 ? "s" : ""));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,6 +350,11 @@ bool Plugin::HookReporter(const std::string& prefix, const EventHandlerPtr event
|
||||||
|
|
||||||
void Plugin::HookUnprocessedPacket(const Packet* packet) {}
|
void Plugin::HookUnprocessedPacket(const Packet* packet) {}
|
||||||
|
|
||||||
|
bool Plugin::HookPublishEvent(zeek::cluster::Backend& backend, const std::string& topic,
|
||||||
|
zeek::cluster::detail::Event& event) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Plugin::MetaHookPre(HookType hook, const HookArgumentList& args) {}
|
void Plugin::MetaHookPre(HookType hook, const HookArgumentList& args) {}
|
||||||
|
|
||||||
void Plugin::MetaHookPost(HookType hook, const HookArgumentList& args, HookArgument result) {}
|
void Plugin::MetaHookPost(HookType hook, const HookArgumentList& args, HookArgument result) {}
|
||||||
|
|
|
@ -52,6 +52,14 @@ namespace detail {
|
||||||
class Frame;
|
class Frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace cluster {
|
||||||
|
class Backend;
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
class Event;
|
||||||
|
}
|
||||||
|
} // namespace cluster
|
||||||
|
|
||||||
namespace plugin {
|
namespace plugin {
|
||||||
|
|
||||||
class Manager;
|
class Manager;
|
||||||
|
@ -76,6 +84,7 @@ enum HookType {
|
||||||
HOOK_REPORTER, //< Activates Plugin::HookReporter().
|
HOOK_REPORTER, //< Activates Plugin::HookReporter().
|
||||||
HOOK_UNPROCESSED_PACKET, //<Activates Plugin::HookUnprocessedPacket().
|
HOOK_UNPROCESSED_PACKET, //<Activates Plugin::HookUnprocessedPacket().
|
||||||
HOOK_OBJ_DTOR, //< Activates Plugin::HookObjDtor().
|
HOOK_OBJ_DTOR, //< Activates Plugin::HookObjDtor().
|
||||||
|
HOOK_PUBLISH_EVENT, //< Activates Plugin::HookPublishEvent().
|
||||||
|
|
||||||
// Meta hooks.
|
// Meta hooks.
|
||||||
META_HOOK_PRE, //< Activates Plugin::MetaHookPre().
|
META_HOOK_PRE, //< Activates Plugin::MetaHookPre().
|
||||||
|
@ -252,7 +261,9 @@ public:
|
||||||
LOCATION,
|
LOCATION,
|
||||||
ARG_LIST,
|
ARG_LIST,
|
||||||
INPUT_FILE,
|
INPUT_FILE,
|
||||||
PACKET
|
PACKET,
|
||||||
|
CLUSTER_BACKEND,
|
||||||
|
CLUSTER_EVENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -405,6 +416,22 @@ public:
|
||||||
arg.packet = packet;
|
arg.packet = packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor with cluster backend argument.
|
||||||
|
*/
|
||||||
|
explicit HookArgument(zeek::cluster::Backend* backend) {
|
||||||
|
type = CLUSTER_BACKEND;
|
||||||
|
arg.cluster_backend = backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor with cluster event argument.
|
||||||
|
*/
|
||||||
|
explicit HookArgument(zeek::cluster::detail::Event* event) {
|
||||||
|
type = CLUSTER_EVENT;
|
||||||
|
arg.cluster_event = event;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the value for a boolean argument. The argument's type must
|
* Returns the value for a boolean argument. The argument's type must
|
||||||
* match accordingly.
|
* match accordingly.
|
||||||
|
@ -548,6 +575,22 @@ public:
|
||||||
return arg.packet;
|
return arg.packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value for a cluster backend argument.
|
||||||
|
*/
|
||||||
|
const zeek::cluster::Backend* AsClusterBackend() const {
|
||||||
|
assert(type == CLUSTER_EVENT);
|
||||||
|
return arg.cluster_backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value for a cluster event argument.
|
||||||
|
*/
|
||||||
|
const zeek::cluster::detail::Event* AsClusterEvent() const {
|
||||||
|
assert(type == CLUSTER_EVENT);
|
||||||
|
return arg.cluster_event;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the argument's type.
|
* Returns the argument's type.
|
||||||
*/
|
*/
|
||||||
|
@ -577,6 +620,8 @@ private:
|
||||||
const logging::WriterBackend::WriterInfo* winfo;
|
const logging::WriterBackend::WriterInfo* winfo;
|
||||||
const zeek::detail::Location* loc;
|
const zeek::detail::Location* loc;
|
||||||
const Packet* packet;
|
const Packet* packet;
|
||||||
|
const cluster::Backend* cluster_backend;
|
||||||
|
const cluster::detail::Event* cluster_event;
|
||||||
} arg;
|
} arg;
|
||||||
|
|
||||||
// Outside union because these have dtors.
|
// Outside union because these have dtors.
|
||||||
|
@ -1077,6 +1122,28 @@ protected:
|
||||||
*/
|
*/
|
||||||
virtual void HookUnprocessedPacket(const Packet* packet);
|
virtual void HookUnprocessedPacket(const Packet* packet);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hook for intercepting remote event publish operations.
|
||||||
|
*
|
||||||
|
* This hook is invoked when Cluster::publish(), Cluster::publish_hrw() or
|
||||||
|
* Cluster::publish_rr() is used in the scripting layer to publish a remote
|
||||||
|
* event to a topic. It is also invoked when calling PublishEvent() on the
|
||||||
|
* active cluster backend directly from C++ plugins. This hook can be used
|
||||||
|
* for metrics collection, modifying or redirecting events to a different
|
||||||
|
* topic. It's event possible to translate an event to another one. A plugin
|
||||||
|
* should return false if it took responsibility of publishing the event, or
|
||||||
|
* the verdict is to skip the publish operation.
|
||||||
|
*
|
||||||
|
* @param backend The backend publishing this event
|
||||||
|
* @param topic The topic to which to publish this event
|
||||||
|
* @param event The event itself
|
||||||
|
*
|
||||||
|
* @return true if event should be published, false if the publish
|
||||||
|
* operation should be skipped.
|
||||||
|
*/
|
||||||
|
virtual bool HookPublishEvent(zeek::cluster::Backend& backend, const std::string& topic,
|
||||||
|
zeek::cluster::detail::Event& event);
|
||||||
|
|
||||||
// Meta hooks.
|
// Meta hooks.
|
||||||
virtual void MetaHookPre(HookType hook, const HookArgumentList& args);
|
virtual void MetaHookPre(HookType hook, const HookArgumentList& args);
|
||||||
virtual void MetaHookPost(HookType hook, const HookArgumentList& args, HookArgument result);
|
virtual void MetaHookPost(HookType hook, const HookArgumentList& args, HookArgument result);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue