3 int web_client_api_old_data_request(RRDHOST *host, struct web_client *w, char *url, int datasource_type) {
5 buffer_flush(w->response.data);
6 buffer_sprintf(w->response.data, "Incomplete request.");
12 char *args = strchr(url, '?');
18 // get the name of the data to show
19 char *tok = mystrsep(&url, "/");
22 // do we have such a data set?
24 debug(D_WEB_CLIENT, "%llu: Searching for RRD data with name '%s'.", w->id, tok);
25 st = rrdset_find_byname(host, tok);
26 if(!st) st = rrdset_find(host, tok);
31 // try to send a file with that name
32 buffer_flush(w->response.data);
33 return(mysendfile(w, tok));
37 debug(D_WEB_CLIENT, "%llu: Found RRD data with name '%s'.", w->id, tok);
39 // how many entries does the client want?
40 int lines = (int)st->entries;
42 time_t after = 0, before = 0;
43 int group_method = GROUP_AVERAGE;
47 // parse the lines required
48 tok = mystrsep(&url, "/");
49 if(tok) lines = str2i(tok);
50 if(lines < 1) lines = 1;
53 // parse the group count required
54 tok = mystrsep(&url, "/");
55 if(tok && *tok) group_count = str2i(tok);
56 if(group_count < 1) group_count = 1;
57 //if(group_count > save_history / 20) group_count = save_history / 20;
60 // parse the grouping method required
61 tok = mystrsep(&url, "/");
63 if(strcmp(tok, "max") == 0) group_method = GROUP_MAX;
64 else if(strcmp(tok, "average") == 0) group_method = GROUP_AVERAGE;
65 else if(strcmp(tok, "sum") == 0) group_method = GROUP_SUM;
66 else debug(D_WEB_CLIENT, "%llu: Unknown group method '%s'", w->id, tok);
71 tok = mystrsep(&url, "/");
72 if(tok && *tok) after = str2ul(tok);
73 if(after < 0) after = 0;
77 tok = mystrsep(&url, "/");
78 if(tok && *tok) before = str2ul(tok);
79 if(before < 0) before = 0;
83 tok = mystrsep(&url, "/");
84 if(tok && *tok && strcmp(tok, "nonzero") == 0) nonzero = 1;
87 w->response.data->contenttype = CT_APPLICATION_JSON;
88 buffer_flush(w->response.data);
90 char *google_version = "0.6";
91 char *google_reqId = "0";
92 char *google_sig = "0";
93 char *google_out = "json";
94 char *google_responseHandler = "google.visualization.Query.setResponse";
95 char *google_outFileName = NULL;
96 time_t last_timestamp_in_data = 0;
97 if(datasource_type == DATASOURCE_DATATABLE_JSON || datasource_type == DATASOURCE_DATATABLE_JSONP) {
99 w->response.data->contenttype = CT_APPLICATION_X_JAVASCRIPT;
102 tok = mystrsep(&args, "&");
104 char *name = mystrsep(&tok, "=");
105 if(name && *name && strcmp(name, "tqx") == 0) {
106 char *key = mystrsep(&tok, ":");
107 char *value = mystrsep(&tok, ";");
108 if(key && value && *key && *value) {
109 if(strcmp(key, "version") == 0)
110 google_version = value;
112 else if(strcmp(key, "reqId") == 0)
113 google_reqId = value;
115 else if(strcmp(key, "sig") == 0)
118 else if(strcmp(key, "out") == 0)
121 else if(strcmp(key, "responseHandler") == 0)
122 google_responseHandler = value;
124 else if(strcmp(key, "outFileName") == 0)
125 google_outFileName = value;
131 debug(D_WEB_CLIENT_ACCESS, "%llu: GOOGLE JSONP: version = '%s', reqId = '%s', sig = '%s', out = '%s', responseHandler = '%s', outFileName = '%s'",
132 w->id, google_version, google_reqId, google_sig, google_out, google_responseHandler, google_outFileName
135 if(datasource_type == DATASOURCE_DATATABLE_JSONP) {
136 last_timestamp_in_data = strtoul(google_sig, NULL, 0);
138 // check the client wants json
139 if(strcmp(google_out, "json") != 0) {
140 buffer_sprintf(w->response.data,
141 "%s({version:'%s',reqId:'%s',status:'error',errors:[{reason:'invalid_query',message:'output format is not supported',detailed_message:'the format %s requested is not supported by netdata.'}]});",
142 google_responseHandler, google_version, google_reqId, google_out);
148 if(datasource_type == DATASOURCE_DATATABLE_JSONP) {
149 buffer_sprintf(w->response.data,
150 "%s({version:'%s',reqId:'%s',status:'ok',sig:'%ld',table:",
151 google_responseHandler, google_version, google_reqId, st->last_updated.tv_sec);
154 debug(D_WEB_CLIENT_ACCESS, "%llu: Sending RRD data '%s' (id %s, %d lines, %d group, %d group_method, %ld after, %ld before).",
155 w->id, st->name, st->id, lines, group_count, group_method, after, before);
157 time_t timestamp_in_data = rrdset2json_api_old(datasource_type, st, w->response.data, lines, group_count
158 , group_method, (unsigned long) after, (unsigned long) before
161 if(datasource_type == DATASOURCE_DATATABLE_JSONP) {
162 if(timestamp_in_data > last_timestamp_in_data)
163 buffer_strcat(w->response.data, "});");
166 // the client already has the latest data
167 buffer_flush(w->response.data);
168 buffer_sprintf(w->response.data,
169 "%s({version:'%s',reqId:'%s',status:'error',errors:[{reason:'not_modified',message:'Data not modified'}]});",
170 google_responseHandler, google_version, google_reqId);
177 inline int web_client_api_old_data_request_json(RRDHOST *host, struct web_client *w, char *url) {
178 return web_client_api_old_data_request(host, w, url, DATASOURCE_JSON);
181 inline int web_client_api_old_data_request_jsonp(RRDHOST *host, struct web_client *w, char *url) {
182 return web_client_api_old_data_request(host, w, url, DATASOURCE_DATATABLE_JSONP);
185 inline int web_client_api_old_graph_request(RRDHOST *host, struct web_client *w, char *url) {
186 // get the name of the data to show
187 char *tok = mystrsep(&url, "/?&");
189 debug(D_WEB_CLIENT, "%llu: Searching for RRD data with name '%s'.", w->id, tok);
191 // do we have such a data set?
192 RRDSET *st = rrdset_find_byname(host, tok);
193 if(!st) st = rrdset_find(host, tok);
196 // try to send a file with that name
197 buffer_flush(w->response.data);
198 return mysendfile(w, tok);
200 st->last_accessed_time = now_realtime_sec();
202 debug(D_WEB_CLIENT_ACCESS, "%llu: Sending %s.json of RRD_STATS...", w->id, st->name);
203 w->response.data->contenttype = CT_APPLICATION_JSON;
204 buffer_flush(w->response.data);
205 rrd_graph2json_api_old(st, url, w->response.data);
209 buffer_flush(w->response.data);
210 buffer_strcat(w->response.data, "Graph name?\r\n");
214 inline int web_client_api_old_list_request(RRDHOST *host, struct web_client *w, char *url) {
217 buffer_flush(w->response.data);
220 rrdhost_rdlock(host);
221 rrdset_foreach_read(st, host) {
222 if(rrdset_is_available_for_viewers(st))
223 buffer_sprintf(w->response.data, "%s\n", st->name);
225 rrdhost_unlock(host);
230 inline int web_client_api_old_all_json(RRDHOST *host, struct web_client *w, char *url) {
233 w->response.data->contenttype = CT_APPLICATION_JSON;
234 buffer_flush(w->response.data);
235 rrd_all2json_api_old(host, w->response.data);