master
c 256 lines 6.29 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "web_api_v1.h"
4 #include "v1/api_v1_calls.h"
5 #include "v2/api_v2_calls.h"
6 #include "v3/api_v3_calls.h"
7
8 static struct web_api_command api_commands_v1[] = {
9 // time-series data APIs
10 {
11 .api = "data",
12 .hash = 0,
13 .acl = HTTP_ACL_METRICS,
14 .access = HTTP_ACCESS_ANONYMOUS_DATA,
15 .callback = api_v1_data,
16 .allow_subpaths = 0
17 },
18 #if defined(ENABLE_API_V1)
19 {
20 .api = "weights",
21 .hash = 0,
22 .acl = HTTP_ACL_METRICS,
23 .access = HTTP_ACCESS_ANONYMOUS_DATA,
24 .callback = api_v1_weights,
25 .allow_subpaths = 0
26 },
27 {
28 // deprecated - do not use anymore - use "weights"
29 .api = "metric_correlations",
30 .hash = 0,
31 .acl = HTTP_ACL_METRICS,
32 .access = HTTP_ACCESS_ANONYMOUS_DATA,
33 .callback = api_v1_metric_correlations,
34 .allow_subpaths = 0
35 },
36 #endif
37 {
38 .api = "badge.svg",
39 .hash = 0,
40 .acl = HTTP_ACL_BADGES,
41 .access = HTTP_ACCESS_ANONYMOUS_DATA,
42 .callback = api_v1_badge,
43 .allow_subpaths = 0
44 },
45 {
46 // exporting API
47 .api = "allmetrics",
48 .hash = 0,
49 .acl = HTTP_ACL_METRICS,
50 .access = HTTP_ACCESS_ANONYMOUS_DATA,
51 .callback = api_v1_allmetrics,
52 .allow_subpaths = 0
53 },
54
55 // alerts APIs
56 #if defined(ENABLE_API_V1)
57 {
58 .api = "alarms",
59 .hash = 0,
60 .acl = HTTP_ACL_ALERTS,
61 .access = HTTP_ACCESS_ANONYMOUS_DATA,
62 .callback = api_v1_alarms,
63 .allow_subpaths = 0
64 },
65 {
66 .api = "alarms_values",
67 .hash = 0,
68 .acl = HTTP_ACL_ALERTS,
69 .access = HTTP_ACCESS_ANONYMOUS_DATA,
70 .callback = api_v1_alarms_values,
71 .allow_subpaths = 0
72 },
73 {
74 .api = "alarm_log",
75 .hash = 0,
76 .acl = HTTP_ACL_ALERTS,
77 .access = HTTP_ACCESS_ANONYMOUS_DATA,
78 .callback = api_v1_alarm_log,
79 .allow_subpaths = 0
80 },
81 {
82 .api = "alarm_variables",
83 .hash = 0,
84 .acl = HTTP_ACL_ALERTS,
85 .access = HTTP_ACCESS_ANONYMOUS_DATA,
86 .callback = api_v1_alarm_variables,
87 .allow_subpaths = 0
88 },
89 {
90 .api = "variable",
91 .hash = 0,
92 .acl = HTTP_ACL_ALERTS,
93 .access = HTTP_ACCESS_ANONYMOUS_DATA,
94 .callback = api_v1_variable,
95 .allow_subpaths = 0
96 },
97 {
98 .api = "alarm_count",
99 .hash = 0,
100 .acl = HTTP_ACL_ALERTS,
101 .access = HTTP_ACCESS_ANONYMOUS_DATA,
102 .callback = api_v1_alarm_count,
103 .allow_subpaths = 0
104 },
105 #endif
106
107 // functions APIs - they check permissions per function call
108 {
109 .api = "function",
110 .hash = 0,
111 .acl = HTTP_ACL_FUNCTIONS,
112 .access = HTTP_ACCESS_ANONYMOUS_DATA,
113 .callback = api_v1_function,
114 .allow_subpaths = 0
115 },
116
117 #if defined(ENABLE_API_V1)
118 {
119 .api = "functions",
120 .hash = 0,
121 .acl = HTTP_ACL_FUNCTIONS,
122 .access = HTTP_ACCESS_ANONYMOUS_DATA,
123 .callback = api_v1_functions,
124 .allow_subpaths = 0
125 },
126 #endif
127
128 // time-series metadata APIs
129 #if defined(ENABLE_API_V1)
130 {
131 .api = "chart",
132 .hash = 0,
133 .acl = HTTP_ACL_METRICS,
134 .access = HTTP_ACCESS_ANONYMOUS_DATA,
135 .callback = api_v1_chart,
136 .allow_subpaths = 0
137 },
138 #endif
139 {
140 .api = "charts",
141 .hash = 0,
142 .acl = HTTP_ACL_METRICS,
143 .access = HTTP_ACCESS_ANONYMOUS_DATA,
144 .callback = api_v1_charts,
145 .allow_subpaths = 0
146 },
147 {
148 .api = "context",
149 .hash = 0,
150 .acl = HTTP_ACL_METRICS,
151 .access = HTTP_ACCESS_ANONYMOUS_DATA,
152 .callback = api_v1_context,
153 .allow_subpaths = 0
154 },
155 {
156 .api = "contexts",
157 .hash = 0,
158 .acl = HTTP_ACL_METRICS,
159 .access = HTTP_ACCESS_ANONYMOUS_DATA,
160 .callback = api_v1_contexts,
161 .allow_subpaths = 0
162 },
163
164 // registry APIs
165 #if defined(ENABLE_API_V1)
166 {
167 // registry checks the ACL by itself, so we allow everything
168 .api = "registry",
169 .hash = 0,
170 .acl = HTTP_ACL_NONE, // it manages acl by itself
171 .access = HTTP_ACCESS_NONE, // it manages access by itself
172 .callback = api_v1_registry,
173 .allow_subpaths = 0
174 },
175 #endif
176
177 // agent information APIs
178 #if defined(ENABLE_API_V1)
179 {
180 .api = "info",
181 .hash = 0,
182 .acl = HTTP_ACL_NODES,
183 .access = HTTP_ACCESS_ANONYMOUS_DATA,
184 .callback = api_v1_info,
185 .allow_subpaths = 0
186 },
187 {
188 .api = "aclk",
189 .hash = 0,
190 .acl = HTTP_ACL_NODES,
191 .access = HTTP_ACCESS_ANONYMOUS_DATA,
192 .callback = api_v1_aclk,
193 .allow_subpaths = 0
194 },
195 #ifdef ENABLE_DBENGINE
196 {
197 // deprecated - use /api/v2/info
198 .api = "dbengine_stats",
199 .hash = 0,
200 .acl = HTTP_ACL_NODES,
201 .access = HTTP_ACCESS_ANONYMOUS_DATA,
202 .callback = api_v1_dbengine_stats,
203 .allow_subpaths = 0
204 },
205 #endif
206 {
207 .api = "ml_info",
208 .hash = 0,
209 .acl = HTTP_ACL_NODES,
210 .access = HTTP_ACCESS_ANONYMOUS_DATA,
211 .callback = api_v1_ml_info,
212 .allow_subpaths = 0
213 },
214 {
215 .api = "manage",
216 .hash = 0,
217 .acl = HTTP_ACL_MANAGEMENT,
218 .access = HTTP_ACCESS_NONE, // it manages access by itself
219 .callback = api_v1_manage,
220 .allow_subpaths = 1
221 },
222 #endif
223
224 // dyncfg APIs
225 {
226 .api = "config",
227 .hash = 0,
228 .acl = HTTP_ACL_DYNCFG,
229 .access = HTTP_ACCESS_ANONYMOUS_DATA,
230 .callback = api_v1_config,
231 .allow_subpaths = 0
232 },
233
234 {
235 // terminator - keep this last on this list
236 .api = NULL,
237 .hash = 0,
238 .acl = HTTP_ACL_NONE,
239 .access = HTTP_ACCESS_NONE,
240 .callback = NULL,
241 .allow_subpaths = 0
242 },
243 };
244
245 inline int web_client_api_request_v1(RRDHOST *host, struct web_client *w, char *url_path_endpoint) {
246 static int initialized = 0;
247
248 if(unlikely(initialized == 0)) {
249 initialized = 1;
250
251 for(int i = 0; api_commands_v1[i].api ; i++)
252 api_commands_v1[i].hash = simple_hash(api_commands_v1[i].api);
253 }
254
255 return web_client_api_request_vX(host, w, url_path_endpoint, api_commands_v1);
256 }