mirror of
https://github.com/zeek/zeek.git
synced 2025-10-08 17:48:21 +00:00
broker integration: add remote printing
This commit is contained in:
parent
0daa954ddb
commit
1e462481dc
5 changed files with 158 additions and 10 deletions
|
@ -1 +1 @@
|
||||||
Subproject commit 331966d1f3d24c63bedbda79e477f759c4d267f9
|
Subproject commit 1e8d6757909750524c15f8eaf3c297243bc55425
|
|
@ -4,4 +4,10 @@ module Comm;
|
||||||
export {
|
export {
|
||||||
|
|
||||||
const endpoint_name = "" &redef;
|
const endpoint_name = "" &redef;
|
||||||
|
|
||||||
|
type SendFlags: record {
|
||||||
|
self: bool &default = F;
|
||||||
|
peers: bool &default = T;
|
||||||
|
unsolicited: bool &default = F;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,13 +7,31 @@
|
||||||
#include "Reporter.h"
|
#include "Reporter.h"
|
||||||
#include "comm/comm.bif.h"
|
#include "comm/comm.bif.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
bool comm::Manager::InitPreScript()
|
bool comm::Manager::InitPreScript()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int require_field(const RecordType* rt, const char* name)
|
||||||
|
{
|
||||||
|
auto rval = rt->FieldOffset(name);
|
||||||
|
|
||||||
|
if ( rval < 0 )
|
||||||
|
reporter->InternalError("no field named '%s' in record type '%s'", name,
|
||||||
|
rt->GetName().data());
|
||||||
|
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
bool comm::Manager::InitPostScript()
|
bool comm::Manager::InitPostScript()
|
||||||
{
|
{
|
||||||
|
auto send_flags_type = internal_type("Comm::SendFlags")->AsRecordType();
|
||||||
|
send_flags_self_idx = require_field(send_flags_type, "self");
|
||||||
|
send_flags_peers_idx = require_field(send_flags_type, "peers");
|
||||||
|
send_flags_unsolicited_idx = require_field(send_flags_type, "unsolicited");
|
||||||
|
|
||||||
auto res = broker::init();
|
auto res = broker::init();
|
||||||
|
|
||||||
if ( res )
|
if ( res )
|
||||||
|
@ -37,7 +55,7 @@ bool comm::Manager::InitPostScript()
|
||||||
name = fmt("bro@<unknown>.%ld", static_cast<long>(getpid()));
|
name = fmt("bro@<unknown>.%ld", static_cast<long>(getpid()));
|
||||||
}
|
}
|
||||||
|
|
||||||
endpoint = std::unique_ptr<broker::endpoint>(new broker::endpoint(name));
|
endpoint = unique_ptr<broker::endpoint>(new broker::endpoint(name));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,31 +74,81 @@ bool comm::Manager::Listen(uint16_t port, const char* addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool comm::Manager::Connect(string addr, uint16_t port,
|
bool comm::Manager::Connect(string addr, uint16_t port,
|
||||||
std::chrono::duration<double> retry_interval)
|
chrono::duration<double> retry_interval)
|
||||||
{
|
{
|
||||||
auto& peer = peers[std::make_pair(addr, port)];
|
auto& peer = peers[make_pair(addr, port)];
|
||||||
|
|
||||||
if ( peer )
|
if ( peer )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
peer = endpoint->peer(std::move(addr), port, retry_interval);
|
peer = endpoint->peer(move(addr), port, retry_interval);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool comm::Manager::Disconnect(const string& addr, uint16_t port)
|
bool comm::Manager::Disconnect(const string& addr, uint16_t port)
|
||||||
{
|
{
|
||||||
auto it = peers.find(std::make_pair(addr, port));
|
auto it = peers.find(make_pair(addr, port));
|
||||||
|
|
||||||
if ( it == peers.end() )
|
if ( it == peers.end() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return endpoint->unpeer(it->second);
|
auto rval = endpoint->unpeer(it->second);
|
||||||
|
peers.erase(it);
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool comm::Manager::Print(string topic, string msg, const Val* flags)
|
||||||
|
{
|
||||||
|
endpoint->send(move(topic), broker::message{move(msg)}, get_flags(flags));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool comm::Manager::SubscribeToPrints(string topic_prefix)
|
||||||
|
{
|
||||||
|
auto& q = print_subscriptions[topic_prefix];
|
||||||
|
|
||||||
|
if ( q )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
q = broker::message_queue(move(topic_prefix), *endpoint);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool comm::Manager::UnsubscribeToPrints(const string& topic_prefix)
|
||||||
|
{
|
||||||
|
return print_subscriptions.erase(topic_prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
int comm::Manager::get_flags(const Val* flags)
|
||||||
|
{
|
||||||
|
auto r = flags->AsRecordVal();
|
||||||
|
int rval = 0;
|
||||||
|
Val* self_flag = r->LookupWithDefault(send_flags_self_idx);
|
||||||
|
Val* peers_flag = r->LookupWithDefault(send_flags_peers_idx);
|
||||||
|
Val* unsolicited_flag = r->LookupWithDefault(send_flags_unsolicited_idx);
|
||||||
|
|
||||||
|
if ( self_flag->AsBool() )
|
||||||
|
rval |= broker::SELF;
|
||||||
|
|
||||||
|
if ( peers_flag->AsBool() )
|
||||||
|
rval |= broker::PEERS;
|
||||||
|
|
||||||
|
if ( unsolicited_flag->AsBool() )
|
||||||
|
rval |= broker::UNSOLICITED;
|
||||||
|
|
||||||
|
Unref(self_flag);
|
||||||
|
Unref(peers_flag);
|
||||||
|
Unref(unsolicited_flag);
|
||||||
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void comm::Manager::GetFds(iosource::FD_Set* read, iosource::FD_Set* write,
|
void comm::Manager::GetFds(iosource::FD_Set* read, iosource::FD_Set* write,
|
||||||
iosource::FD_Set* except)
|
iosource::FD_Set* except)
|
||||||
{
|
{
|
||||||
read->Insert(endpoint->peer_status().fd());
|
read->Insert(endpoint->peer_status().fd());
|
||||||
|
|
||||||
|
for ( const auto& ps : print_subscriptions )
|
||||||
|
read->Insert(ps.second.fd());
|
||||||
}
|
}
|
||||||
|
|
||||||
double comm::Manager::NextTimestamp(double* local_network_time)
|
double comm::Manager::NextTimestamp(double* local_network_time)
|
||||||
|
@ -147,5 +215,41 @@ void comm::Manager::Process()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for ( const auto& ps : print_subscriptions )
|
||||||
|
{
|
||||||
|
auto print_messages = ps.second.want_pop();
|
||||||
|
|
||||||
|
if ( print_messages.empty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
idle = false;
|
||||||
|
|
||||||
|
if ( ! Comm::print_handler )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for ( auto& pm : print_messages )
|
||||||
|
{
|
||||||
|
if ( pm.size() != 1 )
|
||||||
|
{
|
||||||
|
reporter->Warning("got print message of invalid size: %zd",
|
||||||
|
pm.size());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string* msg = broker::get<std::string>(pm[0]);
|
||||||
|
|
||||||
|
if ( ! msg )
|
||||||
|
{
|
||||||
|
reporter->Warning("got print message of invalid type: %d",
|
||||||
|
static_cast<int>(broker::which(pm[0])));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
val_list* vl = new val_list;
|
||||||
|
vl->append(new StringVal(move(*msg)));
|
||||||
|
mgr.QueueEvent(Comm::print_handler, vl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SetIdle(idle);
|
SetIdle(idle);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define BRO_COMM_MANAGER_H
|
#define BRO_COMM_MANAGER_H
|
||||||
|
|
||||||
#include <broker/endpoint.hh>
|
#include <broker/endpoint.hh>
|
||||||
|
#include <broker/message_queue.hh>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -28,8 +29,16 @@ public:
|
||||||
|
|
||||||
bool Disconnect(const std::string& addr, uint16_t port);
|
bool Disconnect(const std::string& addr, uint16_t port);
|
||||||
|
|
||||||
|
bool Print(std::string topic, std::string msg, const Val* flags);
|
||||||
|
|
||||||
|
bool SubscribeToPrints(std::string topic_prefix);
|
||||||
|
|
||||||
|
bool UnsubscribeToPrints(const std::string& topic_prefix);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
int get_flags(const Val* flags);
|
||||||
|
|
||||||
// IOSource interface overrides:
|
// IOSource interface overrides:
|
||||||
void GetFds(iosource::FD_Set* read, iosource::FD_Set* write,
|
void GetFds(iosource::FD_Set* read, iosource::FD_Set* write,
|
||||||
iosource::FD_Set* except) override;
|
iosource::FD_Set* except) override;
|
||||||
|
@ -43,6 +52,11 @@ private:
|
||||||
|
|
||||||
std::unique_ptr<broker::endpoint> endpoint;
|
std::unique_ptr<broker::endpoint> endpoint;
|
||||||
std::map<std::pair<std::string, uint16_t>, broker::peering> peers;
|
std::map<std::pair<std::string, uint16_t>, broker::peering> peers;
|
||||||
|
std::map<std::string, broker::message_queue> print_subscriptions;
|
||||||
|
|
||||||
|
int send_flags_self_idx;
|
||||||
|
int send_flags_peers_idx;
|
||||||
|
int send_flags_unsolicited_idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace comm
|
} // namespace comm
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
|
|
||||||
module Comm;
|
|
||||||
|
|
||||||
%%{
|
%%{
|
||||||
#include "comm/Manager.h"
|
#include "comm/Manager.h"
|
||||||
%%}
|
%%}
|
||||||
|
|
||||||
|
module Comm;
|
||||||
|
|
||||||
|
type Comm::SendFlags: record;
|
||||||
|
|
||||||
event Comm::remote_connection_established%(peer_address: string,
|
event Comm::remote_connection_established%(peer_address: string,
|
||||||
peer_port: port,
|
peer_port: port,
|
||||||
peer_name: string%);
|
peer_name: string%);
|
||||||
|
@ -13,7 +15,7 @@ event Comm::remote_connection_broken%(peer_address: string,
|
||||||
event Comm::remote_connection_incompatible%(peer_address: string,
|
event Comm::remote_connection_incompatible%(peer_address: string,
|
||||||
peer_port: port%);
|
peer_port: port%);
|
||||||
|
|
||||||
function Comm::listen%(p: port, a: string &default=""%): bool
|
function Comm::listen%(p: port, a: string &default = ""%): bool
|
||||||
%{
|
%{
|
||||||
if ( ! p->IsTCP() )
|
if ( ! p->IsTCP() )
|
||||||
{
|
{
|
||||||
|
@ -49,3 +51,25 @@ function Comm::disconnect%(a: string, p: port%): bool
|
||||||
auto rval = comm_mgr->Disconnect(a->CheckString(), p->Port());
|
auto rval = comm_mgr->Disconnect(a->CheckString(), p->Port());
|
||||||
return new Val(rval, TYPE_BOOL);
|
return new Val(rval, TYPE_BOOL);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
event Comm::print_handler%(msg: string%);
|
||||||
|
|
||||||
|
function Comm::print%(topic: string, msg: string,
|
||||||
|
flags: SendFlags &default = SendFlags()%): bool
|
||||||
|
%{
|
||||||
|
auto rval = comm_mgr->Print(topic->CheckString(), msg->CheckString(),
|
||||||
|
flags);
|
||||||
|
return new Val(rval, TYPE_BOOL);
|
||||||
|
%}
|
||||||
|
|
||||||
|
function Comm::subscribe_to_prints%(topic_prefix: string &default = ""%): bool
|
||||||
|
%{
|
||||||
|
auto rval = comm_mgr->SubscribeToPrints(topic_prefix->CheckString());
|
||||||
|
return new Val(rval, TYPE_BOOL);
|
||||||
|
%}
|
||||||
|
|
||||||
|
function Comm::unsubscribe_to_prints%(topic_prefix: string &default = ""%): bool
|
||||||
|
%{
|
||||||
|
auto rval = comm_mgr->UnsubscribeToPrints(topic_prefix->CheckString());
|
||||||
|
return new Val(rval, TYPE_BOOL);
|
||||||
|
%}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue