From 869016b831f3a725126fdf00cfe8d6d12d7d985a Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Wed, 1 Sep 2021 09:27:14 +0100 Subject: [PATCH] Add print-ip-on-publish example plugin. --- plugins/README.md | 4 ++ plugins/examples/CMakeLists.txt | 1 + plugins/examples/Makefile | 3 +- .../print-ip-on-publish/CMakeLists.txt | 24 ++++++++ plugins/examples/print-ip-on-publish/Makefile | 28 +++++++++ .../mosquitto_print_ip_on_publish.c | 59 +++++++++++++++++++ .../examples/print-ip-on-publish/test.conf | 4 ++ plugins/examples/print-ip-on-publish/test.sh | 3 + 8 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 plugins/examples/print-ip-on-publish/CMakeLists.txt create mode 100644 plugins/examples/print-ip-on-publish/Makefile create mode 100644 plugins/examples/print-ip-on-publish/mosquitto_print_ip_on_publish.c create mode 100644 plugins/examples/print-ip-on-publish/test.conf create mode 100755 plugins/examples/print-ip-on-publish/test.sh diff --git a/plugins/README.md b/plugins/README.md index efea0c61..db545c77 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -55,3 +55,7 @@ verified the payload is the correct format before modifying it. This plugin adds the text string "hello " to the beginning of each payload, so with anything other than simple plain text messages it will corrupt the payload contents. + +## Examples / Print IP on publish +This is an **example** plugin that prints out client ID and IP address of any +client that publishes on a particular topic. diff --git a/plugins/examples/CMakeLists.txt b/plugins/examples/CMakeLists.txt index 751e5edb..dd5d6e3b 100644 --- a/plugins/examples/CMakeLists.txt +++ b/plugins/examples/CMakeLists.txt @@ -8,3 +8,4 @@ add_subdirectory(connection-state) add_subdirectory(delayed-auth) add_subdirectory(force-retain) add_subdirectory(payload-modification) +add_subdirectory(print-ip-on-publish) diff --git a/plugins/examples/Makefile b/plugins/examples/Makefile index bdb43214..f341dea3 100644 --- a/plugins/examples/Makefile +++ b/plugins/examples/Makefile @@ -6,7 +6,8 @@ DIRS= \ delayed-auth \ force-retain \ message-timestamp \ - payload-modification + payload-modification \ + print-ip-on-publish .PHONY : all binary check clean reallyclean test install uninstall diff --git a/plugins/examples/print-ip-on-publish/CMakeLists.txt b/plugins/examples/print-ip-on-publish/CMakeLists.txt new file mode 100644 index 00000000..dded1a23 --- /dev/null +++ b/plugins/examples/print-ip-on-publish/CMakeLists.txt @@ -0,0 +1,24 @@ +add_library(mosquitto_print_ip_on_publish MODULE + mosquitto_print_ip_on_publish.c +) + +target_include_directories(mosquitto_print_ip_on_publish PRIVATE + "${OPENSSL_INCLUDE_DIR}" + "${STDBOOL_H_PATH}" + "${STDINT_H_PATH}" + "${mosquitto_SOURCE_DIR}" + "${mosquitto_SOURCE_DIR}/include" +) + +link_directories(${mosquitto_SOURCE_DIR}) + +set_target_properties(mosquitto_print_ip_on_publish PROPERTIES + PREFIX "" + POSITION_INDEPENDENT_CODE 1 +) +if(WIN32) + target_link_libraries(mosquitto_print_ip_on_publish mosquitto) +endif() + +# Don't install, these are example plugins only. +#install(TARGETS mosquitto_print_ip_on_publish RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") diff --git a/plugins/examples/print-ip-on-publish/Makefile b/plugins/examples/print-ip-on-publish/Makefile new file mode 100644 index 00000000..08573269 --- /dev/null +++ b/plugins/examples/print-ip-on-publish/Makefile @@ -0,0 +1,28 @@ +include ../../../config.mk + +.PHONY : all binary check clean reallyclean test install uninstall + +PLUGIN_NAME=mosquitto_print_ip_on_publish +PLUGIN_CFLAGS+=-I../../../include -I../../../ + +all : binary + +binary : ${PLUGIN_NAME}.so + +${PLUGIN_NAME}.so : ${PLUGIN_NAME}.c + $(CROSS_COMPILE)$(CC) $(PLUGIN_CPPFLAGS) $(PLUGIN_CFLAGS) $(PLUGIN_LDFLAGS) -fPIC -shared $< -o $@ + +reallyclean : clean +clean: + -rm -f *.o ${PLUGIN_NAME}.so *.gcda *.gcno + +check: test +test: + +install: ${PLUGIN_NAME}.so + # Don't install, these are examples only. + #$(INSTALL) -d "${DESTDIR}$(libdir)" + #$(INSTALL) ${STRIP_OPTS} ${PLUGIN_NAME}.so "${DESTDIR}${libdir}/${PLUGIN_NAME}.so" + +uninstall : + -rm -f "${DESTDIR}${libdir}/${PLUGIN_NAME}.so" diff --git a/plugins/examples/print-ip-on-publish/mosquitto_print_ip_on_publish.c b/plugins/examples/print-ip-on-publish/mosquitto_print_ip_on_publish.c new file mode 100644 index 00000000..75b56eb0 --- /dev/null +++ b/plugins/examples/print-ip-on-publish/mosquitto_print_ip_on_publish.c @@ -0,0 +1,59 @@ +/* Example plugin that prints out the client id and IP address of any clients + * that publish to a particular topic, defined in "my_topic". */ +#include "config.h" + +#include +#include + +#include "mosquitto_broker.h" +#include "mosquitto_plugin.h" +#include "mosquitto.h" +#include "mqtt_protocol.h" + +static mosquitto_plugin_id_t *mosq_pid = NULL; + +static char my_topic[] = "troublesome/topic"; + +static int message_callback(int event, void *event_data, void *userdata) +{ + struct mosquitto_evt_message *ed = event_data; + + UNUSED(event); + UNUSED(userdata); + + if(!strcmp(ed->topic, my_topic)){ + printf("PUBLISH FROM %s on IP %s\n", mosquitto_client_id(ed->client), mosquitto_client_address(ed->client)); + } + return MOSQ_ERR_SUCCESS; +} + +int mosquitto_plugin_version(int supported_version_count, const int *supported_versions) +{ + int i; + + for(i=0; i