parser.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef NETDATA_INCREMENTAL_PARSER_H
  3. #define NETDATA_INCREMENTAL_PARSER_H 1
  4. #include "daemon/common.h"
  5. #define PARSER_MAX_CALLBACKS 20
  6. #define PARSER_MAX_RECOVER_KEYWORDS 128
  7. #define WORKER_PARSER_FIRST_JOB 3
  8. // this has to be in-sync with the same at receiver.c
  9. #define WORKER_RECEIVER_JOB_REPLICATION_COMPLETION (WORKER_PARSER_FIRST_JOB - 3)
  10. // PARSER return codes
  11. typedef enum parser_rc {
  12. PARSER_RC_OK, // Callback was successful, go on
  13. PARSER_RC_STOP, // Callback says STOP
  14. PARSER_RC_ERROR // Callback failed (abort rest of callbacks)
  15. } PARSER_RC;
  16. typedef enum parser_input_type {
  17. PARSER_INPUT_SPLIT = (1 << 1),
  18. PARSER_INPUT_KEEP_ORIGINAL = (1 << 2),
  19. PARSER_INPUT_PROCESSED = (1 << 3),
  20. PARSER_NO_PARSE_INIT = (1 << 4),
  21. PARSER_NO_ACTION_INIT = (1 << 5),
  22. PARSER_DEFER_UNTIL_KEYWORD = (1 << 6),
  23. } PARSER_INPUT_TYPE;
  24. #define PARSER_INPUT_FULL (PARSER_INPUT_SPLIT|PARSER_INPUT_ORIGINAL)
  25. typedef PARSER_RC (*keyword_function)(char **words, size_t num_words, void *user_data);
  26. typedef struct parser_keyword {
  27. size_t worker_job_id;
  28. char *keyword;
  29. uint32_t keyword_hash;
  30. int func_no;
  31. keyword_function func[PARSER_MAX_CALLBACKS+1];
  32. struct parser_keyword *next;
  33. } PARSER_KEYWORD;
  34. typedef struct parser_data {
  35. char *line;
  36. struct parser_data *next;
  37. } PARSER_DATA;
  38. typedef struct parser {
  39. size_t worker_job_next_id;
  40. uint8_t version; // Parser version
  41. RRDHOST *host;
  42. int fd; // Socket
  43. FILE *fp_input; // Input source e.g. stream
  44. FILE *fp_output; // Stream to send commands to plugin
  45. #ifdef ENABLE_HTTPS
  46. struct netdata_ssl *ssl_output;
  47. #endif
  48. PARSER_DATA *data; // extra input
  49. PARSER_KEYWORD *keyword; // List of parse keywords and functions
  50. void *user; // User defined structure to hold extra state between calls
  51. uint32_t flags;
  52. size_t line;
  53. char *(*read_function)(char *buffer, long unsigned int, void *input);
  54. int (*eof_function)(void *input);
  55. keyword_function unknown_function;
  56. char buffer[PLUGINSD_LINE_MAX];
  57. char *recover_location[PARSER_MAX_RECOVER_KEYWORDS+1];
  58. char recover_input[PARSER_MAX_RECOVER_KEYWORDS];
  59. #ifdef ENABLE_HTTPS
  60. int bytesleft;
  61. char tmpbuffer[PLUGINSD_LINE_MAX];
  62. char *readfrom;
  63. #endif
  64. struct {
  65. const char *end_keyword;
  66. BUFFER *response;
  67. void (*action)(struct parser *parser, void *action_data);
  68. void *action_data;
  69. } defer;
  70. struct {
  71. DICTIONARY *functions;
  72. usec_t smaller_timeout;
  73. } inflight;
  74. } PARSER;
  75. int find_first_keyword(const char *str, char *keyword, int max_size, int (*custom_isspace)(char));
  76. PARSER *parser_init(RRDHOST *host, void *user, FILE *fp_input, FILE *fp_output, int fd, PARSER_INPUT_TYPE flags, void *ssl);
  77. int parser_add_keyword(PARSER *working_parser, char *keyword, keyword_function func);
  78. int parser_next(PARSER *working_parser);
  79. int parser_action(PARSER *working_parser, char *input);
  80. int parser_push(PARSER *working_parser, char *line);
  81. void parser_destroy(PARSER *working_parser);
  82. int parser_recover_input(PARSER *working_parser);
  83. size_t pluginsd_process(RRDHOST *host, struct plugind *cd, FILE *fp_plugin_input, FILE *fp_plugin_output, int trust_durations);
  84. PARSER_RC pluginsd_set(char **words, size_t num_words, void *user);
  85. PARSER_RC pluginsd_begin(char **words, size_t num_words, void *user);
  86. PARSER_RC pluginsd_end(char **words, size_t num_words, void *user);
  87. PARSER_RC pluginsd_chart(char **words, size_t num_words, void *user);
  88. PARSER_RC pluginsd_chart_definition_end(char **words, size_t num_words, void *user);
  89. PARSER_RC pluginsd_dimension(char **words, size_t num_words, void *user);
  90. PARSER_RC pluginsd_variable(char **words, size_t num_words, void *user);
  91. PARSER_RC pluginsd_flush(char **words, size_t num_words, void *user);
  92. PARSER_RC pluginsd_disable(char **words, size_t num_words, void *user);
  93. PARSER_RC pluginsd_label(char **words, size_t num_words, void *user);
  94. PARSER_RC pluginsd_overwrite(char **words, size_t num_words, void *user);
  95. PARSER_RC pluginsd_clabel_commit(char **words, size_t num_words, void *user);
  96. PARSER_RC pluginsd_clabel(char **words, size_t num_words, void *user);
  97. PARSER_RC pluginsd_replay_rrdset_begin(char **words, size_t num_words, void *user);
  98. PARSER_RC pluginsd_replay_rrddim_collection_state(char **words, size_t num_words, void *user);
  99. PARSER_RC pluginsd_replay_rrdset_collection_state(char **words, size_t num_words, void *user);
  100. PARSER_RC pluginsd_replay_set(char **words, size_t num_words, void *user);
  101. PARSER_RC pluginsd_replay_end(char **words, size_t num_words, void *user);
  102. #endif