Daemon C++ — code complet commenté
Cette page contient le code complet actuel de nodes/agent, avec une explication courte
avant chaque fichier pour faciliter la lecture et le debug.
Périmètre couvert
- Build et packaging:
CMakeLists.txt,packaging/ - Headers:
include/*.hpp - Implémentations:
src/*.cpp - Config d'exemple installée:
packaging/config/node.json
nodes/agent/CMakeLists.txt
Ce fichier définit la compilation C++17, les dépendances (jansson/sqlite/gpiod/mosquitto/grpc), la cible leukos-node, et le packaging DEB/systemd.
cmake_minimum_required(VERSION 3.16)
project(leukos-node VERSION 1.0.0 LANGUAGES CXX)
option(LEUKOS_AGENT_ENABLE_SYSTEMD_PACKAGING "Install systemd unit and CPack metadata" ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
find_package(PkgConfig REQUIRED)
pkg_check_modules(JANSSON REQUIRED IMPORTED_TARGET jansson)
pkg_check_modules(SQLITE3 REQUIRED IMPORTED_TARGET sqlite3)
pkg_check_modules(GPIOD REQUIRED IMPORTED_TARGET libgpiod)
if(GPIOD_VERSION VERSION_GREATER_EQUAL "2")
add_compile_definitions(LEUKOS_GPIOD_V2=1)
endif()
# libmosquitto ships a plain .pc as "libmosquitto"
pkg_check_modules(MOSQUITTO REQUIRED IMPORTED_TARGET libmosquitto)
# gRPC C++ (generic/codec-less service, JSON payloads). Buildroot's grpc package
# installs pkg-config files; fall back to the CMake config package otherwise.
pkg_check_modules(GRPCPP IMPORTED_TARGET grpc++)
if(NOT GRPCPP_FOUND)
find_package(gRPC CONFIG REQUIRED)
endif()
find_package(Threads REQUIRED)
add_executable(leukos-node
src/main.cpp
src/config.cpp
src/local_db.cpp
src/gpio_manager.cpp
src/relay_manager.cpp
src/valve_manager.cpp
src/meter_manager.cpp
src/scheduler.cpp
src/watchdog.cpp
src/mqtt_client.cpp
src/device_bridge.cpp
src/local_api.cpp
src/grpc_server.cpp
src/node.cpp
)
target_include_directories(leukos-node PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(leukos-node PRIVATE
PkgConfig::JANSSON
PkgConfig::SQLITE3
PkgConfig::GPIOD
PkgConfig::MOSQUITTO
Threads::Threads
)
if(GRPCPP_FOUND)
target_link_libraries(leukos-node PRIVATE PkgConfig::GRPCPP)
else()
target_link_libraries(leukos-node PRIVATE gRPC::grpc++)
endif()
install(TARGETS leukos-node RUNTIME DESTINATION /usr/bin)
if(LEUKOS_AGENT_ENABLE_SYSTEMD_PACKAGING)
install(PROGRAMS
packaging/bin/leukos-agent
packaging/bin/leukos-agent-heartbeat
DESTINATION /usr/bin
)
install(FILES
packaging/systemd/leukos-agent.service
packaging/systemd/leukos-agent-heartbeat.service
packaging/systemd/leukos-agent-heartbeat.timer
DESTINATION /lib/systemd/system
)
install(FILES
packaging/config/node.json
DESTINATION /etc/leukos
RENAME node.json.example
)
install(DIRECTORY DESTINATION /var/lib/leukos)
set(CPACK_PACKAGE_NAME "leukos-agent")
set(CPACK_PACKAGE_VENDOR "LeukOS")
set(CPACK_PACKAGE_CONTACT "ops@leukos.local")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "LeukOS automation agent daemon")
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}")
set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "LeukOS")
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
set(CPACK_DEBIAN_PACKAGE_SECTION "utils")
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
# Keep runtime complete on target hosts. shlibdeps adds ABI-level shared-lib deps,
# this list covers service/runtime tooling and local MQTT broker availability.
set(CPACK_DEBIAN_PACKAGE_DEPENDS "systemd, python3, curl, ca-certificates, mosquitto")
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
"${CMAKE_CURRENT_SOURCE_DIR}/packaging/debian/postinst;${CMAKE_CURRENT_SOURCE_DIR}/packaging/debian/prerm"
)
include(CPack)
endif()