Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

upstream.h 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. #ifndef UPSTREAM_H
  2. #define UPSTREAM_H
  3. #include "config.h"
  4. #include "util.h"
  5. #include "rdns.h"
  6. #include "ucl.h"
  7. #ifdef __cplusplus
  8. extern "C" {
  9. #endif
  10. enum rspamd_upstream_rotation {
  11. RSPAMD_UPSTREAM_RANDOM = 0,
  12. RSPAMD_UPSTREAM_HASHED,
  13. RSPAMD_UPSTREAM_ROUND_ROBIN,
  14. RSPAMD_UPSTREAM_MASTER_SLAVE,
  15. RSPAMD_UPSTREAM_SEQUENTIAL,
  16. RSPAMD_UPSTREAM_UNDEF
  17. };
  18. enum rspamd_upstream_flag {
  19. RSPAMD_UPSTREAM_FLAG_NORESOLVE = (1 << 0),
  20. RSPAMD_UPSTREAM_FLAG_SRV_RESOLVE = (1 << 1),
  21. };
  22. struct rspamd_config;
  23. /* Opaque upstream structures */
  24. struct upstream;
  25. struct upstream_list;
  26. struct upstream_ctx;
  27. /**
  28. * Init upstreams library
  29. * @param resolver
  30. */
  31. struct upstream_ctx *rspamd_upstreams_library_init (void);
  32. /**
  33. * Remove reference from upstreams library
  34. */
  35. void rspamd_upstreams_library_unref (struct upstream_ctx *ctx);
  36. /**
  37. * Configure attributes of upstreams library
  38. * @param cfg
  39. */
  40. void rspamd_upstreams_library_config (struct rspamd_config *cfg,
  41. struct upstream_ctx *ctx, struct ev_loop *event_loop,
  42. struct rdns_resolver *resolver);
  43. /**
  44. * Upstream error logic
  45. * 1. During error time we count upstream_ok and upstream_fail
  46. * 2. If failcount is more then maxerrors then we mark upstream as unavailable for dead time
  47. * 3. After dead time we mark upstream as alive and go to the step 1
  48. * 4. If all upstreams are dead, marks every upstream as alive
  49. */
  50. /**
  51. * Add an error to an upstream
  52. */
  53. void rspamd_upstream_fail (struct upstream *upstream, gboolean addr_failure, const gchar *reason);
  54. /**
  55. * Increase upstream successes count
  56. */
  57. void rspamd_upstream_ok (struct upstream *up);
  58. /**
  59. * Set weight for an upstream
  60. * @param up
  61. */
  62. void rspamd_upstream_set_weight (struct upstream *up, guint weight);
  63. /**
  64. * Create new list of upstreams
  65. * @return
  66. */
  67. struct upstream_list *rspamd_upstreams_create (struct upstream_ctx *ctx);
  68. /**
  69. * Sets specific flag to the upstream list
  70. * @param ups
  71. * @param flags
  72. */
  73. void rspamd_upstreams_set_flags (struct upstream_list *ups,
  74. enum rspamd_upstream_flag flags);
  75. /**
  76. * Sets custom limits for upstreams
  77. * This function allocates memory from the upstreams ctx pool and should
  78. * not be called in cycles/constantly as this memory is likely persistent
  79. * @param ups
  80. * @param revive_time
  81. * @param revive_jitter
  82. * @param error_time
  83. * @param dns_timeout
  84. * @param max_errors
  85. * @param dns_retransmits
  86. */
  87. void rspamd_upstreams_set_limits (struct upstream_list *ups,
  88. gdouble revive_time,
  89. gdouble revive_jitter,
  90. gdouble error_time,
  91. gdouble dns_timeout,
  92. guint max_errors,
  93. guint dns_retransmits);
  94. /**
  95. * Sets rotation policy for upstreams list
  96. * @param ups
  97. * @param rot
  98. */
  99. void rspamd_upstreams_set_rotation (struct upstream_list *ups,
  100. enum rspamd_upstream_rotation rot);
  101. /**
  102. * Destroy list of upstreams
  103. * @param ups
  104. */
  105. void rspamd_upstreams_destroy (struct upstream_list *ups);
  106. /**
  107. * Returns count of upstreams in a list
  108. * @param ups
  109. * @return
  110. */
  111. gsize rspamd_upstreams_count (struct upstream_list *ups);
  112. /**
  113. * Returns the number of upstreams in the list
  114. * @param ups
  115. * @return
  116. */
  117. gsize rspamd_upstreams_alive (struct upstream_list *ups);
  118. enum rspamd_upstream_parse_type {
  119. RSPAMD_UPSTREAM_PARSE_DEFAULT = 0,
  120. RSPAMD_UPSTREAM_PARSE_NAMESERVER,
  121. };
  122. /**
  123. * Add upstream from the string
  124. * @param ups upstream list
  125. * @param str string in format "name[:port[:priority]]"
  126. * @param def_port default port number
  127. * @param data optional userdata
  128. * @return TRUE if upstream has been added
  129. */
  130. gboolean rspamd_upstreams_add_upstream (struct upstream_list *ups, const gchar *str,
  131. guint16 def_port, enum rspamd_upstream_parse_type parse_type,
  132. void *data);
  133. /**
  134. * Add multiple upstreams from comma, semicolon or space separated line
  135. * @param ups upstream list
  136. * @param str string in format "(<ups>([<sep>+]<ups>)*)+"
  137. * @param def_port default port number
  138. * @param data optional userdata
  139. * @return TRUE if **any** of upstreams has been added
  140. */
  141. gboolean rspamd_upstreams_parse_line (struct upstream_list *ups,
  142. const gchar *str, guint16 def_port, void *data);
  143. gboolean rspamd_upstreams_parse_line_len (struct upstream_list *ups,
  144. const gchar *str, gsize len,
  145. guint16 def_port,
  146. void *data);
  147. /**
  148. * Parse upstreams list from the UCL object
  149. * @param ups
  150. * @param in
  151. * @param def_port
  152. * @param data
  153. * @return
  154. */
  155. gboolean rspamd_upstreams_from_ucl (struct upstream_list *ups,
  156. const ucl_object_t *in, guint16 def_port, void *data);
  157. typedef void (*rspamd_upstream_traverse_func) (struct upstream *up, guint idx,
  158. void *ud);
  159. /**
  160. * Traverse upstreams list calling the function specified
  161. * @param ups
  162. * @param cb
  163. * @param ud
  164. */
  165. void rspamd_upstreams_foreach (struct upstream_list *ups,
  166. rspamd_upstream_traverse_func cb, void *ud);
  167. enum rspamd_upstreams_watch_event {
  168. RSPAMD_UPSTREAM_WATCH_SUCCESS = 1u << 0,
  169. RSPAMD_UPSTREAM_WATCH_FAILURE = 1u << 1,
  170. RSPAMD_UPSTREAM_WATCH_OFFLINE = 1u << 2,
  171. RSPAMD_UPSTREAM_WATCH_ONLINE = 1u << 3,
  172. RSPAMD_UPSTREAM_WATCH_ALL = (1u << 0) | (1u << 1) | (1u << 2) | (1u << 3),
  173. };
  174. typedef void (*rspamd_upstream_watch_func) (struct upstream *up,
  175. enum rspamd_upstreams_watch_event event,
  176. guint cur_errors,
  177. void *ud);
  178. /**
  179. * Adds new watcher to the upstreams list
  180. * @param ups
  181. * @param events
  182. * @param func
  183. * @param ud
  184. */
  185. void rspamd_upstreams_add_watch_callback (struct upstream_list *ups,
  186. enum rspamd_upstreams_watch_event events,
  187. rspamd_upstream_watch_func func,
  188. GFreeFunc free_func,
  189. gpointer ud);
  190. /**
  191. * Returns the next IP address of the upstream (internal rotation)
  192. * @param up
  193. * @return
  194. */
  195. rspamd_inet_addr_t *rspamd_upstream_addr_next (struct upstream *up);
  196. /**
  197. * Returns the current IP address of the upstream
  198. * @param up
  199. * @return
  200. */
  201. rspamd_inet_addr_t *rspamd_upstream_addr_cur (const struct upstream *up);
  202. /**
  203. * Add custom address for an upstream (ownership of addr is transferred to upstream)
  204. * @param up
  205. * @return
  206. */
  207. gboolean rspamd_upstream_add_addr (struct upstream *up,
  208. rspamd_inet_addr_t *addr);
  209. /**
  210. * Returns the symbolic name of the upstream
  211. * @param up
  212. * @return
  213. */
  214. const gchar *rspamd_upstream_name (struct upstream *up);
  215. /**
  216. * Returns the port of the current address for the upstream
  217. * @param up
  218. * @return
  219. */
  220. gint rspamd_upstream_port (struct upstream *up);
  221. /**
  222. * Sets opaque user data associated with this upstream
  223. * @param up
  224. * @param data
  225. * @return old data
  226. */
  227. gpointer rspamd_upstream_set_data (struct upstream *up, gpointer data);
  228. /**
  229. * Gets opaque user data associated with this upstream
  230. * @param up
  231. * @return
  232. */
  233. gpointer rspamd_upstream_get_data (struct upstream *up);
  234. /**
  235. * Get new upstream from the list
  236. * @param ups upstream list
  237. * @param type type of rotation algorithm, for `RSPAMD_UPSTREAM_HASHED` it is required to specify `key` and `keylen` as arguments
  238. * @return
  239. */
  240. struct upstream *rspamd_upstream_get (struct upstream_list *ups,
  241. enum rspamd_upstream_rotation default_type,
  242. const guchar *key, gsize keylen);
  243. /**
  244. * Get new upstream from the list
  245. * @param ups upstream list
  246. * @param type type of rotation algorithm, for `RSPAMD_UPSTREAM_HASHED` it is required to specify `key` and `keylen` as arguments
  247. * @return
  248. */
  249. struct upstream *rspamd_upstream_get_forced (struct upstream_list *ups,
  250. enum rspamd_upstream_rotation forced_type,
  251. const guchar *key, gsize keylen);
  252. /**
  253. * Get new upstream from the list excepting the upstream specified
  254. * @param ups upstream list
  255. * @param type type of rotation algorithm, for `RSPAMD_UPSTREAM_HASHED` it is required to specify `key` and `keylen` as arguments
  256. * @return
  257. */
  258. struct upstream *rspamd_upstream_get_except (struct upstream_list *ups,
  259. struct upstream *except,
  260. enum rspamd_upstream_rotation default_type,
  261. const guchar *key, gsize keylen);
  262. /**
  263. * Re-resolve addresses for all upstreams registered
  264. */
  265. void rspamd_upstream_reresolve (struct upstream_ctx *ctx);
  266. /**
  267. * Share ownership on upstream
  268. * @param up
  269. * @return
  270. */
  271. struct upstream* rspamd_upstream_ref (struct upstream *up);
  272. /**
  273. * Unshare ownership on upstream
  274. * @param up
  275. */
  276. void rspamd_upstream_unref (struct upstream *up);
  277. #ifdef __cplusplus
  278. }
  279. #endif
  280. #endif /* UPSTREAM_H */