Skip to content

Commit 03c68e7

Browse files
authored
Merge pull request #67 from wazuh/enhancement/64-address-technical-debt-for-the-new-agent-mvp
Enhancement/64 address technical debt for the new agent mvp
2 parents 4c098f2 + 842abd4 commit 03c68e7

35 files changed

+716
-589
lines changed

src/CMakeLists.txt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,15 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
55
set(CMAKE_BUILD_TYPE RelWithDebInfo)
66
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
77

8-
# Set vcpkg toolchain file
98
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake")
109

1110
project(wazuh-agent)
1211

13-
add_executable(wazuh-agent agent/src/main.cpp)
14-
15-
# Add the subdirectory for each child project
1612
add_subdirectory(agent)
1713

18-
target_include_directories(wazuh-agent PUBLIC ${CMAKE_SOURCE_DIR}/agent/include)
19-
20-
target_link_libraries(wazuh-agent agent)
14+
add_executable(wazuh-agent agent/src/main.cpp)
15+
target_link_libraries(wazuh-agent Agent)
2116

17+
if(BUILD_TESTS)
18+
enable_testing()
19+
endif()

src/agent/CMakeLists.txt

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,25 @@ set(VCPKG_MANIFEST_DIR ${CMAKE_SOURCE_DIR}/../)
1010

1111
project(Agent)
1212

13-
include_directories(include)
14-
1513
set(SOURCES
1614
src/agent.cpp
17-
src/message_task.cpp
1815
src/task_manager.cpp
1916
src/register.cpp
17+
src/signal_handler.cpp
2018
)
2119

22-
set(HEADERS
23-
include/agent.hpp
24-
include/itask_manager.hpp
25-
include/task_manager.hpp
26-
include/message_task.hpp
27-
include/register.hpp
28-
)
29-
30-
add_library(agent ${SOURCES} ${HEADERS})
31-
32-
find_package(Boost REQUIRED COMPONENTS asio)
33-
34-
set(INCLUDES
35-
${CMAKE_CURRENT_SOURCE_DIR}
36-
${CMAKE_CURRENT_SOURCE_DIR}/communicator/include
37-
${CMAKE_CURRENT_SOURCE_DIR}/agent_info/include
38-
)
39-
40-
target_include_directories(agent PUBLIC ${INCLUDES})
41-
42-
# Add the subdirectory for each child project
4320
add_subdirectory(agent_info)
4421
add_subdirectory(communicator)
4522
add_subdirectory(configuration_parser)
4623

47-
target_link_libraries(agent PUBLIC ConfigurationParser PRIVATE ${Boost_LIBRARIES} communicator AgentInfo)
24+
find_package(OpenSSL REQUIRED)
25+
find_package(Boost REQUIRED COMPONENTS asio beast)
26+
27+
add_library(Agent ${SOURCES})
28+
target_include_directories(Agent PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
29+
target_link_libraries(Agent PUBLIC ConfigurationParser Communicator AgentInfo PRIVATE OpenSSL::SSL OpenSSL::Crypto Boost::asio Boost::beast)
4830

4931
if(BUILD_TESTS)
32+
enable_testing()
5033
add_subdirectory(tests)
5134
endif()

src/agent/agent_info/CMakeLists.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.18)
1+
cmake_minimum_required(VERSION 3.22)
22

33
set(CMAKE_CXX_STANDARD 20)
44
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -11,12 +11,13 @@ set(VCPKG_MANIFEST_DIR ${CMAKE_SOURCE_DIR}/../../)
1111
project(AgentInfo)
1212

1313
find_package(SQLiteCpp REQUIRED)
14+
find_package(Boost REQUIRED COMPONENTS uuid)
1415

