summaryrefslogtreecommitdiffstats
path: root/src/md_array_json_printer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/md_array_json_printer.c')
-rw-r--r--src/md_array_json_printer.c213
1 files changed, 213 insertions, 0 deletions
diff --git a/src/md_array_json_printer.c b/src/md_array_json_printer.c
new file mode 100644
index 0000000..a7559fd
--- /dev/null
+++ b/src/md_array_json_printer.c
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2008-2024 OARC, Inc.
+ * Copyright (c) 2007-2008, Internet Systems Consortium, Inc.
+ * Copyright (c) 2003-2007, The Measurement Factory, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include "md_array.h"
+#include "pcap.h"
+#include "base64.h"
+#include "xmalloc.h"
+#include "input_mode.h"
+#include "dnstap.h"
+
+extern int input_mode;
+
+#include <string.h>
+#include <assert.h>
+
+static const char* d1_type_s; /* XXX barf */
+static const char* d2_type_s; /* XXX barf */
+
+static int array_comma = 0;
+static int data_comma = 0;
+static int element_comma = 0;
+
+static void
+start_array(void* pr_data, const char* name)
+{
+ FILE* fp = pr_data;
+ assert(fp);
+
+ if (array_comma)
+ fprintf(fp, ",\n");
+ else
+ array_comma = 1;
+
+ fprintf(fp, "{\n \"name\": \"%s\",\n", name);
+ if (input_mode == INPUT_DNSTAP) {
+ fprintf(fp, " \"start_time\": %d,\n", dnstap_start_time());
+ fprintf(fp, " \"stop_time\": %d,\n", dnstap_finish_time());
+ } else {
+ fprintf(fp, " \"start_time\": %d,\n", Pcap_start_time());
+ fprintf(fp, " \"stop_time\": %d,\n", Pcap_finish_time());
+ }
+ fprintf(fp, " \"dimensions\": [");
+}
+
+static void
+finish_array(void* pr_data)
+{
+ FILE* fp = pr_data;
+
+ data_comma = 0;
+ fprintf(fp, "}");
+}
+
+static void
+d1_type(void* pr_data, const char* t)
+{
+ FILE* fp = pr_data;
+
+ fprintf(fp, " \"%s\"", t);
+ d1_type_s = t;
+}
+
+static void
+d2_type(void* pr_data, const char* t)
+{
+ FILE* fp = pr_data;
+
+ fprintf(fp, ", \"%s\" ],\n", t);
+ d2_type_s = t;
+}
+
+static const char* entity_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ "0123456789._-:";
+
+static void
+d1_begin(void* pr_data, const char* l)
+{
+ FILE* fp = pr_data;
+ int ll = strlen(l);
+ char* e = NULL;
+
+ if (strspn(l, entity_chars) != ll) {
+ int x = base64_encode(l, ll, &e);
+ assert(x);
+ l = e;
+ }
+
+ if (data_comma)
+ fprintf(fp, ",\n");
+ else
+ data_comma = 1;
+
+ element_comma = 0;
+
+ fprintf(fp, " {\n");
+ fprintf(fp, " \"%s\": \"%s\",\n", d1_type_s, l);
+ if (e)
+ fprintf(fp, " \"base64\": true,\n");
+ fprintf(fp, " \"%s\": [", d2_type_s);
+
+ if (e)
+ xfree(e);
+}
+
+static void
+print_element(void* pr_data, const char* l, int val)
+{
+ FILE* fp = pr_data;
+ int ll = strlen(l);
+ char* e = NULL;
+
+ if (strspn(l, entity_chars) != ll) {
+ int x = base64_encode(l, ll, &e);
+ assert(x);
+ l = e;
+ }
+
+ if (element_comma)
+ fprintf(fp, ",\n");
+ else {
+ fprintf(fp, "\n");
+ element_comma = 1;
+ }
+
+ fprintf(fp, " { \"val\": \"%s\"", l);
+ if (e)
+ fprintf(fp, ", \"base64\": true");
+ fprintf(fp, ", \"count\": %d }", val);
+
+ if (e)
+ xfree(e);
+}
+
+static void
+d1_end(void* pr_data, const char* l)
+{
+ FILE* fp = pr_data;
+
+ if (element_comma)
+ fprintf(fp, "\n ");
+
+ fprintf(fp, "]\n }");
+}
+
+static void
+start_data(void* pr_data)
+{
+ FILE* fp = pr_data;
+
+ fprintf(fp, " \"data\": [\n");
+}
+
+static void
+finish_data(void* pr_data)
+{
+ FILE* fp = pr_data;
+
+ if (data_comma)
+ fprintf(fp, "\n");
+
+ fprintf(fp, " ]\n");
+}
+
+md_array_printer json_printer = {
+ start_array,
+ finish_array,
+ d1_type,
+ d2_type,
+ start_data,
+ finish_data,
+ d1_begin,
+ d1_end,
+ print_element,
+ "JSON",
+ "[\n",
+ "\n]\n",
+ "json"
+};