diff --git a/scripts/base/frameworks/supervisor/api.zeek b/scripts/base/frameworks/supervisor/api.zeek index 0426eb618f..ed330d5a3f 100644 --- a/scripts/base/frameworks/supervisor/api.zeek +++ b/scripts/base/frameworks/supervisor/api.zeek @@ -23,6 +23,7 @@ export { name: string; interface: string &optional; directory: string &optional; + scripts: vector of string &default = vector(); cluster: table[string] of ClusterEndpoint &default=table(); # TODO: separate node config fields from status fields ? diff --git a/src/Supervisor.cc b/src/Supervisor.cc index 005f631590..a719b83115 100644 --- a/src/Supervisor.cc +++ b/src/Supervisor.cc @@ -732,6 +732,14 @@ Supervisor::Node Supervisor::Node::FromRecord(const RecordVal* node) if ( directory_val ) rval.directory = directory_val->AsString()->CheckString(); + auto scripts_val = node->Lookup("scripts")->AsVectorVal(); + + for ( auto i = 0; i < scripts_val->Size(); ++i ) + { + auto script = scripts_val->Lookup(i)->AsStringVal()->ToStdString(); + rval.scripts.emplace_back(std::move(script)); + } + auto cluster_table_val = node->Lookup("cluster")->AsTableVal(); auto cluster_table = cluster_table_val->AsTable(); auto c = cluster_table->InitForIteration(); @@ -773,6 +781,11 @@ Supervisor::Node Supervisor::Node::FromJSON(std::string_view json) if ( auto it = j.find("directory"); it != j.end() ) rval.directory= *it; + auto scripts = j["scripts"]; + + for ( auto& s : scripts ) + rval.scripts.emplace_back(std::move(s)); + auto cluster = j["cluster"]; for ( const auto& e : cluster.items() ) @@ -820,6 +833,13 @@ IntrusivePtr Supervisor::Node::ToRecord() const if ( directory ) rval->Assign(rt->FieldOffset("directory"), new StringVal(*directory)); + auto st = BifType::Record::Supervisor::Node->FieldType("scripts"); + auto scripts_val = new VectorVal(st->AsVectorType()); + rval->Assign(rt->FieldOffset("scripts"), scripts_val); + + for ( const auto& s : scripts ) + scripts_val->Assign(scripts_val->Size(), new StringVal(s)); + auto tt = BifType::Record::Supervisor::Node->FieldType("cluster"); auto cluster_val = new TableVal(tt->AsTableType()); rval->Assign(rt->FieldOffset("cluster"), cluster_val); diff --git a/src/Supervisor.h b/src/Supervisor.h index 994a65a381..70cc89e3a6 100644 --- a/src/Supervisor.h +++ b/src/Supervisor.h @@ -47,6 +47,7 @@ public: std::string name; std::optional interface; std::optional directory; + std::vector scripts; std::map cluster; pid_t pid = 0; diff --git a/src/main.cc b/src/main.cc index 498a0b428a..f5fcb2a07e 100644 --- a/src/main.cc +++ b/src/main.cc @@ -961,6 +961,9 @@ int main(int argc, char** argv) exit(1); } } + + for ( const auto& s : zeek::supervised_node->scripts ) + options.scripts_to_load.emplace_back(s); } double time_start = current_time(true);