pluginsd_internals.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "pluginsd_internals.h"
  3. ssize_t send_to_plugin(const char *txt, void *data) {
  4. PARSER *parser = data;
  5. if(!txt || !*txt)
  6. return 0;
  7. #ifdef ENABLE_H2O
  8. if(parser->h2o_ctx)
  9. return h2o_stream_write(parser->h2o_ctx, txt, strlen(txt));
  10. #endif
  11. errno = 0;
  12. spinlock_lock(&parser->writer.spinlock);
  13. ssize_t bytes = -1;
  14. #ifdef ENABLE_HTTPS
  15. NETDATA_SSL *ssl = parser->ssl_output;
  16. if(ssl) {
  17. if(SSL_connection(ssl))
  18. bytes = netdata_ssl_write(ssl, (void *) txt, strlen(txt));
  19. else
  20. netdata_log_error("PLUGINSD: cannot send command (SSL)");
  21. spinlock_unlock(&parser->writer.spinlock);
  22. return bytes;
  23. }
  24. #endif
  25. if(parser->fp_output) {
  26. bytes = fprintf(parser->fp_output, "%s", txt);
  27. if(bytes <= 0) {
  28. netdata_log_error("PLUGINSD: cannot send command (FILE)");
  29. bytes = -2;
  30. }
  31. else
  32. fflush(parser->fp_output);
  33. spinlock_unlock(&parser->writer.spinlock);
  34. return bytes;
  35. }
  36. if(parser->fd != -1) {
  37. bytes = 0;
  38. ssize_t total = (ssize_t)strlen(txt);
  39. ssize_t sent;
  40. do {
  41. sent = write(parser->fd, &txt[bytes], total - bytes);
  42. if(sent <= 0) {
  43. netdata_log_error("PLUGINSD: cannot send command (fd)");
  44. spinlock_unlock(&parser->writer.spinlock);
  45. return -3;
  46. }
  47. bytes += sent;
  48. }
  49. while(bytes < total);
  50. spinlock_unlock(&parser->writer.spinlock);
  51. return (int)bytes;
  52. }
  53. spinlock_unlock(&parser->writer.spinlock);
  54. netdata_log_error("PLUGINSD: cannot send command (no output socket/pipe/file given to plugins.d parser)");
  55. return -4;
  56. }
  57. PARSER_RC PLUGINSD_DISABLE_PLUGIN(PARSER *parser, const char *keyword, const char *msg) {
  58. parser->user.enabled = 0;
  59. if(keyword && msg) {
  60. nd_log_limit_static_global_var(erl, 1, 0);
  61. nd_log_limit(&erl, NDLS_COLLECTORS, NDLP_INFO,
  62. "PLUGINSD: keyword %s: %s", keyword, msg);
  63. }
  64. return PARSER_RC_ERROR;
  65. }
  66. void pluginsd_keywords_init(PARSER *parser, PARSER_REPERTOIRE repertoire) {
  67. parser_init_repertoire(parser, repertoire);
  68. if (repertoire & (PARSER_INIT_PLUGINSD | PARSER_INIT_STREAMING))
  69. pluginsd_inflight_functions_init(parser);
  70. }
  71. void parser_destroy(PARSER *parser) {
  72. if (unlikely(!parser))
  73. return;
  74. pluginsd_inflight_functions_cleanup(parser);
  75. freez(parser);
  76. }
  77. PARSER *parser_init(struct parser_user_object *user, FILE *fp_input, FILE *fp_output, int fd,
  78. PARSER_INPUT_TYPE flags, void *ssl __maybe_unused) {
  79. PARSER *parser;
  80. parser = callocz(1, sizeof(*parser));
  81. if(user)
  82. parser->user = *user;
  83. parser->fd = fd;
  84. parser->fp_input = fp_input;
  85. parser->fp_output = fp_output;
  86. #ifdef ENABLE_HTTPS
  87. parser->ssl_output = ssl;
  88. #endif
  89. parser->flags = flags;
  90. spinlock_init(&parser->writer.spinlock);
  91. return parser;
  92. }