6 #include "action_list_graphs.h"
9 #include "graph_ident.h"
10 #include "graph_list.h"
11 #include "utils_cgi.h"
14 #include <fcgi_stdio.h>
16 #define RESULT_LIMIT 50
18 struct callback_data_s
24 typedef struct callback_data_s callback_data_t;
26 static int json_begin_graph (graph_config_t *cfg) /* {{{ */
33 graph_get_title (cfg, desc, sizeof (desc));
35 printf ("{\"title\":\"%s\",\"instances\":[", desc);
38 } /* }}} int json_begin_graph */
40 static int json_end_graph (void) /* {{{ */
45 } /* }}} int json_end_graph */
47 static int json_print_instance (graph_config_t *cfg, /* {{{ */
48 graph_instance_t *inst)
53 if ((cfg == NULL) || (inst == NULL))
56 memset (desc, 0, sizeof (desc));
57 inst_describe (cfg, inst, desc, sizeof (desc));
59 memset (params, 0, sizeof (params));
60 inst_get_params (cfg, inst, params, sizeof (params));
62 printf ("{\"description\":\"%s\",\"params\":\"%s\"}",
66 } /* }}} int json_print_instance */
68 static int print_graph_inst_json (graph_config_t *cfg, /* {{{ */
69 graph_instance_t *inst,
72 callback_data_t *data = user_data;
81 json_begin_graph (cfg);
86 else /* if (not first instance) */
91 json_print_instance (cfg, inst);
100 } /* }}} int print_graph_inst_json */
102 static int list_graphs_json (const char *term) /* {{{ */
104 callback_data_t data;
107 char time_buffer[128];
110 printf ("Content-Type: application/json\n");
113 status = time_to_rfc1123 (now + 300, time_buffer, sizeof (time_buffer));
115 printf ("Expires: %s\n"
116 "Cache-Control: public\n",
121 data.limit = RESULT_LIMIT;
126 gl_instance_get_all (print_graph_inst_json, /* user_data = */ &data);
128 gl_search (term, print_graph_inst_json, /* user_data = */ &data);
136 } /* }}} int list_graphs_json */
138 static int print_graph_inst_html (graph_config_t *cfg, /* {{{ */
139 graph_instance_t *inst,
142 callback_data_t *data = user_data;
146 if (data->cfg != cfg)
148 if (data->cfg != NULL)
149 printf (" </ul></li>\n");
151 memset (desc, 0, sizeof (desc));
152 graph_get_title (cfg, desc, sizeof (desc));
153 html_escape_buffer (desc, sizeof (desc));
155 printf (" <li class=\"graph\">%s\n"
156 " <ul class=\"instance_list\">\n", desc);
161 memset (params, 0, sizeof (params));
162 inst_get_params (cfg, inst, params, sizeof (params));
163 html_escape_buffer (params, sizeof (params));
165 memset (desc, 0, sizeof (desc));
166 inst_describe (cfg, inst, desc, sizeof (desc));
167 html_escape_buffer (desc, sizeof (desc));
169 printf (" <li class=\"instance\"><a href=\"%s?action=graph;%s\">%s</a></li>\n",
170 script_name (), params, desc);
175 /* Abort scan if limit is reached. */
176 if (data->limit == 0)
180 } /* }}} int print_graph_inst_html */
184 const char *search_term;
186 typedef struct page_data_s page_data_t;
188 static int print_search_result (void *user_data) /* {{{ */
190 page_data_t *pg_data = user_data;
191 callback_data_t cb_data = { NULL, /* limit = */ RESULT_LIMIT, /* first = */ 1 };
193 printf (" <ul id=\"search-output\" class=\"graph_list\">\n");
194 if (pg_data->search_term == NULL)
195 gl_instance_get_all (print_graph_inst_html, /* user_data = */ &cb_data);
198 char *term_lc = strtolower_copy (pg_data->search_term);
199 gl_search (term_lc, print_graph_inst_html, /* user_data = */ &cb_data);
203 if (cb_data.cfg != NULL)
204 printf (" </ul></li>\n");
209 } /* }}} int print_search_result */
211 struct print_host_list_data_s
216 typedef struct print_host_list_data_s print_host_list_data_t;
218 static int print_host_list_callback (graph_config_t *cfg, /* {{{ */
219 graph_instance_t *inst, void *user_data)
221 print_host_list_data_t *data = user_data;
222 graph_ident_t *ident;
225 /* make compiler happy */
228 ident = inst_get_selector (inst);
232 host = ident_get_host (ident);
235 ident_destroy (ident);
242 if ((data->last_host != NULL)
243 && (strcmp (data->last_host, host) == 0))
245 ident_destroy (ident);
249 free (data->last_host);
250 data->last_host = strdup (host);
252 array_append (data->array, host);
254 ident_destroy (ident);
256 } /* }}} int print_host_list_callback */
258 static int print_host_list (__attribute__((unused)) void *user_data) /* {{{ */
260 print_host_list_data_t data;
265 data.array = array_create ();
266 data.last_host = NULL;
268 gl_instance_get_all (print_host_list_callback, &data);
270 free (data.last_host);
271 data.last_host = NULL;
273 array_sort (data.array);
275 hosts_argc = array_argc (data.array);
276 hosts_argv = array_argv (data.array);
280 array_destroy (data.array);
284 printf ("<ul id=\"host-list\">\n");
285 for (i = 0; i < hosts_argc; i++)
287 char *host = hosts_argv[i];
290 if ((data.last_host != NULL) && (strcmp (data.last_host, host) == 0))
292 data.last_host = host;
294 host_html = html_escape (host);
296 printf (" <li><a href=\"%s?action=list_graphs&search=%s\">%s</a></li>\n",
297 script_name (), host_html, host_html);
303 array_destroy (data.array);
306 } /* }}} int print_host_list */
308 static int list_graphs_html (const char *term) /* {{{ */
311 page_callbacks_t pg_callbacks = PAGE_CALLBACKS_INIT;
315 snprintf (title, sizeof (title), "c4: Graphs matching \"%s\"", term);
317 strncpy (title, "c4: List of all graphs", sizeof (title));
318 title[sizeof (title) - 1] = 0;
320 memset (&pg_data, 0, sizeof (pg_data));
321 pg_data.search_term = term;
323 pg_callbacks.top_right = html_print_search_box;
324 pg_callbacks.middle_left = print_host_list;
325 pg_callbacks.middle_center = print_search_result;
327 html_print_page (title, &pg_callbacks, &pg_data);
330 } /* }}} int list_graphs_html */
332 int action_list_graphs (void) /* {{{ */
340 search = strtolower_copy (param ("search"));
342 format = param ("format");
346 if (strcmp ("json", format) == 0)
347 status = list_graphs_json (search);
349 status = list_graphs_html (search);
354 } /* }}} int action_list_graphs */
356 /* vim: set sw=2 sts=2 et fdm=marker : */