diff options
author | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2017-05-13 23:52:50 +0200 |
---|---|---|
committer | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2017-05-15 09:16:51 +0000 |
commit | 60c8ada4c238472f4e73221290cfd982b0b7eb5c (patch) | |
tree | 6a4ca6726f72ae9ccdd99a6f0fa52437dc46ce86 | |
parent | c30bb2c75e3291a6a676ad74ab88934ca329106f (diff) |
sharkd: output JSON for new_stat_ API.
Change-Id: I5b4b020029f3c1587f96ca1fcf5fbfa2ee78ac31
Reviewed-on: https://code.wireshark.org/review/21628
Petri-Dish: Jakub Zawadzki <darkjames-ws@darkjames.pl>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Reviewed-by: Jakub Zawadzki <darkjames-ws@darkjames.pl>
-rw-r--r-- | debian/libwireshark0.symbols | 1 | ||||
-rw-r--r-- | epan/stat_tap_ui.c | 5 | ||||
-rw-r--r-- | epan/stat_tap_ui.h | 2 | ||||
-rw-r--r-- | sharkd_session.c | 158 |
4 files changed, 166 insertions, 0 deletions
diff --git a/debian/libwireshark0.symbols b/debian/libwireshark0.symbols index daa1339cc5..0428648c74 100644 --- a/debian/libwireshark0.symbols +++ b/debian/libwireshark0.symbols @@ -875,6 +875,7 @@ libwireshark.so.0 libwireshark0 #MINVER# new_frame_data_sequence@Base 1.12.0~rc1 new_page@Base 1.12.0~rc1 new_stat_tap_add_table@Base 1.99.8 + new_stat_tap_by_name@@Base 2.3.0 new_stat_tap_get_field_data@Base 1.99.8 new_stat_tap_get_filter@Base 1.99.8 new_stat_tap_init_table@Base 1.99.8 diff --git a/epan/stat_tap_ui.c b/epan/stat_tap_ui.c index 4f7895befa..e6338d331f 100644 --- a/epan/stat_tap_ui.c +++ b/epan/stat_tap_ui.c @@ -155,6 +155,11 @@ void register_stat_tap_table_ui(stat_tap_table_ui *ui) wmem_tree_insert_string(registered_stat_tables, ui->cli_string, ui, 0); } +stat_tap_table_ui *new_stat_tap_by_name(const char *name) +{ + return (stat_tap_table_ui *) wmem_tree_lookup_string(registered_stat_tables, name, 0); +} + void new_stat_tap_iterate_tables(wmem_foreach_func func, gpointer user_data) { wmem_tree_foreach(registered_stat_tables, func, user_data); diff --git a/epan/stat_tap_ui.h b/epan/stat_tap_ui.h index b30c089401..39220df30a 100644 --- a/epan/stat_tap_ui.h +++ b/epan/stat_tap_ui.h @@ -181,6 +181,8 @@ WS_DLL_PUBLIC stat_tap_table_item_type* new_stat_tap_get_field_data(const stat_t WS_DLL_PUBLIC void new_stat_tap_set_field_data(stat_tap_table *stat_table, guint table_index, guint field_index, stat_tap_table_item_type* field_data); WS_DLL_PUBLIC void reset_stat_table(stat_tap_table_ui* new_stat, new_stat_tap_gui_reset_cb gui_callback, void *callback_data); +WS_DLL_PUBLIC stat_tap_table_ui *new_stat_tap_by_name(const char *name); + /** Free all of the tables associated with a stat_tap_table_ui. * * Frees data created by stat_tap_ui.stat_tap_init_cb. diff --git a/sharkd_session.c b/sharkd_session.c index 2daec41708..16655e63f2 100644 --- a/sharkd_session.c +++ b/sharkd_session.c @@ -285,6 +285,21 @@ sharkd_rtp_match_check(const struct sharkd_rtp_match *req, const packet_info *pi } static gboolean +sharkd_session_process_info_nstat_cb(const void *key, void *value, void *userdata) +{ + stat_tap_table_ui *new_stat_tap = (stat_tap_table_ui *) value; + int *pi = (int *) userdata; + + printf("%s{", (*pi) ? "," : ""); + printf("\"name\":\"%s\"", new_stat_tap->title); + printf(",\"tap\":\"nstat:%s\"", (const char *) key); + printf("}"); + + *pi = *pi + 1; + return FALSE; +} + +static gboolean sharkd_session_process_info_conv_cb(const void* key, void* value, void* userdata) { struct register_ct *table = (struct register_ct *) value; @@ -481,6 +496,11 @@ sharkd_session_process_info(void) printf(",\"version\":"); json_puts_string(sharkd_version()); + printf(",\"nstat\":["); + i = 0; + new_stat_tap_iterate_tables(sharkd_session_process_info_nstat_cb, &i); + printf("]"); + printf(",\"convs\":["); i = 0; conversation_table_iterate_tables(sharkd_session_process_info_conv_cb, &i); @@ -1431,6 +1451,121 @@ sharkd_session_free_tap_conv_cb(void *arg) } /** + * sharkd_session_process_tap_nstat_cb() + * + * Output nstat tap: + * (m) tap - tap name + * (m) type - tap output type + * (m) fields: array of objects with attributes: + * (m) c - name + * + * (m) tables: array of object with attributes: + * (m) t - table title + * (m) i - array of items + */ +static void +sharkd_session_process_tap_nstat_cb(void *arg) +{ + new_stat_data_t *stat_data = (new_stat_data_t *) arg; + guint i, j, k; + + printf("{\"tap\":\"nstat:%s\",\"type\":\"nstat\"", stat_data->stat_tap_data->cli_string); + + printf(",\"fields\":["); + for (i = 0; i < stat_data->stat_tap_data->nfields; i++) + { + stat_tap_table_item *field = &(stat_data->stat_tap_data->fields[i]); + + if (i) + printf(","); + + printf("{"); + + printf("\"c\":"); + json_puts_string(field->column_name); + + printf("}"); + } + printf("]"); + + printf(",\"tables\":["); + for (i = 0; i < stat_data->stat_tap_data->tables->len; i++) + { + stat_tap_table *table = g_array_index(stat_data->stat_tap_data->tables, stat_tap_table *, i); + const char *sepa = ""; + + if (i) + printf(","); + + printf("{"); + + printf("\"t\":"); + printf("\"%s\"", table->title); + + printf(",\"i\":["); + for (j = 0; j < table->num_elements; j++) + { + stat_tap_table_item_type *field_data; + + field_data = new_stat_tap_get_field_data(table, j, 0); + if (field_data == NULL || field_data->type == TABLE_ITEM_NONE) /* Nothing for us here */ + continue; + + printf("%s[", sepa); + for (k = 0; k < table->num_fields; k++) + { + field_data = new_stat_tap_get_field_data(table, j, k); + + if (k) + printf(","); + + switch (field_data->type) + { + case TABLE_ITEM_UINT: + printf("%u", field_data->value.uint_value); + break; + + case TABLE_ITEM_INT: + printf("%d", field_data->value.uint_value); + break; + + case TABLE_ITEM_STRING: + json_puts_string(field_data->value.string_value); + break; + + case TABLE_ITEM_FLOAT: + printf("%f", field_data->value.float_value); + break; + + case TABLE_ITEM_ENUM: + printf("%d", field_data->value.enum_value); + break; + + case TABLE_ITEM_NONE: + printf("null"); + break; + } + } + + printf("]"); + sepa = ","; + } + printf("]"); + printf("}"); + } + + printf("]},"); +} + +static void +sharkd_session_free_tap_nstat_cb(void *arg) +{ + new_stat_data_t *stat_data = (new_stat_data_t *) arg; + + free_stat_tables(stat_data->stat_tap_data, NULL, NULL); +} + +/** * sharkd_session_process_tap_rtd_cb() * * Output rtd tap: @@ -1833,6 +1968,7 @@ sharkd_session_process_tap_rtp_cb(void *arg) * (m) type - tap output type * ... * for type:stats see sharkd_session_process_tap_stats_cb() + * for type:nstat see sharkd_session_process_tap_nstat_cb() * for type:conv see sharkd_session_process_tap_conv_cb() * for type:host see sharkd_session_process_tap_conv_cb() * for type:rtp-streams see sharkd_session_process_tap_rtp_cb() @@ -1951,6 +2087,28 @@ sharkd_session_process_tap(char *buf, const jsmntok_t *tokens, int count) tap_data = &ct_data->hash; tap_free = sharkd_session_free_tap_conv_cb; } + else if (!strncmp(tok_tap, "nstat:", 6)) + { + stat_tap_table_ui *stat = new_stat_tap_by_name(tok_tap + 6); + new_stat_data_t *stat_data; + + if (!stat) + { + fprintf(stderr, "sharkd_session_process_tap() nstat=%s not found\n", tok_tap + 6); + continue; + } + + stat->stat_tap_init_cb(stat, NULL, NULL); + + stat_data = g_new0(new_stat_data_t, 1); + stat_data->stat_tap_data = stat; + stat_data->user_data = NULL; + + tap_error = register_tap_listener(stat->tap_name, stat_data, tap_filter, 0, NULL, stat->packet_func, sharkd_session_process_tap_nstat_cb); + + tap_data = stat_data; + tap_free = sharkd_session_free_tap_nstat_cb; + } else if (!strncmp(tok_tap, "rtd:", 4)) { register_rtd_t *rtd = get_rtd_table_by_name(tok_tap + 4); |