From 53d9832d5adb526bf80f1d225a13941c7d05bdb2 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Thu, 4 Oct 2012 16:32:34 -0500 Subject: [PATCH 1/2] Fix a problem with non-manager cluster nodes applying Notice::policy. This could, for example, result in duplicate emails being sent (one from manager and one from worker) if Notice::emailed_types is redef'd in local.bro (or any script that gets loaded on all cluster nodes). The problem was that Notice::policy is used to populate the internal Notice::ordered_policy vector in a priority 10 bro_init handler (in scripts/base/frameworks/notice/main.bro) and then that is what is used when applying policy to notices. In order for scripts/base/frameworks/notice/cluster.bro to prevent Notice::policy from being used on non-manager nodes, it needs to clear it in a bro_init hander of higher priority than 10. --- scripts/base/frameworks/notice/cluster.bro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/base/frameworks/notice/cluster.bro b/scripts/base/frameworks/notice/cluster.bro index 087c3ead51..3ee113acf3 100644 --- a/scripts/base/frameworks/notice/cluster.bro +++ b/scripts/base/frameworks/notice/cluster.bro @@ -23,7 +23,7 @@ redef Cluster::worker2manager_events += /Notice::cluster_notice/; @if ( Cluster::local_node_type() != Cluster::MANAGER ) # The notice policy is completely handled by the manager and shouldn't be # done by workers or proxies to save time for packet processing. -event bro_init() &priority=-11 +event bro_init() &priority=11 { Notice::policy = table(); } From 82eaddb160727d4489bd45cf787d2d8a8031db96 Mon Sep 17 00:00:00 2001 From: Bernhard Amann Date: Tue, 9 Oct 2012 14:00:32 -0700 Subject: [PATCH 2/2] and another bug in the input framework: config table does not work (is not transmitted to the readers) because the initialization was done the wrong way round. Just re-ordered some lines, no other changes. --- src/input/Manager.cc | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/input/Manager.cc b/src/input/Manager.cc index 83e9dc9bc5..df06af7454 100644 --- a/src/input/Manager.cc +++ b/src/input/Manager.cc @@ -320,22 +320,12 @@ bool Manager::CreateStream(Stream* info, RecordVal* description) } Unref(mode); - + Val* config = description->LookupWithDefault(rtype->FieldOffset("config")); - - ReaderFrontend* reader_obj = new ReaderFrontend(*rinfo, reader); - assert(reader_obj); - - info->reader = reader_obj; - info->type = reader->AsEnumVal(); // ref'd by lookupwithdefault - info->name = name; info->config = config->AsTableVal(); // ref'd by LookupWithDefault - info->info = rinfo; - - Ref(description); - info->description = description; - + { + // create config mapping in ReaderInfo. Has to be done before the construction of reader_obj. HashKey* k; IterCookie* c = info->config->AsTable()->InitForIteration(); @@ -345,13 +335,27 @@ bool Manager::CreateStream(Stream* info, RecordVal* description) ListVal* index = info->config->RecoverIndex(k); string key = index->Index(0)->AsString()->CheckString(); string value = v->Value()->AsString()->CheckString(); - info->info->config.insert(std::make_pair(copy_string(key.c_str()), copy_string(value.c_str()))); + printf("Inserting %s:%s\n", key.c_str(), value.c_str()); + rinfo->config.insert(std::make_pair(copy_string(key.c_str()), copy_string(value.c_str()))); Unref(index); delete k; } } + + ReaderFrontend* reader_obj = new ReaderFrontend(*rinfo, reader); + assert(reader_obj); + + info->reader = reader_obj; + info->type = reader->AsEnumVal(); // ref'd by lookupwithdefault + info->name = name; + info->info = rinfo; + + Ref(description); + info->description = description; + + DBG_LOG(DBG_INPUT, "Successfully created new input stream %s", name.c_str());