diff --git a/src/plugin/Manager.cc b/src/plugin/Manager.cc index 58dc52e033..51b85bdbb5 100644 --- a/src/plugin/Manager.cc +++ b/src/plugin/Manager.cc @@ -189,6 +189,7 @@ bool Manager::ActivateDynamicPluginInternal(const std::string& name, bool ok_if_ if ( is_file(init) ) { DBG_LOG(DBG_PLUGINS, " Loading %s", init.c_str()); + warn_if_legacy_script(init); scripts_to_load.push_back(init); break; } @@ -202,6 +203,7 @@ bool Manager::ActivateDynamicPluginInternal(const std::string& name, bool ok_if_ if ( is_file(init) ) { DBG_LOG(DBG_PLUGINS, " Loading %s", init.c_str()); + warn_if_legacy_script(init); scripts_to_load.push_back(init); break; } @@ -214,6 +216,7 @@ bool Manager::ActivateDynamicPluginInternal(const std::string& name, bool ok_if_ if ( is_file(init) ) { DBG_LOG(DBG_PLUGINS, " Loading %s", init.c_str()); + warn_if_legacy_script(init); scripts_to_load.push_back(init); break; } diff --git a/src/util.cc b/src/util.cc index 519c7ba35d..e52f365d1c 100644 --- a/src/util.cc +++ b/src/util.cc @@ -62,6 +62,36 @@ #endif #endif +static bool starts_with(const std::string_view& s, const std::string& beginning) + { + if ( beginning.size() > s.size() ) + return false; + + return std::equal(beginning.begin(), beginning.end(), s.begin()); + } + +TEST_CASE("util starts_with") + { + CHECK(starts_with("abcde", "ab") == true); + CHECK(starts_with("abcde", "de") == false); + CHECK(starts_with("abcde", "abcedf") == false); + } + +static bool ends_with(const std::string_view& s, const std::string& ending) + { + if ( ending.size() > s.size() ) + return false; + + return std::equal(ending.rbegin(), ending.rend(), s.rbegin()); + } + +TEST_CASE("util ends_with") + { + CHECK(ends_with("abcde", "de") == true); + CHECK(ends_with("abcde", "fg") == false); + CHECK(ends_with("abcde", "abcedf") == false); + } + TEST_CASE("util extract_ip") { CHECK(extract_ip("[1.2.3.4]") == "1.2.3.4"); @@ -1249,6 +1279,15 @@ TEST_CASE("util is_package_loader") const array script_extensions = {".zeek", ".bro"}; +void warn_if_legacy_script(const std::string_view& filename) + { + if ( ends_with(filename, ".bro") ) + { + std::string x(filename); + reporter->Warning("Loading script '%s' with legacy extension, support for '.bro' will be removed in Zeek v4.1", x.c_str()); + } + } + bool is_package_loader(const string& path) { string filename(std::move(SafeBasename(path).result)); @@ -1256,7 +1295,10 @@ bool is_package_loader(const string& path) for ( const string& ext : script_extensions ) { if ( filename == "__load__" + ext ) + { + warn_if_legacy_script(filename); return true; + } } return false; @@ -1294,6 +1336,7 @@ FILE* open_package(string& path, const string& mode) string p = path + ext; if ( can_read(p) ) { + warn_if_legacy_script(path); path.append(ext); return open_file(path, mode); } @@ -1604,21 +1647,6 @@ string find_file(const string& filename, const string& path_set, return string(); } -static bool ends_with(const std::string& s, const std::string& ending) - { - if ( ending.size() > s.size() ) - return false; - - return std::equal(ending.rbegin(), ending.rend(), s.rbegin()); - } - -TEST_CASE("util ends_with") - { - CHECK(ends_with("abcde", "de") == true); - CHECK(ends_with("abcde", "fg") == false); - CHECK(ends_with("abcde", "abcedf") == false); - } - string find_script_file(const string& filename, const string& path_set) { vector paths; @@ -1631,11 +1659,16 @@ string find_script_file(const string& filename, const string& path_set) string f = find_file_in_path(filename, paths[n], ext); if ( ! f.empty() ) + { + warn_if_legacy_script(f); return f; + } } if ( ends_with(filename, ".bro") ) { + warn_if_legacy_script(filename); + // We were looking for a file explicitly ending in .bro and didn't // find it, so fall back to one ending in .zeek, if it exists. auto fallback = string(filename.data(), filename.size() - 4) + ".zeek"; @@ -2186,7 +2219,12 @@ char* zeekenv(const char* name) if ( it == legacy_vars.end() ) return rval; - return getenv(it->second); + auto val = getenv(it->second); + + if ( val && starts_with(it->second, "BRO_") ) + reporter->Warning("Using legacy environment variable %s, support will be removed in Zeek v4.1; use %s instead", it->second, name); + + return val; } static string json_escape_byte(char c) diff --git a/src/util.h b/src/util.h index 5a5a8c5159..51cf00242f 100644 --- a/src/util.h +++ b/src/util.h @@ -265,6 +265,9 @@ extern std::string bro_prefixes(); extern const std::array script_extensions; +/** Prints a warning if the filename ends in .bro. */ +void warn_if_legacy_script(const std::string_view& filename); + bool is_package_loader(const std::string& path); extern void add_to_bro_path(const std::string& dir); diff --git a/testing/btest/Baseline/core.load-explicit-bro-suffix-fallback/out b/testing/btest/Baseline/core.load-explicit-bro-suffix-fallback/out index c67eefbfc1..a0a25698a1 100644 --- a/testing/btest/Baseline/core.load-explicit-bro-suffix-fallback/out +++ b/testing/btest/Baseline/core.load-explicit-bro-suffix-fallback/out @@ -1 +1,3 @@ +warning in /home/robin/bro/master/testing/btest/.tmp/core.load-explicit-bro-suffix-fallback/load-explicit-bro-suffix-fallback.zeek, line 5: Loading script 'foo.bro' with legacy extension, support for '.bro' will be removed in Zeek v4.1 +warning in /home/robin/bro/master/testing/btest/.tmp/core.load-explicit-bro-suffix-fallback/load-explicit-bro-suffix-fallback.zeek, line 5: Loading script 'foo.bro' with legacy extension, support for '.bro' will be removed in Zeek v4.1 loaded foo.zeek diff --git a/testing/btest/core/load-explicit-bro-suffix-fallback.zeek b/testing/btest/core/load-explicit-bro-suffix-fallback.zeek index d2ce412209..4cf890cb09 100644 --- a/testing/btest/core/load-explicit-bro-suffix-fallback.zeek +++ b/testing/btest/core/load-explicit-bro-suffix-fallback.zeek @@ -1,5 +1,5 @@ -# @TEST-EXEC: zeek -b %INPUT >out -# @TEST-EXEC: btest-diff out +# @TEST-EXEC: zeek -b %INPUT >out 2>&1 +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out # We don't have a foo.bro, but we'll accept foo.zeek. @load foo.bro