1516
add_library(AgentInfo src/agent_info.cpp src/agent_info_persistance.cpp)
16-
1717
target_include_directories(AgentInfo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
18-
target_link_libraries(AgentInfo PRIVATE SQLiteCpp)
18+
target_link_libraries(AgentInfo PRIVATE SQLiteCpp Boost::uuid)
1919

2020
if(BUILD_TESTS)
21+
enable_testing()
2122
add_subdirectory(tests)
2223
endif()

src/agent/agent_info/src/agent_info.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,22 @@
22

33
#include <agent_info_persistance.hpp>
44

5+
#include <boost/uuid/uuid_generators.hpp>
6+
#include <boost/uuid/uuid_io.hpp>
7+
58
AgentInfo::AgentInfo()
69
{
710
AgentInfoPersistance agentInfoPersistance;
811
m_name = agentInfoPersistance.GetName();
912
m_ip = agentInfoPersistance.GetIP();
1013
m_uuid = agentInfoPersistance.GetUUID();
14+
15+
if (m_uuid.empty())
16+
{
17+
AgentInfoPersistance agentInfoPersistance;
18+
m_uuid = boost::uuids::to_string(boost::uuids::random_generator()());
19+
agentInfoPersistance.SetUUID(m_uuid);
20+
}
1121
}
1222

1323
AgentInfo::AgentInfo(const std::string& name, const std::string& ip, const std::string& uuid)

src/agent/agent_info/tests/CMakeLists.txt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
find_package(GTest CONFIG REQUIRED)
22

3-
set(TEST_SOURCES
4-
agent_info_test.cpp
5-
agent_info_persistance_test.cpp
6-
)
7-
83
add_executable(agent_info_test agent_info_test.cpp)
94
target_include_directories(agent_info_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../include)
105
target_link_libraries(agent_info_test PRIVATE AgentInfo GTest::gtest)

src/agent/agent_info/tests/agent_info_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ TEST_F(AgentInfoTest, TestDefaultConstructorDefaultValues)
2424
const AgentInfo agentInfo;
2525
EXPECT_EQ(agentInfo.GetName(), "");
2626
EXPECT_EQ(agentInfo.GetIP(), "");
27-
EXPECT_EQ(agentInfo.GetUUID(), "");
27+
EXPECT_NE(agentInfo.GetUUID(), "");
2828
}
2929

3030
TEST_F(AgentInfoTest, TestParameterizedConstructor)
Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.24)
1+
cmake_minimum_required(VERSION 3.22)
22

33
set(CMAKE_CXX_STANDARD 20)
44
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -10,33 +10,16 @@ set(VCPKG_MANIFEST_DIR ${CMAKE_SOURCE_DIR}/../../)
1010

1111
project(Communicator)
1212

13-
include_directories(include)
14-
1513
find_package(OpenSSL REQUIRED)
16-
find_package(Boost REQUIRED COMPONENTS system url)
17-
if(Boost_FOUND)
18-
include_directories(${Boost_INCLUDE_DIRS})
19-
link_directories(${Boost_LIBRARY_DIRS})
20-
endif()
21-
14+
find_package(Boost REQUIRED COMPONENTS asio beast)
15+
find_package(nlohmann_json CONFIG REQUIRED)
2216
find_path(JWT_CPP_INCLUDE_DIRS "jwt-cpp/base.h")
2317

