Merge branch 'master' of git.bro.org:bro

This commit is contained in:
Robin Sommer 2016-10-06 14:33:36 -07:00
commit 8479298e04
4 changed files with 79 additions and 17 deletions

24
CHANGES
View file

@ -4,20 +4,30 @@
* Fixing documentation piece on the interesting-hostname script.
(Robin Sommer)
* Use the deterministic bro_random() in a test, instead of os
random(). (Johanna Amann)
* Improve the SMB documentation. (Vlad Grigorescu)
* Adapt a test to an output change on FreeBSD 11.0. (Johanna Amann)
2.5-beta-46 | 2016-10-06 14:11:03 -0700
* Prevent loading version.bro during plugins.hooks test. (Johanna Amann)
* Fixing Broxygen indexing confusion for plugins. Scripts in plugins now
get an artificial index prefix: "plugin_name/", followed by the script's
relative path inside the plugin's top-level directory. For example,
"/opt/bro/lib/bro/plugins/Bro_Netmap/scripts/init.bro" now turns into
"Bro_Netmap/scripts/init.bro" for Broxygen purposes (whereas it used to
be just "init.bro"). (Robin Sommer)
* Add missing path canonifier to version test. (Johanna Amann)
* Fix a couple of tests, addressing issues of the newly introduced version.bro
as well as small FreeBSD 11.0 issues. (Johanna Amann)
* Update documentation license. (Johanna Amann)
* Improve the SMB documentation. (Vlad Grigorescu)
* Add a convenient way to access version information to Bro.
* Add script API to access Bro version information. (Johanna Amann)
@if ( Version::number >= 20500 )
or
@if ( Version::at_least("2.5") )
Version::info contains detailed information about the running version of
Bro, including beta flags, etc. (Johanna Amann)
2.5-beta-35 | 2016-10-02 17:38:31 -0400

View file

@ -1,6 +1,7 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include "Manager.h"
#include "plugin/Manager.h"
#include "util.h"
#include <utility>
@ -38,6 +39,20 @@ static string RemoveLeadingSpace(const string& s)
return rval;
}
// Turns a script's full path into a shortened, normalized version that we
// use for indexing.
static string NormalizeScriptPath(const string& path)
{
if ( auto p = plugin_mgr->LookupPluginByPath(path) )
{
auto rval = normalize_path(path);
auto prefix = SafeBasename(p->PluginDirectory()).result;
return prefix + "/" + rval.substr(p->PluginDirectory().size() + 1);
}
return without_bropath_component(path);
}
Manager::Manager(const string& arg_config, const string& bro_command)
: disabled(), comment_buffer(), comment_buffer_map(), packages(), scripts(),
identifiers(), all_info(), last_identifier_seen(), incomplete_type(),
@ -108,7 +123,7 @@ void Manager::Script(const string& path)
if ( disabled )
return;
string name = without_bropath_component(path);
string name = NormalizeScriptPath(path);
if ( scripts.GetInfo(name) )
{
@ -149,8 +164,8 @@ void Manager::ScriptDependency(const string& path, const string& dep)
return;
}
string name = without_bropath_component(path);
string depname = without_bropath_component(dep);
string name = NormalizeScriptPath(path);
string depname = NormalizeScriptPath(dep);
ScriptInfo* script_info = scripts.GetInfo(name);
if ( ! script_info )
@ -174,7 +189,7 @@ void Manager::ModuleUsage(const string& path, const string& module)
if ( disabled )
return;
string name = without_bropath_component(path);
string name = NormalizeScriptPath(path);
ScriptInfo* script_info = scripts.GetInfo(name);
if ( ! script_info )
@ -225,7 +240,7 @@ void Manager::StartType(ID* id)
return;
}
string script = without_bropath_component(id->GetLocationInfo()->filename);
string script = NormalizeScriptPath(id->GetLocationInfo()->filename);
ScriptInfo* script_info = scripts.GetInfo(script);
if ( ! script_info )
@ -289,7 +304,7 @@ void Manager::Identifier(ID* id)
return;
}
string script = without_bropath_component(id->GetLocationInfo()->filename);
string script = NormalizeScriptPath(id->GetLocationInfo()->filename);
ScriptInfo* script_info = scripts.GetInfo(script);
if ( ! script_info )
@ -318,7 +333,7 @@ void Manager::RecordField(const ID* id, const TypeDecl* field,
return;
}
string script = without_bropath_component(path);
string script = NormalizeScriptPath(path);
idd->AddRecordField(field, script, comment_buffer);
comment_buffer.clear();
DBG_LOG(DBG_BROXYGEN, "Document record field %s, identifier %s, script %s",
@ -343,7 +358,7 @@ void Manager::Redef(const ID* id, const string& path)
return;
}
string from_script = without_bropath_component(path);
string from_script = NormalizeScriptPath(path);
ScriptInfo* script_info = scripts.GetInfo(from_script);
if ( ! script_info )
@ -365,7 +380,7 @@ void Manager::SummaryComment(const string& script, const string& comment)
if ( disabled )
return;
string name = without_bropath_component(script);
string name = NormalizeScriptPath(script);
ScriptInfo* info = scripts.GetInfo(name);
if ( info )

View file

@ -241,6 +241,8 @@ bool Manager::ActivateDynamicPluginInternal(const std::string& name, bool ok_if_
DBG_LOG(DBG_PLUGINS, " InitialzingComponents");
current_plugin->InitializeComponents();
plugins_by_path.insert(std::make_pair(normalize_path(dir), current_plugin));
if ( current_plugin->APIVersion() != BRO_PLUGIN_API_VERSION )
reporter->FatalError("plugin's API version does not match Bro (expected %d, got %d in %s)",
BRO_PLUGIN_API_VERSION, current_plugin->APIVersion(), path);
@ -328,7 +330,7 @@ void Manager::RegisterPlugin(Plugin *plugin)
if ( current_dir && current_sopath )
// A dynamic plugin, record its location.
plugin->SetPluginLocation(current_dir, current_sopath);
plugin->SetPluginLocation(normalize_path(current_dir), current_sopath);
current_plugin = plugin;
}
@ -463,6 +465,31 @@ Manager::bif_init_func_map* Manager::BifFilesInternal()
return bifs;
}
Plugin* Manager::LookupPluginByPath(std::string path)
{
path = normalize_path(path);
if ( is_file(path) )
path = SafeDirname(path).result;
while ( path.size() )
{
auto i = plugins_by_path.find(path);
if ( i != plugins_by_path.end() )
return i->second;
auto j = path.rfind("/");
if ( j == std::string::npos )
break;
path.erase(j);
}
return nullptr;
}
static bool hook_cmp(std::pair<int, Plugin*> a, std::pair<int, Plugin*> b)
{
if ( a.first == b.first )

View file

@ -149,6 +149,13 @@ public:
*/
template<class T> std::list<T *> Components() const;
/**
* Returns the (dynamic) plugin associated with a given filesytem
* path. The path can be the plugin directory itself, or any path
* inside it.
*/
Plugin* LookupPluginByPath(std::string path);
/**
* Returns true if there's at least one plugin interested in a given
* hook.
@ -329,6 +336,9 @@ private:
// of that type enabled.
hook_list** hooks;
// A map of all the top-level plugin directories.
std::map<std::string, Plugin*> plugins_by_path;
// Helpers providing access to current state during dlopen().
static Plugin* current_plugin;
static const char* current_dir;