diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d3d1f4d2..eeeb34d6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,24 @@ if(_conan_generators AND EXISTS "${_conan_generators}/conan_toolchain.cmake") endif() unset(_conan_generators) +# On macOS with non-Xcode generators (e.g. Unix Makefiles), Conan sets +# CMAKE_OSX_SYSROOT to the shortname 'macosx' which only Xcode resolves. +# Clang requires the full SDK path. We override here, after the conan toolchain +# re-include above (which resets the value via FORCE). +if(APPLE AND NOT CMAKE_GENERATOR MATCHES "Xcode") + execute_process( + COMMAND xcrun --sdk macosx --show-sdk-path + OUTPUT_VARIABLE _VISOR_MACOS_SDK_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + if(_VISOR_MACOS_SDK_PATH) + set(CMAKE_OSX_SYSROOT "${_VISOR_MACOS_SDK_PATH}" CACHE STRING "macOS SDK path" FORCE) + message(STATUS "visor: macOS SDK path: ${CMAKE_OSX_SYSROOT}") + endif() + unset(_VISOR_MACOS_SDK_PATH) +endif() + include(sanitizer) if(CODE_COVERAGE) include(CodeCoverage) diff --git a/conanfile.py b/conanfile.py index 15ef5a747..004ea151f 100644 --- a/conanfile.py +++ b/conanfile.py @@ -8,7 +8,7 @@ class Pktvisor(ConanFile): def requirements(self): self.requires("catch2/3.14.0") - self.requires("corrade/2020.06") + self.requires("corrade/cci.20250327") self.requires("cpp-httplib/0.18.3") self.requires("docopt.cpp/0.6.3") self.requires("fast-cpp-csv-parser/cci.20240102") @@ -20,7 +20,7 @@ def requirements(self): self.requires("libpcap/1.10.5", force=True) else: self.requires("npcap/1.70") - self.requires("opentelemetry-cpp/1.17.0") + self.requires("opentelemetry-cpp/1.24.0") self.requires("pcapplusplus/25.05") self.requires("protobuf/5.27.0") self.requires("sigslot/1.2.3") @@ -37,7 +37,7 @@ def requirements(self): self.requires("sentry-crashpad/0.6.5") def build_requirements(self): - self.tool_requires("corrade/2020.06") + self.tool_requires("corrade/cci.20250327") self.tool_requires("protobuf/5.27.0") def layout(self): diff --git a/src/AbstractPlugin.cpp b/src/AbstractPlugin.cpp index d0edb22e0..3cd412229 100644 --- a/src/AbstractPlugin.cpp +++ b/src/AbstractPlugin.cpp @@ -3,6 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "AbstractPlugin.h" +#include "CorradeCompat.h" #include #include diff --git a/src/AbstractPlugin.h b/src/AbstractPlugin.h index 6377b6ac4..42a453ca4 100644 --- a/src/AbstractPlugin.h +++ b/src/AbstractPlugin.h @@ -5,6 +5,8 @@ #pragma once #include +#include +#include #include #include #include @@ -69,9 +71,9 @@ class AbstractPlugin : public Corrade::PluginManager::AbstractPlugin } public: - static std::vector pluginSearchPaths() + static Corrade::Containers::Array pluginSearchPaths() { - return {""}; + return Corrade::Containers::Array{1}; } explicit AbstractPlugin(Corrade::PluginManager::AbstractManager &manager, const std::string &plugin) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e1d8db50d..a5e28750d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -45,7 +45,7 @@ target_link_libraries(visor-core datasketches rng timer - opentelemetry-cpp::opentelemetry_proto + opentelemetry-cpp::proto protobuf::libprotobuf maxminddb::maxminddb Corrade::Corrade diff --git a/src/CoreRegistry.cpp b/src/CoreRegistry.cpp index 408f8c1dd..fc6864d00 100644 --- a/src/CoreRegistry.cpp +++ b/src/CoreRegistry.cpp @@ -8,6 +8,8 @@ #include "InputStreamManager.h" #include "Policies.h" #include "Taps.h" +#include "CorradeCompat.h" +#include #include #include #include @@ -62,7 +64,7 @@ void CoreRegistry::start(HttpServer *svr) InputPluginPtr mod = _input_registry.instantiate(alias); _logger->info("Load input stream plugin: {} version {} interface {}", alias, version, mod->pluginInterface()); mod->init_plugin(this, svr, &geo::GeoIP(), &geo::GeoASN()); - auto result = _input_plugins.insert({std::make_pair(alias, version), std::move(mod)}); + auto result = _input_plugins.try_emplace(std::make_pair(corrade_to_std_string(alias), version), std::move(mod)); if (!result.second) { throw std::runtime_error(fmt::format("Input alias '{}' with version '{}' was already loaded.", alias, version)); } @@ -92,7 +94,7 @@ void CoreRegistry::start(HttpServer *svr) HandlerPluginPtr mod = _handler_registry.instantiate(s); _logger->info("Load stream handler plugin: {} version {} interface {}", alias, version, mod->pluginInterface()); mod->init_plugin(this, svr, &geo::GeoIP(), &geo::GeoASN()); - auto result = _handler_plugins.insert({std::make_pair(alias, version), std::move(mod)}); + auto result = _handler_plugins.try_emplace(std::make_pair(corrade_to_std_string(alias), version), std::move(mod)); if (!result.second) { throw std::runtime_error(fmt::format("Handler alias '{}' with version '{}' was already loaded.", alias, version)); } diff --git a/src/CorradeCompat.h b/src/CorradeCompat.h new file mode 100644 index 000000000..12ef94f5d --- /dev/null +++ b/src/CorradeCompat.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include +#include + +inline std::string corrade_to_std_string(Corrade::Containers::StringView view) +{ + return {view.data(), view.size()}; +} + +template <> +struct fmt::formatter : fmt::formatter { + auto format(Corrade::Containers::StringView value, format_context &ctx) const -> format_context::iterator + { + return fmt::formatter::format(fmt::string_view{value.data(), value.size()}, ctx); + } +}; diff --git a/src/HandlerModulePlugin.h b/src/HandlerModulePlugin.h index 7e1d19f71..6d005b307 100644 --- a/src/HandlerModulePlugin.h +++ b/src/HandlerModulePlugin.h @@ -21,14 +21,15 @@ class HandlerModulePlugin : public AbstractPlugin static geo::MaxmindDB *asn; static geo::MaxmindDB *city; - static std::string pluginInterface() + static Corrade::Containers::StringView pluginInterface() { - return "visor.module.handler/1.0"; + using namespace Corrade::Containers::Literals; + return "visor.module.handler/1.0"_s; } - static std::vector pluginSearchPaths() + static Corrade::Containers::Array pluginSearchPaths() { - return {""}; + return Corrade::Containers::Array{1}; } explicit HandlerModulePlugin(Corrade::PluginManager::AbstractManager &manager, const std::string &plugin) diff --git a/src/InputModulePlugin.h b/src/InputModulePlugin.h index d11ddbbcf..4c069292e 100644 --- a/src/InputModulePlugin.h +++ b/src/InputModulePlugin.h @@ -18,14 +18,15 @@ class InputModulePlugin : public AbstractPlugin { public: - static std::string pluginInterface() + static Corrade::Containers::StringView pluginInterface() { - return "visor.module.input/1.0"; + using namespace Corrade::Containers::Literals; + return "visor.module.input/1.0"_s; } - static std::vector pluginSearchPaths() + static Corrade::Containers::Array pluginSearchPaths() { - return {""}; + return Corrade::Containers::Array{1}; } explicit InputModulePlugin(Corrade::PluginManager::AbstractManager &manager, const std::string &plugin) diff --git a/src/Policies.cpp b/src/Policies.cpp index b292be7f2..81dfd02b9 100644 --- a/src/Policies.cpp +++ b/src/Policies.cpp @@ -7,6 +7,7 @@ #include "HandlerManager.h" #include "InputStreamManager.h" #include "Taps.h" +#include "CorradeCompat.h" #include #include #include @@ -88,7 +89,7 @@ std::vector PolicyManager::load(const YAML::Node &policy_yaml, bool si auto [tap, tap_lock] = _registry->tap_manager()->module_get_locked(tap_name); policy_ptr->add_tap(tap); // ensure tap input type matches policy input tap - if (input_node["input_type"].as() != tap->input_plugin()->plugin()) { + if (input_node["input_type"].as() != corrade_to_std_string(tap->input_plugin()->plugin())) { throw PolicyException(fmt::format("input_type for policy specified tap '{}' doesn't match tap's defined input type: {}/{}", tap_name, input_node["input_type"].as(), tap->input_plugin()->plugin())); } // handler internal config diff --git a/src/Taps.h b/src/Taps.h index 3f51f0d58..12af29b90 100644 --- a/src/Taps.h +++ b/src/Taps.h @@ -9,6 +9,7 @@ #include "Configurable.h" #include "InputModulePlugin.h" #include +#include "CorradeCompat.h" namespace visor { @@ -56,7 +57,7 @@ class Tap : public AbstractModule void info_json(json &j) const override { - j["input_type"] = _input_plugin->plugin(); + j["input_type"] = corrade_to_std_string(_input_plugin->plugin()); j["interface"] = _input_plugin->pluginInterface(); config_json(j["config"]); _tags->config_json(j["tags"]); diff --git a/src/handlers/static_plugins.h b/src/handlers/static_plugins.h index 2a968cca2..063a36c33 100644 --- a/src/handlers/static_plugins.h +++ b/src/handlers/static_plugins.h @@ -1,5 +1,8 @@ #pragma once +#include +#include + static int import_handler_plugins() { CORRADE_PLUGIN_IMPORT(VisorHandlerNet); diff --git a/src/inputs/static_plugins.h b/src/inputs/static_plugins.h index 9d0e68d39..3ea5574c6 100644 --- a/src/inputs/static_plugins.h +++ b/src/inputs/static_plugins.h @@ -1,5 +1,8 @@ #pragma once +#include +#include + static int import_input_plugins() { CORRADE_PLUGIN_IMPORT(VisorInputMock);