24-
add_library(communicator src/communicator.cpp)
25-
26-
set_target_properties(communicator PROPERTIES
27-
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
28-
29-
target_include_directories(communicator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${Boost_LIBRARIES} ${JWT_CPP_INCLUDE_DIRS} OpenSSL::SSL OpenSSL::Crypto)
30-
target_link_libraries(communicator PUBLIC ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto)
18+
add_library(Communicator src/communicator.cpp src/http_client.cpp)
19+
target_include_directories(Communicator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${JWT_CPP_INCLUDE_DIRS})
20+
target_link_libraries(Communicator PUBLIC Boost::asio PRIVATE Boost::beast OpenSSL::SSL OpenSSL::Crypto)
3121

3222
if(BUILD_TESTS)
33-
# Enable testing
3423
enable_testing()
35-
36-
find_package(nlohmann_json CONFIG REQUIRED)
37-
find_package(GTest CONFIG REQUIRED)
38-
39-
add_executable(communicator_test test/communicator_test.cpp src/communicator.cpp)
40-
target_include_directories(communicator_test PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${JWT_CPP_INCLUDE_DIRS})
41-
target_link_libraries(communicator_test PUBLIC ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main)
24+
add_subdirectory(tests)
4225
endif()
Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,44 @@
11
#pragma once
22

3-
#include <boost/asio.hpp>
4-
#include <boost/beast.hpp>
5-
#include <boost/beast/core.hpp>
6-
#include <boost/beast/http.hpp>
3+
#include <boost/asio/awaitable.hpp>
4+
#include <boost/asio/steady_timer.hpp>
5+
#include <boost/beast/http/status.hpp>
6+
7+
#include <atomic>
78
#include <functional>
9+
#include <memory>
10+
#include <mutex>
11+
#include <queue>
812
#include <string>
913

10-
namespace beast = boost::beast;
11-
namespace http = beast::http;
12-
1314
namespace communicator
1415
{
1516
class Communicator
1617
{
1718
public:
1819
Communicator(const std::string& uuid,
1920
const std::function<std::string(std::string, std::string)> GetStringConfigValue);
20-
~Communicator();
2121

22-
boost::asio::awaitable<void> GetCommandsFromManager();
2322
boost::asio::awaitable<void> WaitForTokenExpirationAndAuthenticate();
24-
25-
const std::string& GetToken() const;
23+
boost::asio::awaitable<void> GetCommandsFromManager(std::queue<std::string>& messageQueue);
24+
boost::asio::awaitable<void> StatefulMessageProcessingTask(std::queue<std::string>& messageQueue);
25+
boost::asio::awaitable<void> StatelessMessageProcessingTask(std::queue<std::string>& messageQueue);
2626

2727
private:
28-
std::mutex m_exitMtx;
29-
std::atomic<bool> m_exitFlag;
28+
long GetTokenRemainingSecs() const;
3029

31-
std::string m_uuid;
32-
std::string m_managerIp;
33-
std::string m_port;
34-
long long m_tokenExpTimeInSeconds;
35-
std::string m_token;
30+
boost::beast::http::status SendAuthenticationRequest();
3631

37-
const long GetTokenRemainingSecs() const;
32+
void TryReAuthenticate();
3833

39-
http::status SendAuthenticationRequest();
40-
http::response<http::dynamic_body> sendHttpRequest(http::verb method,
41-
const std::string& url,
42-
const std::string& token = "",
43-
const std::string& body = "");
34+
std::mutex m_reAuthMutex;
35+
std::atomic<bool> m_isReAuthenticating = false;
4436

45-
void Stop();
37+
std::string m_managerIp;
38+
std::string m_port;
39+
std::string m_uuid;
40+
std::string m_token;
41+
long long m_tokenExpTimeInSeconds = 0;
42+
std::unique_ptr<boost::asio::steady_timer> m_tokenExpTimer;
4643
};
4744
} // namespace communicator
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#pragma once
2+
3+
#include <boost/asio.hpp>
4+
#include <boost/beast.hpp>
5+
6+
#include <functional>
7+
#include <optional>
8+
#include <string>
9+
10+
namespace http_client
11+
{
12+
struct HttpRequestParams
13+
{
14+
boost::beast::http::verb method;
15+
std::string host;
16+
std::string port;
17+
std::string endpoint;
18+
std::string token;
19+
std::string user_pass;
20+
std::string body;
21+
22+
HttpRequestParams(boost::beast::http::verb method,
23+
const std::string& host,
24+
const std::string& port,
25+
const std::string& endpoint,
26+
const std::string& token = "",
27+
const std::string& user_pass = "",
28+
const std::string& body = "")
29+
: method(method)
30+
, host(host)
31+
, port(port)
32+
, endpoint(endpoint)
33+
, token(token)
34+
, user_pass(user_pass)
35+
, body(body)
36+
{
37+
}
38+
};
39+
40+
boost::beast::http::request<boost::beast::http::string_body> CreateHttpRequest(const HttpRequestParams& params);
41+
42+
boost::asio::awaitable<void>
43+
Co_PerformHttpRequest(boost::asio::ip::tcp::socket& socket,
44+
boost::beast::http::request<boost::beast::http::string_body>& req,
45+
boost::beast::error_code& ec,
46+
std::function<void()> onUnauthorized,
47+
std::function<void(const std::string&)> onSuccess = {});
48+
49+
boost::asio::awaitable<void> Co_MessageProcessingTask(const std::string& token,
50+
HttpRequestParams params,
51+
std::function<std::string()> messageGetter,
52+
std::function<void()> onUnauthorized,
53+
std::function<void(const std::string&)> onSuccess = {});
54+
55+
boost::beast::http::response<boost::beast::http::dynamic_body> PerformHttpRequest(const HttpRequestParams& params);
56+
57+
std::optional<std::string>
58+
AuthenticateWithUuid(const std::string& host, const std::string& port, const std::string& uuid);
59+
std::optional<std::string> AuthenticateWithUserPassword(const std::string& host,
60+
const std::string& port,
61+
const std::string& user,
62+
const std::string& password);
63+
} // namespace http_client

0 commit comments

Comments
 (0)