From 08b8429b8dddfca284172dfcab5ac5b1ef8fa420 Mon Sep 17 00:00:00 2001 From: Sangwan Kwon Date: Mon, 21 Oct 2019 17:57:38 +0900 Subject: [PATCH] Apply server-client feature - Add daemon named vistd - Expose client api "Query::Execute()" Signed-off-by: Sangwan Kwon --- packaging/vist.spec | 1 + src/vist/CMakeLists.txt | 20 +++++++++- src/vist/client/CMakeLists.txt | 18 +++++++++ src/vist/client/query.cpp | 34 ++++++++++++++++ src/vist/client/query.h | 32 +++++++++++++++ src/vist/client/tests/client_tests.cpp | 32 +++++++++++++++ src/vist/{ipc => common}/CMakeLists.txt | 4 +- src/vist/{ => common}/ipc/client.h | 2 + src/vist/{ => common}/ipc/server.h | 2 + src/vist/{ => common}/ipc/tests/ipc_tests.cpp | 11 ++---- src/vist/main/main.cpp | 31 +++++++++++++++ src/vist/service/CMakeLists.txt | 18 +++++++++ src/vist/service/tests/daemon_tests.cpp | 34 ++++++++++++++++ src/vist/service/vistd.cpp | 56 +++++++++++++++++++++++++++ src/vist/service/vistd.h | 36 +++++++++++++++++ 15 files changed, 320 insertions(+), 11 deletions(-) create mode 100644 src/vist/client/CMakeLists.txt create mode 100644 src/vist/client/query.cpp create mode 100644 src/vist/client/query.h create mode 100644 src/vist/client/tests/client_tests.cpp rename src/vist/{ipc => common}/CMakeLists.txt (90%) rename src/vist/{ => common}/ipc/client.h (97%) rename src/vist/{ => common}/ipc/server.h (97%) rename src/vist/{ => common}/ipc/tests/ipc_tests.cpp (95%) create mode 100644 src/vist/main/main.cpp create mode 100644 src/vist/service/CMakeLists.txt create mode 100644 src/vist/service/tests/daemon_tests.cpp create mode 100644 src/vist/service/vistd.cpp create mode 100644 src/vist/service/vistd.h diff --git a/packaging/vist.spec b/packaging/vist.spec index 4a4ad7e..f88f53c 100644 --- a/packaging/vist.spec +++ b/packaging/vist.spec @@ -91,6 +91,7 @@ rm -rf %{buildroot} %license LICENSE-Apache-2.0 %license LICENSE-GPL-2.0 %license LICENSE-MIT +%{_bindir}/vistd %{vist_script_dir}/*.sql %dir %attr(-, %{user_name}, %{group_name}) %{vist_db_dir} %dir %attr(-, %{user_name}, %{group_name}) %{vist_plugin_dir} diff --git a/src/vist/CMakeLists.txt b/src/vist/CMakeLists.txt index 203118a..db63cb9 100644 --- a/src/vist/CMakeLists.txt +++ b/src/vist/CMakeLists.txt @@ -12,21 +12,39 @@ # See the License for the specific language governing permissions and # limitations under the License +SET(TARGET_VIST_DAEMON vistd) SET(TARGET_VIST_TEST vist-test) SET(${TARGET_VIST_LIB}_SRCS "") SET(${TARGET_VIST_LIB}_DEPS "") SET(${TARGET_VIST_LIB}_TESTS "") -ADD_SUBDIRECTORY(ipc) +INCLUDE_DIRECTORIES(. common) + +ADD_SUBDIRECTORY(client) +ADD_SUBDIRECTORY(common) ADD_SUBDIRECTORY(manager) ADD_SUBDIRECTORY(notification) ADD_SUBDIRECTORY(property) +ADD_SUBDIRECTORY(service) ADD_LIBRARY(${TARGET_VIST_LIB} STATIC ${${TARGET_VIST_LIB}_SRCS}) TARGET_LINK_LIBRARIES(${TARGET_VIST_LIB} ${${TARGET_VIST_LIB}_DEPS} ${TARGET_OSQUERY_LIB}) +ADD_EXECUTABLE(${TARGET_VIST_DAEMON} main/main.cpp) +TARGET_LINK_LIBRARIES(${TARGET_VIST_DAEMON} ${TARGET_VIST_LIB}) +TARGET_LINK_WHOLE(${TARGET_VIST_DAEMON} ${TARGET_OSQUERY_LIB}) +INSTALL(TARGETS ${TARGET_VIST_DAEMON} + DESTINATION ${CMAKE_INSTALL_BINDIR} + PERMISSIONS OWNER_READ + OWNER_WRITE + OWNER_EXECUTE + GROUP_READ + GROUP_EXECUTE + WORLD_READ + WORLD_EXECUTE) + ADD_EXECUTABLE(${TARGET_VIST_TEST} main/tests.cpp ${${TARGET_VIST_LIB}_TESTS}) TARGET_LINK_LIBRARIES(${TARGET_VIST_TEST} ${TARGET_VIST_LIB} diff --git a/src/vist/client/CMakeLists.txt b/src/vist/client/CMakeLists.txt new file mode 100644 index 0000000..821d857 --- /dev/null +++ b/src/vist/client/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License + +ADD_VIST_LIBRARY(vist_client query.cpp) + +FILE(GLOB CLIENT_TESTS "tests/*.cpp") +ADD_VIST_TEST(${CLIENT_TESTS}) diff --git a/src/vist/client/query.cpp b/src/vist/client/query.cpp new file mode 100644 index 0000000..29783ad --- /dev/null +++ b/src/vist/client/query.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +#include "query.h" + +#include "ipc/client.h" + +namespace { + const std::string SOCK_ADDR = "/tmp/.vistd"; +} // anonymous namespace + +namespace vist { + +Rows Query::Execute(const std::string& statement) +{ + auto& client = ipc::Client::Instance(SOCK_ADDR); + + return client->methodCall("Vistd::query", statement); +} + +} // namespace vist diff --git a/src/vist/client/query.h b/src/vist/client/query.h new file mode 100644 index 0000000..ccce173 --- /dev/null +++ b/src/vist/client/query.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +#pragma once + +#include +#include +#include + +namespace vist { + +using Row = std::map; +using Rows = std::vector; + +struct Query final { + static Rows Execute(const std::string& statement); +}; + +} // namespace vist diff --git a/src/vist/client/tests/client_tests.cpp b/src/vist/client/tests/client_tests.cpp new file mode 100644 index 0000000..d05d5db --- /dev/null +++ b/src/vist/client/tests/client_tests.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +#include + +#include "../query.h" + +#include +#include + +using namespace vist; + +class ClientTests : public testing::Test {}; + +TEST_F(ClientTests, query) { + auto rows = Query::Execute("SELECT * FROM policy"); + + EXPECT_TRUE(rows.size() > 0); +} diff --git a/src/vist/ipc/CMakeLists.txt b/src/vist/common/CMakeLists.txt similarity index 90% rename from src/vist/ipc/CMakeLists.txt rename to src/vist/common/CMakeLists.txt index 68418d1..717a17f 100644 --- a/src/vist/ipc/CMakeLists.txt +++ b/src/vist/common/CMakeLists.txt @@ -12,5 +12,5 @@ # See the License for the specific language governing permissions and # limitations under the License -FILE(GLOB SERVER_TESTS "tests/*.cpp") -ADD_VIST_TEST(${SERVER_TESTS}) +FILE(GLOB IPC_TESTS "ipc/tests/*.cpp") +ADD_VIST_TEST(${IPC_TESTS}) diff --git a/src/vist/ipc/client.h b/src/vist/common/ipc/client.h similarity index 97% rename from src/vist/ipc/client.h rename to src/vist/common/ipc/client.h index ddf7a5c..5e39a57 100644 --- a/src/vist/ipc/client.h +++ b/src/vist/common/ipc/client.h @@ -21,6 +21,7 @@ #include +namespace vist { namespace ipc { class Client final { @@ -49,3 +50,4 @@ private: }; } // namespace ipc +} // namespace vist diff --git a/src/vist/ipc/server.h b/src/vist/common/ipc/server.h similarity index 97% rename from src/vist/ipc/server.h rename to src/vist/common/ipc/server.h index 5bbcc49..667d6b1 100644 --- a/src/vist/ipc/server.h +++ b/src/vist/common/ipc/server.h @@ -21,6 +21,7 @@ #include +namespace vist { namespace ipc { class Server final { @@ -46,3 +47,4 @@ private: }; } // namespace ipc +} // namespace vist diff --git a/src/vist/ipc/tests/ipc_tests.cpp b/src/vist/common/ipc/tests/ipc_tests.cpp similarity index 95% rename from src/vist/ipc/tests/ipc_tests.cpp rename to src/vist/common/ipc/tests/ipc_tests.cpp index 40b7451..e9f656e 100644 --- a/src/vist/ipc/tests/ipc_tests.cpp +++ b/src/vist/common/ipc/tests/ipc_tests.cpp @@ -16,8 +16,8 @@ #include -#include "../server.h" -#include "../client.h" +#include "ipc/server.h" +#include "ipc/client.h" #include #include @@ -25,15 +25,10 @@ #include #include -using namespace ipc; +using namespace vist; namespace { std::string g_socket = "/tmp/vist-test"; - - void init() - { - } - } // anonymous namespace class TestServer { diff --git a/src/vist/main/main.cpp b/src/vist/main/main.cpp new file mode 100644 index 0000000..edee3f4 --- /dev/null +++ b/src/vist/main/main.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +#include "service/vistd.h" + +#include +#include + +int main() try +{ + vist::Vistd vistd; + vistd.start(); + + return EXIT_SUCCESS; +} catch(const std::exception&) +{ + return EXIT_FAILURE; +} diff --git a/src/vist/service/CMakeLists.txt b/src/vist/service/CMakeLists.txt new file mode 100644 index 0000000..d02ecd1 --- /dev/null +++ b/src/vist/service/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License + +ADD_VIST_LIBRARY(vist_daemon vistd.cpp) + +FILE(GLOB DAEMON_TESTS "tests/*.cpp") +ADD_VIST_TEST(${DAEMON_TESTS}) diff --git a/src/vist/service/tests/daemon_tests.cpp b/src/vist/service/tests/daemon_tests.cpp new file mode 100644 index 0000000..0de3101 --- /dev/null +++ b/src/vist/service/tests/daemon_tests.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +#include + +#include "../vistd.h" +#include "ipc/client.h" + +#include +#include + +using namespace vist; + +class DaemonTests : public testing::Test {}; + +TEST_F(DaemonTests, query) { + Vistd vistd; + auto rows = vistd.query("SELECT * FROM policy"); + + EXPECT_TRUE(rows.size() > 0); +} diff --git a/src/vist/service/vistd.cpp b/src/vist/service/vistd.cpp new file mode 100644 index 0000000..3b4ec1e --- /dev/null +++ b/src/vist/service/vistd.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +#include "vistd.h" +#include "ipc/server.h" + +#include + +#include +#include +#include + +#define QUERY_RET_TYPE std::vector> + +namespace { + const std::string SOCK_ADDR = "/tmp/.vistd"; +} // anonymous namespace + +namespace vist { + +Vistd::Vistd() +{ + osquery::registryAndPluginInit(); +} + +void Vistd::start() +{ + auto& server = ipc::Server::Instance(SOCK_ADDR); + + server->expose(this, "", (QUERY_RET_TYPE)(Vistd::query)(std::string)); + server->start(); +} + +Rows Vistd::query(const std::string& statement) +{ + osquery::SQL sql(statement, true); + if (!sql.ok()) + throw std::runtime_error("Faild to execute query: " + sql.getMessageString()); + + return std::move(sql.rows()); +} + +} // namespace vist diff --git a/src/vist/service/vistd.h b/src/vist/service/vistd.h new file mode 100644 index 0000000..897e9f3 --- /dev/null +++ b/src/vist/service/vistd.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +#pragma once + +#include +#include +#include + +namespace vist { + +using Row = std::map; +using Rows = std::vector; + +class Vistd final { +public: + explicit Vistd(); + + Rows query(const std::string& statement); + void start(); +}; + +} // namespace vist -- 2.7.4