diff --git a/rust/src/modbus/log.rs b/rust/src/modbus/log.rs index 6724291de786..565297faf033 100644 --- a/rust/src/modbus/log.rs +++ b/rust/src/modbus/log.rs @@ -27,7 +27,6 @@ pub extern "C" fn rs_modbus_to_json(tx: &mut ModbusTransaction, js: &mut JsonBui /// populate a json object with transactional information, for logging fn log(tx: &ModbusTransaction, js: &mut JsonBuilder) -> Result<(), JsonError> { - js.open_object("modbus")?; js.set_uint("id", tx.id)?; if let Some(req) = &tx.request { @@ -42,7 +41,6 @@ fn log(tx: &ModbusTransaction, js: &mut JsonBuilder) -> Result<(), JsonError> { js.close()?; } - js.close()?; Ok(()) } diff --git a/rust/src/quic/logger.rs b/rust/src/quic/logger.rs index e03ebdd6bf21..ef7ce453a207 100644 --- a/rust/src/quic/logger.rs +++ b/rust/src/quic/logger.rs @@ -89,7 +89,6 @@ fn quic_tls_extension_name(e: u16) -> Option { } fn log_template(tx: &QuicTransaction, js: &mut JsonBuilder) -> Result<(), JsonError> { - js.open_object("quic")?; if tx.header.ty != QuicType::Short { js.set_string("version", String::from(tx.header.version).as_str())?; @@ -144,7 +143,6 @@ fn log_template(tx: &QuicTransaction, js: &mut JsonBuilder) -> Result<(), JsonEr js.close()?; } - js.close()?; Ok(()) } diff --git a/rust/src/rdp/log.rs b/rust/src/rdp/log.rs index e0a71a839b8f..0b7c7608972d 100644 --- a/rust/src/rdp/log.rs +++ b/rust/src/rdp/log.rs @@ -30,7 +30,6 @@ pub extern "C" fn rs_rdp_to_json(tx: &mut RdpTransaction, js: &mut JsonBuilder) /// populate a json object with transactional information, for logging fn log(tx: &RdpTransaction, js: &mut JsonBuilder) -> Result<(), JsonError> { - js.open_object("rdp")?; js.set_uint("tx_id", tx.id)?; match &tx.item { @@ -58,7 +57,6 @@ fn log(tx: &RdpTransaction, js: &mut JsonBuilder) -> Result<(), JsonError> { } } - js.close()?; Ok(()) } diff --git a/rust/src/sip/log.rs b/rust/src/sip/log.rs index 792acfa49021..ef3aefb80fcc 100644 --- a/rust/src/sip/log.rs +++ b/rust/src/sip/log.rs @@ -21,8 +21,6 @@ use crate::jsonbuilder::{JsonBuilder, JsonError}; use crate::sip::sip::SIPTransaction; fn log(tx: &SIPTransaction, js: &mut JsonBuilder) -> Result<(), JsonError> { - js.open_object("sip")?; - if let Some(req) = &tx.request { js.set_string("method", &req.method)? .set_string("uri", &req.path)? @@ -43,12 +41,10 @@ fn log(tx: &SIPTransaction, js: &mut JsonBuilder) -> Result<(), JsonError> { js.set_string("response_line", resp_line)?; } - js.close()?; - Ok(()) } #[no_mangle] pub extern "C" fn rs_sip_log_json(tx: &mut SIPTransaction, js: &mut JsonBuilder) -> bool { log(tx, js).is_ok() -} \ No newline at end of file +} diff --git a/scripts/setup-app-layer.py b/scripts/setup-app-layer.py index 72f28c986c66..d8426634bca8 100755 --- a/scripts/setup-app-layer.py +++ b/scripts/setup-app-layer.py @@ -200,6 +200,10 @@ def logger_patch_output_c(proto): output = io.StringIO() inlines = open(filename).readlines() for i, line in enumerate(inlines): + if line.find("ALPROTO_TEMPLATE") > -1: + new_line = line.replace("TEMPLATE", proto.upper()).replace( + "template", proto.lower()) + output.write(new_line) if line.find("output-json-template.h") > -1: output.write(line.replace("template", proto.lower())) if line.find("/* Template JSON logger.") > -1: diff --git a/src/output-json-alert.c b/src/output-json-alert.c index f7b67fa0c082..19bf925126dc 100644 --- a/src/output-json-alert.c +++ b/src/output-json-alert.c @@ -150,101 +150,6 @@ static void AlertJsonTls(const Flow *f, JsonBuilder *js) return; } -static void AlertJsonSsh(const Flow *f, JsonBuilder *js) -{ - void *ssh_state = FlowGetAppState(f); - if (ssh_state) { - JsonBuilderMark mark = { 0, 0, 0 }; - void *tx_ptr = rs_ssh_state_get_tx(ssh_state, 0); - jb_get_mark(js, &mark); - jb_open_object(js, "ssh"); - if (rs_ssh_log_json(tx_ptr, js)) { - jb_close(js); - } else { - jb_restore_mark(js, &mark); - } - } - - return; -} - -static void AlertJsonHttp2(const Flow *f, const uint64_t tx_id, JsonBuilder *js) -{ - void *h2_state = FlowGetAppState(f); - if (h2_state) { - void *tx_ptr = rs_http2_state_get_tx(h2_state, tx_id); - if (tx_ptr) { - JsonBuilderMark mark = { 0, 0, 0 }; - jb_get_mark(js, &mark); - jb_open_object(js, "http"); - if (rs_http2_log_json(tx_ptr, js)) { - jb_close(js); - } else { - jb_restore_mark(js, &mark); - } - } - } - - return; -} - -static void AlertJsonDnp3(const Flow *f, const uint64_t tx_id, JsonBuilder *js) -{ - DNP3State *dnp3_state = (DNP3State *)FlowGetAppState(f); - if (dnp3_state) { - DNP3Transaction *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_DNP3, - dnp3_state, tx_id); - if (tx) { - JsonBuilderMark mark = { 0, 0, 0 }; - jb_get_mark(js, &mark); - bool logged = false; - jb_open_object(js, "dnp3"); - if (tx->is_request && tx->done) { - jb_open_object(js, "request"); - JsonDNP3LogRequest(js, tx); - jb_close(js); - logged = true; - } - if (!tx->is_request && tx->done) { - jb_open_object(js, "response"); - JsonDNP3LogResponse(js, tx); - jb_close(js); - logged = true; - } - if (logged) { - /* Close dnp3 object. */ - jb_close(js); - } else { - jb_restore_mark(js, &mark); - } - } - } -} - -static void AlertJsonDns(const Flow *f, const uint64_t tx_id, JsonBuilder *js) -{ - void *dns_state = (void *)FlowGetAppState(f); - if (dns_state) { - void *txptr = AppLayerParserGetTx(f->proto, ALPROTO_DNS, - dns_state, tx_id); - if (txptr) { - jb_open_object(js, "dns"); - JsonBuilder *qjs = JsonDNSLogQuery(txptr, tx_id); - if (qjs != NULL) { - jb_set_object(js, "query", qjs); - jb_free(qjs); - } - JsonBuilder *ajs = JsonDNSLogAnswer(txptr, tx_id); - if (ajs != NULL) { - jb_set_object(js, "answer", ajs); - jb_free(ajs); - } - jb_close(js); - } - } - return; -} - static void AlertJsonSNMP(const Flow *f, const uint64_t tx_id, JsonBuilder *js) { void *snmp_state = (void *)FlowGetAppState(f); @@ -259,41 +164,6 @@ static void AlertJsonSNMP(const Flow *f, const uint64_t tx_id, JsonBuilder *js) } } -static void AlertJsonRDP(const Flow *f, const uint64_t tx_id, JsonBuilder *js) -{ - void *rdp_state = (void *)FlowGetAppState(f); - if (rdp_state != NULL) { - void *tx = AppLayerParserGetTx(f->proto, ALPROTO_RDP, rdp_state, - tx_id); - if (tx != NULL) { - JsonBuilderMark mark = { 0, 0, 0 }; - jb_get_mark(js, &mark); - if (!rs_rdp_to_json(tx, js)) { - jb_restore_mark(js, &mark); - } - } - } -} - -static void AlertJsonBitTorrentDHT(const Flow *f, const uint64_t tx_id, JsonBuilder *js) -{ - void *bittorrent_dht_state = (void *)FlowGetAppState(f); - if (bittorrent_dht_state != NULL) { - void *tx = - AppLayerParserGetTx(f->proto, ALPROTO_BITTORRENT_DHT, bittorrent_dht_state, tx_id); - if (tx != NULL) { - JsonBuilderMark mark = { 0, 0, 0 }; - jb_get_mark(js, &mark); - jb_open_object(js, "bittorrent_dht"); - if (rs_bittorrent_dht_logger_log(tx, js)) { - jb_close(js); - } else { - jb_restore_mark(js, &mark); - } - } - } -} - static void AlertJsonSourceTarget(const Packet *p, const PacketAlert *pa, JsonBuilder *js, JsonAddrInfo *addr) { @@ -470,7 +340,24 @@ static void AlertAddAppLayer(const Packet *p, JsonBuilder *jb, const uint64_t tx_id, const uint16_t option_flags) { const AppProto proto = FlowGetAppProtocol(p->flow); + AppLayerLogger *al = GetAppProtoLogger(proto); JsonBuilderMark mark = { 0, 0, 0 }; + if (al && al->name) { + void *state = FlowGetAppState(p->flow); + if (state) { + void *tx = AppLayerParserGetTx(p->flow->proto, proto, state, tx_id); + if (tx) { + jb_get_mark(jb, &mark); + jb_open_object(jb, al->name); + if (al->log(tx, jb)) { + jb_close(jb); + } else { + jb_restore_mark(jb, &mark); + } + } + } + return; + } switch (proto) { case ALPROTO_HTTP1: // TODO: Could result in an empty http object being logged. @@ -488,9 +375,6 @@ static void AlertAddAppLayer(const Packet *p, JsonBuilder *jb, case ALPROTO_TLS: AlertJsonTls(p->flow, jb); break; - case ALPROTO_SSH: - AlertJsonSsh(p->flow, jb); - break; case ALPROTO_SMTP: jb_get_mark(jb, &mark); jb_open_object(jb, "smtp"); @@ -534,9 +418,6 @@ static void AlertAddAppLayer(const Packet *p, JsonBuilder *jb, jb_restore_mark(jb, &mark); } break; - case ALPROTO_SIP: - JsonSIPAddMetadata(jb, p->flow, tx_id); - break; case ALPROTO_RFB: jb_get_mark(jb, &mark); if (!JsonRFBAddMetadata(p->flow, tx_id, jb)) { @@ -549,15 +430,6 @@ static void AlertAddAppLayer(const Packet *p, JsonBuilder *jb, EveFTPDataAddMetadata(p->flow, jb); jb_close(jb); break; - case ALPROTO_DNP3: - AlertJsonDnp3(p->flow, tx_id, jb); - break; - case ALPROTO_HTTP2: - AlertJsonHttp2(p->flow, tx_id, jb); - break; - case ALPROTO_DNS: - AlertJsonDns(p->flow, tx_id, jb); - break; case ALPROTO_IKE: jb_get_mark(jb, &mark); if (!EveIKEAddMetadata(p->flow, tx_id, jb)) { @@ -570,27 +442,9 @@ static void AlertAddAppLayer(const Packet *p, JsonBuilder *jb, jb_restore_mark(jb, &mark); } break; - case ALPROTO_QUIC: - jb_get_mark(jb, &mark); - if (!JsonQuicAddMetadata(p->flow, tx_id, jb)) { - jb_restore_mark(jb, &mark); - } - break; case ALPROTO_SNMP: AlertJsonSNMP(p->flow, tx_id, jb); break; - case ALPROTO_RDP: - AlertJsonRDP(p->flow, tx_id, jb); - break; - case ALPROTO_MODBUS: - jb_get_mark(jb, &mark); - if (!JsonModbusAddMetadata(p->flow, tx_id, jb)) { - jb_restore_mark(jb, &mark); - } - break; - case ALPROTO_BITTORRENT_DHT: - AlertJsonBitTorrentDHT(p->flow, tx_id, jb); - break; default: break; } diff --git a/src/output-json-dnp3.c b/src/output-json-dnp3.c index 97b1e92e00ce..fcfd07d2d83f 100644 --- a/src/output-json-dnp3.c +++ b/src/output-json-dnp3.c @@ -210,6 +210,25 @@ void JsonDNP3LogResponse(JsonBuilder *js, DNP3Transaction *dnp3tx) jb_close(js); } +bool AlertJsonDnp3(void *vtx, JsonBuilder *js) +{ + DNP3Transaction *tx = (DNP3Transaction *)vtx; + bool logged = false; + if (tx->is_request && tx->done) { + jb_open_object(js, "request"); + JsonDNP3LogRequest(js, tx); + jb_close(js); + logged = true; + } + if (!tx->is_request && tx->done) { + jb_open_object(js, "response"); + JsonDNP3LogResponse(js, tx); + jb_close(js); + logged = true; + } + return logged; +} + static int JsonDNP3LoggerToServer(ThreadVars *tv, void *thread_data, const Packet *p, Flow *f, void *state, void *vtx, uint64_t tx_id) { diff --git a/src/output-json-dnp3.h b/src/output-json-dnp3.h index 85d02ff1011c..6f81026780d9 100644 --- a/src/output-json-dnp3.h +++ b/src/output-json-dnp3.h @@ -24,5 +24,6 @@ void JsonDNP3LogRequest(JsonBuilder *js, DNP3Transaction *); void JsonDNP3LogResponse(JsonBuilder *js, DNP3Transaction *); void JsonDNP3LogRegister(void); +bool AlertJsonDnp3(void *vtx, JsonBuilder *js); #endif /* __OUTPUT_JSON_DNP3_H__ */ diff --git a/src/output-json-dns.c b/src/output-json-dns.c index d5729c85961c..dded8e359195 100644 --- a/src/output-json-dns.c +++ b/src/output-json-dns.c @@ -263,7 +263,7 @@ typedef struct LogDnsLogThread_ { OutputJsonThreadCtx *ctx; } LogDnsLogThread; -JsonBuilder *JsonDNSLogQuery(void *txptr, uint64_t tx_id) +static JsonBuilder *JsonDNSLogQuery(void *txptr) { JsonBuilder *queryjb = jb_new_array(); if (queryjb == NULL) { @@ -292,7 +292,7 @@ JsonBuilder *JsonDNSLogQuery(void *txptr, uint64_t tx_id) return queryjb; } -JsonBuilder *JsonDNSLogAnswer(void *txptr, uint64_t tx_id) +static JsonBuilder *JsonDNSLogAnswer(void *txptr) { if (!rs_dns_do_log_answer(txptr, LOG_ALL_RRTYPES)) { return NULL; @@ -304,6 +304,21 @@ JsonBuilder *JsonDNSLogAnswer(void *txptr, uint64_t tx_id) } } +bool AlertJsonDns(void *txptr, JsonBuilder *js) +{ + JsonBuilder *qjs = JsonDNSLogQuery(txptr); + if (qjs != NULL) { + jb_set_object(js, "query", qjs); + jb_free(qjs); + } + JsonBuilder *ajs = JsonDNSLogAnswer(txptr); + if (ajs != NULL) { + jb_set_object(js, "answer", ajs); + jb_free(ajs); + } + return true; +} + static int JsonDnsLoggerToServer(ThreadVars *tv, void *thread_data, const Packet *p, Flow *f, void *alstate, void *txptr, uint64_t tx_id) { diff --git a/src/output-json-dns.h b/src/output-json-dns.h index 9d0e451328e3..f46cad011089 100644 --- a/src/output-json-dns.h +++ b/src/output-json-dns.h @@ -26,7 +26,6 @@ void JsonDnsLogRegister(void); -JsonBuilder *JsonDNSLogQuery(void *txptr, uint64_t tx_id) __attribute__((nonnull)); -JsonBuilder *JsonDNSLogAnswer(void *txptr, uint64_t tx_id) __attribute__((nonnull)); +bool AlertJsonDns(void *vtx, JsonBuilder *js); #endif /* __OUTPUT_JSON_DNS_H__ */ diff --git a/src/output-json-ftp.c b/src/output-json-ftp.c index 7177fb6a9dbc..ccefa6bc05ce 100644 --- a/src/output-json-ftp.c +++ b/src/output-json-ftp.c @@ -46,15 +46,16 @@ #include "app-layer-ftp.h" #include "output-json-ftp.h" -static void EveFTPLogCommand(Flow *f, FTPTransaction *tx, JsonBuilder *jb) +bool EveFTPLogCommand(void *vtx, JsonBuilder *jb) { + FTPTransaction *tx = vtx; /* Preallocate array objects to simplify failure case */ JsonBuilder *js_resplist = NULL; if (!TAILQ_EMPTY(&tx->response_list)) { js_resplist = jb_new_array(); if (unlikely(js_resplist == NULL)) { - return; + return false; } } jb_set_string(jb, "command", tx->command_descriptor->command_name); @@ -149,6 +150,7 @@ static void EveFTPLogCommand(Flow *f, FTPTransaction *tx, JsonBuilder *jb) } else { JB_SET_FALSE(jb, "reply_truncated"); } + return true; } @@ -164,7 +166,6 @@ static int JsonFTPLogger(ThreadVars *tv, void *thread_data, } else { event_type = "ftp"; } - FTPTransaction *tx = vtx; JsonBuilder *jb = CreateEveHeaderWithTxId(p, LOG_DIR_FLOW, event_type, NULL, tx_id, thread->ctx); @@ -173,7 +174,7 @@ static int JsonFTPLogger(ThreadVars *tv, void *thread_data, if (f->alproto == ALPROTO_FTPDATA) { EveFTPDataAddMetadata(f, jb); } else { - EveFTPLogCommand(f, tx, jb); + EveFTPLogCommand(vtx, jb); } if (!jb_close(jb)) { diff --git a/src/output-json-ftp.h b/src/output-json-ftp.h index acba5539e1c6..704defd9585c 100644 --- a/src/output-json-ftp.h +++ b/src/output-json-ftp.h @@ -25,5 +25,6 @@ #define __OUTPUT_JSON_FTP_H__ void JsonFTPLogRegister(void); +bool EveFTPLogCommand(void *vtx, JsonBuilder *js); #endif /* __OUTPUT_JSON_FTP_H__ */ diff --git a/src/output-json-modbus.c b/src/output-json-modbus.c index ace8c061f92d..d332cbb282a3 100644 --- a/src/output-json-modbus.c +++ b/src/output-json-modbus.c @@ -53,10 +53,12 @@ static int JsonModbusLogger(ThreadVars *tv, void *thread_data, const Packet *p, if (unlikely(js == NULL)) { return TM_ECODE_OK; } + jb_open_object(js, "modbus"); if (!rs_modbus_to_json(tx, js)) { jb_free(js); return TM_ECODE_FAILED; } + jb_close(js); OutputJsonBuilderBuffer(js, thread->ctx); jb_free(js); @@ -136,19 +138,6 @@ static TmEcode JsonModbusLogThreadDeinit(ThreadVars *t, void *data) return TM_ECODE_OK; } -bool JsonModbusAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js) -{ - void *state = FlowGetAppState(f); - if (state) { - void *tx = AppLayerParserGetTx(f->proto, ALPROTO_MODBUS, state, tx_id); - if (tx) { - return rs_modbus_to_json(tx, js); - } - } - - return false; -} - void JsonModbusLogRegister(void) { /* Register as an eve sub-module. */ diff --git a/src/output-json-modbus.h b/src/output-json-modbus.h index 9bde2dae57a3..2b07e4eb2d5c 100644 --- a/src/output-json-modbus.h +++ b/src/output-json-modbus.h @@ -19,6 +19,5 @@ #define __OUTPUT_JSON_MODBUS_H__ void JsonModbusLogRegister(void); -bool JsonModbusAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js); #endif /* __OUTPUT_JSON_MODBUS_H__ */ diff --git a/src/output-json-quic.c b/src/output-json-quic.c index fdf2d0f09340..bb3d516bb406 100644 --- a/src/output-json-quic.c +++ b/src/output-json-quic.c @@ -59,10 +59,12 @@ static int JsonQuicLogger(ThreadVars *tv, void *thread_data, const Packet *p, Fl if (unlikely(js == NULL)) { return TM_ECODE_OK; } + jb_open_object(js, "quic"); if (!rs_quic_to_json(tx, js)) { jb_free(js); return TM_ECODE_FAILED; } + jb_close(js); OutputJsonBuilderBuffer(js, thread->ctx); jb_free(js); @@ -140,19 +142,6 @@ static TmEcode JsonQuicLogThreadDeinit(ThreadVars *t, void *data) return TM_ECODE_OK; } -bool JsonQuicAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js) -{ - void *state = FlowGetAppState(f); - if (state) { - void *tx = AppLayerParserGetTx(f->proto, ALPROTO_QUIC, state, tx_id); - if (tx) { - return rs_quic_to_json(tx, js); - } - } - - return false; -} - void JsonQuicLogRegister(void) { /* Register as an eve sub-module. */ diff --git a/src/output-json-quic.h b/src/output-json-quic.h index 2448d5063a34..48e38185f2bd 100644 --- a/src/output-json-quic.h +++ b/src/output-json-quic.h @@ -22,7 +22,6 @@ #ifndef __OUTPUT_JSON_QUIC_H__ #define __OUTPUT_JSON_QUIC_H__ -bool JsonQuicAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js); void JsonQuicLogRegister(void); #endif /* __OUTPUT_JSON_QUIC_H__ */ diff --git a/src/output-json-rdp.c b/src/output-json-rdp.c index bc5d9ae9df89..e14c8391e561 100644 --- a/src/output-json-rdp.c +++ b/src/output-json-rdp.c @@ -51,10 +51,12 @@ static int JsonRdpLogger(ThreadVars *tv, void *thread_data, if (unlikely(js == NULL)) { return TM_ECODE_OK; } + jb_open_object(js, "rdp"); if (!rs_rdp_to_json(tx, js)) { jb_free(js); return TM_ECODE_FAILED; } + jb_close(js); OutputJsonBuilderBuffer(js, thread); jb_free(js); diff --git a/src/output-json-sip.c b/src/output-json-sip.c index 8297be1cc3eb..e3cee00b860f 100644 --- a/src/output-json-sip.c +++ b/src/output-json-sip.c @@ -48,17 +48,6 @@ #include "rust.h" -void JsonSIPAddMetadata(JsonBuilder *js, const Flow *f, uint64_t tx_id) -{ - SIPState *state = FlowGetAppState(f); - if (state) { - SIPTransaction *tx = AppLayerParserGetTx(f->proto, ALPROTO_SIP, state, tx_id); - if (tx) { - rs_sip_log_json(tx, js); - } - } -} - static int JsonSIPLogger(ThreadVars *tv, void *thread_data, const Packet *p, Flow *f, void *state, void *tx, uint64_t tx_id) { @@ -70,9 +59,11 @@ static int JsonSIPLogger(ThreadVars *tv, void *thread_data, return TM_ECODE_OK; } + jb_open_object(js, "sip"); if (!rs_sip_log_json(siptx, js)) { goto error; } + jb_close(js); OutputJsonBuilderBuffer(js, thread); jb_free(js); diff --git a/src/output-json-sip.h b/src/output-json-sip.h index 60145dab5b98..0d2c53fa50df 100644 --- a/src/output-json-sip.h +++ b/src/output-json-sip.h @@ -26,6 +26,4 @@ void JsonSIPLogRegister(void); -void JsonSIPAddMetadata(JsonBuilder *js, const Flow *f, uint64_t tx_id); - #endif /* __OUTPUT_JSON_SIP_H__ */ diff --git a/src/output-json-smtp.c b/src/output-json-smtp.c index 99771ec68fb4..cc3003907585 100644 --- a/src/output-json-smtp.c +++ b/src/output-json-smtp.c @@ -51,7 +51,7 @@ #include "output-json-smtp.h" #include "output-json-email-common.h" -static void EveSmtpDataLogger(const Flow *f, void *state, void *vtx, uint64_t tx_id, JsonBuilder *js) +static void EveSmtpDataLogger(void *state, void *vtx, JsonBuilder *js) { SMTPTransaction *tx = vtx; SMTPString *rcptto_str; @@ -81,7 +81,7 @@ static int JsonSmtpLogger(ThreadVars *tv, void *thread_data, const Packet *p, Fl return TM_ECODE_OK; jb_open_object(jb, "smtp"); - EveSmtpDataLogger(f, state, tx, tx_id, jb); + EveSmtpDataLogger(state, tx, jb); jb_close(jb); EveEmailLogJson(jhl, jb, p, f, state, tx, tx_id); @@ -99,7 +99,7 @@ bool EveSMTPAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js) if (smtp_state) { SMTPTransaction *tx = AppLayerParserGetTx(IPPROTO_TCP, ALPROTO_SMTP, smtp_state, tx_id); if (tx) { - EveSmtpDataLogger(f, smtp_state, tx, tx_id, js); + EveSmtpDataLogger(smtp_state, tx, js); return true; } } diff --git a/src/output.c b/src/output.c index c13ab4862eda..a565e05dd4e0 100644 --- a/src/output.c +++ b/src/output.c @@ -1126,3 +1126,53 @@ void OutputRegisterLoggers(void) /* BitTorrent DHT JSON logger */ JsonBitTorrentDHTLogRegister(); } + +static AppLayerLogger alert_applayer_loggers[ALPROTO_MAX] = { + { ALPROTO_UNKNOWN, NULL, NULL }, + { ALPROTO_HTTP1, NULL, NULL }, // TODO empty http object and option_flags + { ALPROTO_FTP, "ftp", EveFTPLogCommand }, + { ALPROTO_SMTP, NULL, NULL }, // TODO state, + log email + { ALPROTO_TLS, NULL, NULL }, // TODO log state + { ALPROTO_SSH, "ssh", rs_ssh_log_json }, + { ALPROTO_IMAP, NULL, NULL }, // protocol detection only + { ALPROTO_JABBER, NULL, NULL }, // no parser, no logging + { ALPROTO_SMB, NULL, NULL }, // TODO state + { ALPROTO_DCERPC, NULL, NULL }, // TODO + { ALPROTO_IRC, NULL, NULL }, // no parser, no logging + { ALPROTO_DNS, "dns", AlertJsonDns }, + { ALPROTO_MODBUS, "modbus", (bool (*)(void *tx, struct JsonBuilder *jb))rs_modbus_to_json }, + { ALPROTO_ENIP, NULL, NULL }, // no logging + { ALPROTO_DNP3, "dnp3", AlertJsonDnp3 }, + { ALPROTO_NFS, NULL, NULL }, // TODO log rpc field + { ALPROTO_NTP, NULL, NULL }, // no logging + { ALPROTO_FTPDATA, NULL, NULL }, // TODO state + { ALPROTO_TFTP, "tftp", (bool (*)(void *tx, struct JsonBuilder *jb))rs_tftp_log_json_request }, + { ALPROTO_IKE, NULL, NULL }, // TODO state + option + { ALPROTO_KRB5, NULL, NULL }, // TODO state + { ALPROTO_QUIC, "quic", rs_quic_to_json }, + { ALPROTO_DHCP, NULL, NULL }, // TODO logger with option + { ALPROTO_SNMP, NULL, NULL }, // TODO state + { ALPROTO_SIP, "sip", (bool (*)(void *tx, struct JsonBuilder *jb))rs_sip_log_json }, + { ALPROTO_RFB, NULL, NULL }, // TODO state + { ALPROTO_MQTT, NULL, NULL }, // TODO state + option + { ALPROTO_PGSQL, NULL, NULL }, // TODO flags + { ALPROTO_TELNET, NULL, NULL }, // no logging + { ALPROTO_TEMPLATE, "template", rs_template_logger_log }, + { ALPROTO_RDP, "rdp", (bool (*)(void *tx, struct JsonBuilder *jb))rs_rdp_to_json }, + { ALPROTO_HTTP2, "http", rs_http2_log_json }, + { ALPROTO_BITTORRENT_DHT, "bittorrent_dht", rs_bittorrent_dht_logger_log }, + { ALPROTO_HTTP, NULL, NULL }, // signature protocol, not for app-layer logging + { ALPROTO_FAILED, NULL, NULL }, +#ifdef UNITTESTS + { ALPROTO_TEST, NULL, NULL }, +#endif /* UNITESTS */ +}; + +AppLayerLogger *GetAppProtoLogger(AppProto alproto) +{ + if (alproto < ALPROTO_MAX) { + BUG_ON(alert_applayer_loggers[alproto].proto != alproto); + return &alert_applayer_loggers[alproto]; + } + return NULL; +} diff --git a/src/output.h b/src/output.h index 5c2d7bc90e62..11e791c7d0bd 100644 --- a/src/output.h +++ b/src/output.h @@ -208,4 +208,12 @@ void OutputLoggerExitPrintStats(ThreadVars *, void *); void OutputSetupActiveLoggers(void); void OutputClearActiveLoggers(void); +typedef struct AppLayerLogger { + AppProto proto; + const char *name; + bool (*log)(void *tx, struct JsonBuilder *jb); +} AppLayerLogger; + +AppLayerLogger *GetAppProtoLogger(AppProto alproto); + #endif /* ! __OUTPUT_H__ */