]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
snmp: convert to jsonbuilder
authorShivani Bhardwaj <shivanib134@gmail.com>
Fri, 10 Jul 2020 18:55:10 +0000 (00:25 +0530)
committerVictor Julien <victor@inliniac.net>
Wed, 15 Jul 2020 04:30:34 +0000 (06:30 +0200)
Closes redmine ticket 3756.

rust/src/snmp/log.rs
src/output-json-snmp.c

index d36cdb7ef7175369ffc66d7682a86d623b7c436b..bd04dec36d2a12d0e65743ce23028ada19446321 100644 (file)
@@ -17,7 +17,7 @@
 
 // written by Pierre Chifflier  <chifflier@wzdftpd.net>
 
-use crate::json::*;
+use crate::jsonbuilder::{JsonBuilder, JsonError};
 use crate::snmp::snmp::{SNMPState,SNMPTransaction};
 use crate::snmp::snmp_parser::{NetworkAddress,PduType};
 use std::borrow::Cow;
@@ -37,48 +37,51 @@ fn str_of_pdu_type(t:&PduType) -> Cow<str> {
     }
 }
 
-#[no_mangle]
-pub extern "C" fn rs_snmp_log_json_response(state: &mut SNMPState, tx: &mut SNMPTransaction) -> *mut JsonT
+fn snmp_log_response(jsb: &mut JsonBuilder, state: &mut SNMPState, tx: &mut SNMPTransaction) -> Result<(), JsonError>
 {
-    let js = Json::object();
-    js.set_integer("version", state.version as u64);
+    jsb.set_uint("version", state.version as u64)?;
     if tx.encrypted {
-        js.set_string("pdu_type", "encrypted");
+        jsb.set_string("pdu_type", "encrypted")?;
     } else {
         match tx.info {
             Some(ref info) => {
-                js.set_string("pdu_type", &str_of_pdu_type(&info.pdu_type));
+                jsb.set_string("pdu_type", &str_of_pdu_type(&info.pdu_type))?;
                 if info.err.0 != 0 {
-                    js.set_string("error", &format!("{:?}", info.err));
+                    jsb.set_string("error", &format!("{:?}", info.err))?;
                 }
                 match info.trap_type {
                     Some((trap_type, ref oid, address)) => {
-                        js.set_string("trap_type", &format!("{:?}", trap_type));
-                        js.set_string("trap_oid", &oid.to_string());
+                        jsb.set_string("trap_type", &format!("{:?}", trap_type))?;
+                        jsb.set_string("trap_oid", &oid.to_string())?;
                         match address {
-                            NetworkAddress::IPv4(ip) => js.set_string("trap_address", &ip.to_string())
+                            NetworkAddress::IPv4(ip) => {jsb.set_string("trap_address", &ip.to_string())?;},
                         }
                     },
                     _ => ()
                 }
                 if info.vars.len() > 0 {
-                    let jsa = Json::array();
+                    jsb.open_array("vars")?;
                     for var in info.vars.iter() {
-                        jsa.array_append_string(&var.to_string());
+                        jsb.append_string(&var.to_string())?;
                     }
-                    js.set("vars", jsa);
+                    jsb.close()?;
                 }
             },
             _ => ()
         }
-        match tx.community {
-            Some(ref c) => js.set_string("community", c),
-            _           => ()
+        if let Some(community) = &tx.community {
+            jsb.set_string("community", community)?;
         }
-        match tx.usm {
-            Some(ref s) => js.set_string("usm", s),
-            _           => ()
+        if let Some(usm) = &tx.usm {
+            jsb.set_string("usm", usm)?;
         }
     }
-    js.unwrap()
+
+    return Ok(());
+}
+
+#[no_mangle]
+pub extern "C" fn rs_snmp_log_json_response(jsb: &mut JsonBuilder, state: &mut SNMPState, tx: &mut SNMPTransaction) -> bool
+{
+    snmp_log_response(jsb, state, tx).is_ok()
 }
index 86dc2d83250f82276972f5eacea395aa5cf7ecdd..3b34179ad934fc725d6669e7c14890249b91a425 100644 (file)
@@ -64,29 +64,28 @@ static int JsonSNMPLogger(ThreadVars *tv, void *thread_data,
 {
     SNMPTransaction *snmptx = tx;
     LogSNMPLogThread *thread = thread_data;
-    json_t *js, *snmpjs;
 
-    js = CreateJSONHeader(p, LOG_DIR_PACKET, "snmp", NULL);
-    if (unlikely(js == NULL)) {
+    JsonBuilder *jb = CreateEveHeader(p, LOG_DIR_PACKET, "snmp", NULL);
+    if (unlikely(jb == NULL)) {
         return TM_ECODE_FAILED;
     }
 
-    JsonAddCommonOptions(&thread->snmplog_ctx->cfg, p, f, js);
+    EveAddCommonOptions(&thread->snmplog_ctx->cfg, p, f, jb);
 
-    snmpjs = rs_snmp_log_json_response(state, snmptx);
-    if (unlikely(snmpjs == NULL)) {
+    jb_open_object(jb, "snmp");
+    if (!rs_snmp_log_json_response(jb, state, snmptx)) {
         goto error;
     }
-    json_object_set_new(js, "snmp", snmpjs);
+    jb_close(jb);
 
     MemBufferReset(thread->buffer);
-    OutputJSONBuffer(js, thread->snmplog_ctx->file_ctx, &thread->buffer);
+    OutputJsonBuilderBuffer(jb, thread->snmplog_ctx->file_ctx, &thread->buffer);
 
-    json_decref(js);
+    jb_free(jb);
     return TM_ECODE_OK;
 
 error:
-    json_decref(js);
+    jb_free(jb);
     return TM_ECODE_FAILED;
 }