enhance: debug plugin support log per session TCP segment

This commit is contained in:
luwenpeng
2024-08-14 11:03:48 +08:00
parent e8e2d5e548
commit 7e377952a2

View File

@@ -58,6 +58,7 @@ static void log_print(int fd, const char *module, const char *fmt, ...)
struct plugin_ctx struct plugin_ctx
{ {
struct stellar *st; struct stellar *st;
char work_dir[1024];
int sess_exdata_idx; int sess_exdata_idx;
int sess_plug_id; int sess_plug_id;
int tcp_topic_id; int tcp_topic_id;
@@ -69,7 +70,7 @@ struct plugin_ctx
pthread_spinlock_t lock; // for hexdump thread safe pthread_spinlock_t lock; // for hexdump thread safe
}; };
struct sess_exdta struct session_exdata
{ {
uint64_t c2s_rx_pkts; uint64_t c2s_rx_pkts;
uint64_t s2c_rx_pkts; uint64_t s2c_rx_pkts;
@@ -82,14 +83,28 @@ struct sess_exdta
uint64_t c2s_rx_tcp_bytes; uint64_t c2s_rx_tcp_bytes;
uint64_t s2c_rx_tcp_bytes; uint64_t s2c_rx_tcp_bytes;
int c2s_tcp_seg_hexdump_fd;
int s2c_tcp_seg_hexdump_fd;
}; };
static void *on_sess_new(struct session *sess, void *plugin_ctx) static void *on_sess_new(struct session *sess, void *plugin_ctx)
{ {
char buff[4096]; char buff[4096];
struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx; struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx;
struct sess_exdta *stat = (struct sess_exdta *)calloc(1, sizeof(struct sess_exdta)); struct session_exdata *exdata = (struct session_exdata *)calloc(1, sizeof(struct session_exdata));
session_exdata_set(sess, ctx->sess_exdata_idx, stat);
if (session_get_type(sess) == SESSION_TYPE_TCP)
{
memset(buff, 0, sizeof(buff));
sprintf(buff, "%s/log/debug_plugin_%s_c2s_segment", ctx->work_dir, session_get0_readable_addr(sess));
ctx->c2s_tcp_seg_hexdump_fd = open(buff, O_WRONLY | O_APPEND | O_CREAT, 0644);
memset(buff, 0, sizeof(buff));
sprintf(buff, "%s/log/debug_plugin_%s_s2c_segment", ctx->work_dir, session_get0_readable_addr(sess));
ctx->s2c_tcp_seg_hexdump_fd = open(buff, O_WRONLY | O_APPEND | O_CREAT, 0644);
}
session_exdata_set(sess, ctx->sess_exdata_idx, exdata);
memset(buff, 0, sizeof(buff)); memset(buff, 0, sizeof(buff));
session_to_str(sess, 1, buff, sizeof(buff) - 1); session_to_str(sess, 1, buff, sizeof(buff) - 1);
@@ -102,7 +117,7 @@ static void on_sess_free(struct session *sess, void *sess_ctx, void *plugin_ctx)
{ {
char buff[4096]; char buff[4096];
struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx; struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx;
struct sess_exdta *stat = (struct sess_exdta *)session_exdata_get(sess, ctx->sess_exdata_idx); struct session_exdata *exdata = (struct session_exdata *)session_exdata_get(sess, ctx->sess_exdata_idx);
memset(buff, 0, sizeof(buff)); memset(buff, 0, sizeof(buff));
session_to_str(sess, 0, buff, sizeof(buff) - 1); session_to_str(sess, 0, buff, sizeof(buff) - 1);
@@ -113,10 +128,18 @@ static void on_sess_free(struct session *sess, void *sess_ctx, void *plugin_ctx)
"C2S rx TCP segments: %6lu, C2S rx TCP bytes: %6lu\n" "C2S rx TCP segments: %6lu, C2S rx TCP bytes: %6lu\n"
"S2C rx TCP segments: %6lu, S2C rx TCP bytes: %6lu\n", "S2C rx TCP segments: %6lu, S2C rx TCP bytes: %6lu\n",
session_get_id(sess), session_get0_readable_addr(sess), session_get_id(sess), session_get0_readable_addr(sess),
stat->c2s_rx_pkts, stat->c2s_rx_bytes, exdata->c2s_rx_pkts, exdata->c2s_rx_bytes,
stat->s2c_rx_pkts, stat->s2c_rx_bytes, exdata->s2c_rx_pkts, exdata->s2c_rx_bytes,
stat->c2s_rx_tcp_seg, stat->c2s_rx_tcp_bytes, exdata->c2s_rx_tcp_seg, exdata->c2s_rx_tcp_bytes,
stat->s2c_rx_tcp_seg, stat->s2c_rx_tcp_bytes); exdata->s2c_rx_tcp_seg, exdata->s2c_rx_tcp_bytes);
if (exdata->c2s_tcp_seg_hexdump_fd > 0)
{
close(exdata->c2s_tcp_seg_hexdump_fd);
}
if (exdata->s2c_tcp_seg_hexdump_fd > 0)
{
close(exdata->s2c_tcp_seg_hexdump_fd);
}
} }
static void on_sess_udp_msg(struct session *sess, int topic_id, const void *msg, void *sess_ctx, void *plugin_ctx) static void on_sess_udp_msg(struct session *sess, int topic_id, const void *msg, void *sess_ctx, void *plugin_ctx)
@@ -129,16 +152,16 @@ static void on_sess_udp_msg(struct session *sess, int topic_id, const void *msg,
char buff[4096]; char buff[4096];
struct packet *pkt = (struct packet *)msg; struct packet *pkt = (struct packet *)msg;
struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx; struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx;
struct sess_exdta *stat = (struct sess_exdta *)session_exdata_get(sess, ctx->sess_exdata_idx); struct session_exdata *exdata = (struct session_exdata *)session_exdata_get(sess, ctx->sess_exdata_idx);
if (session_get_current_flow_direction(sess) == FLOW_DIRECTION_C2S) if (session_get_current_flow_direction(sess) == FLOW_DIRECTION_C2S)
{ {
stat->c2s_rx_pkts++; exdata->c2s_rx_pkts++;
stat->c2s_rx_bytes += packet_get_raw_len(pkt); exdata->c2s_rx_bytes += packet_get_raw_len(pkt);
} }
else else
{ {
stat->s2c_rx_pkts++; exdata->s2c_rx_pkts++;
stat->s2c_rx_bytes += packet_get_raw_len(pkt); exdata->s2c_rx_bytes += packet_get_raw_len(pkt);
} }
memset(buff, 0, sizeof(buff)); memset(buff, 0, sizeof(buff));
@@ -164,16 +187,16 @@ static void on_sess_tcp_msg(struct session *sess, int topic_id, const void *msg,
char buff[4096]; char buff[4096];
struct packet *pkt = (struct packet *)msg; struct packet *pkt = (struct packet *)msg;
struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx; struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx;
struct sess_exdta *stat = (struct sess_exdta *)session_exdata_get(sess, ctx->sess_exdata_idx); struct session_exdata *exdata = (struct session_exdata *)session_exdata_get(sess, ctx->sess_exdata_idx);
if (session_get_current_flow_direction(sess) == FLOW_DIRECTION_C2S) if (session_get_current_flow_direction(sess) == FLOW_DIRECTION_C2S)
{ {
stat->c2s_rx_pkts++; exdata->c2s_rx_pkts++;
stat->c2s_rx_bytes += packet_get_raw_len(pkt); exdata->c2s_rx_bytes += packet_get_raw_len(pkt);
} }
else else
{ {
stat->s2c_rx_pkts++; exdata->s2c_rx_pkts++;
stat->s2c_rx_bytes += packet_get_raw_len(pkt); exdata->s2c_rx_bytes += packet_get_raw_len(pkt);
} }
memset(buff, 0, sizeof(buff)); memset(buff, 0, sizeof(buff));
@@ -201,7 +224,7 @@ static void on_sess_tcp_stream_msg(struct session *sess, int topic_id, const voi
struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx; struct plugin_ctx *ctx = (struct plugin_ctx *)plugin_ctx;
const char *data = tcp_segment_get_data(seg); const char *data = tcp_segment_get_data(seg);
uint16_t len = tcp_segment_get_len(seg); uint16_t len = tcp_segment_get_len(seg);
struct sess_exdta *stat = (struct sess_exdta *)session_exdata_get(sess, ctx->sess_exdata_idx); struct session_exdata *exdata = (struct session_exdata *)session_exdata_get(sess, ctx->sess_exdata_idx);
memset(buff, 0, sizeof(buff)); memset(buff, 0, sizeof(buff));
session_to_str(sess, 1, buff, sizeof(buff) - 1); session_to_str(sess, 1, buff, sizeof(buff) - 1);
@@ -210,21 +233,21 @@ static void on_sess_tcp_stream_msg(struct session *sess, int topic_id, const voi
pthread_spin_lock(&ctx->lock); pthread_spin_lock(&ctx->lock);
if (session_get_current_flow_direction(sess) == FLOW_DIRECTION_C2S) if (session_get_current_flow_direction(sess) == FLOW_DIRECTION_C2S)
{ {
log_print(ctx->fd, "debug plugin", "rx C2S TCP segment: len: %d, data: %p\n", len, data); log_print(ctx->fd, "debug plugin", "rx C2S TCP segment: len: %d, data: %p", len, data);
hexdump_to_fd(ctx->fd, stat->c2s_rx_tcp_bytes, data, len); hexdump_to_fd(ctx->fd, exdata->c2s_rx_tcp_bytes, data, len);
hexdump_to_fd(ctx->c2s_tcp_seg_hexdump_fd, stat->c2s_rx_tcp_bytes, data, len); hexdump_to_fd(ctx->c2s_tcp_seg_hexdump_fd, exdata->c2s_rx_tcp_bytes, data, len);
stat->c2s_rx_tcp_seg++; exdata->c2s_rx_tcp_seg++;
stat->c2s_rx_tcp_bytes += len; exdata->c2s_rx_tcp_bytes += len;
} }
else else
{ {
log_print(ctx->fd, "debug plugin", "rx S2C TCP segment: len: %d, data: %p\n", len, data); log_print(ctx->fd, "debug plugin", "rx S2C TCP segment: len: %d, data: %p", len, data);
hexdump_to_fd(ctx->fd, stat->s2c_rx_tcp_bytes, data, len); hexdump_to_fd(ctx->fd, exdata->s2c_rx_tcp_bytes, data, len);
hexdump_to_fd(ctx->s2c_tcp_seg_hexdump_fd, stat->s2c_rx_tcp_bytes, data, len); hexdump_to_fd(ctx->s2c_tcp_seg_hexdump_fd, exdata->s2c_rx_tcp_bytes, data, len);
stat->s2c_rx_tcp_seg++; exdata->s2c_rx_tcp_seg++;
stat->s2c_rx_tcp_bytes += len; exdata->s2c_rx_tcp_bytes += len;
} }
pthread_spin_unlock(&ctx->lock); pthread_spin_unlock(&ctx->lock);
} }
@@ -244,10 +267,16 @@ extern "C"
} }
ctx->fd = open("./log/debug_plugin_log", O_WRONLY | O_APPEND | O_CREAT, 0644); ctx->fd = open("./log/debug_plugin_log", O_WRONLY | O_APPEND | O_CREAT, 0644);
ctx->c2s_tcp_seg_hexdump_fd = open("./log/debug_plugin_log_c2s_tcp_segment", O_WRONLY | O_APPEND | O_CREAT, 0644); if (ctx->fd == -1)
ctx->s2c_tcp_seg_hexdump_fd = open("./log/debug_plugin_log_s2c_tcp_segment", O_WRONLY | O_APPEND | O_CREAT, 0644);
if (ctx->fd == -1 || ctx->c2s_tcp_seg_hexdump_fd == -1 || ctx->s2c_tcp_seg_hexdump_fd == -1)
{ {
printf("[debug plugin] open log file failed: %s\n", strerror(errno));
free(ctx);
return NULL;
}
if (getcwd(ctx->work_dir, sizeof(ctx->work_dir)) == NULL)
{
printf("[debug plugin] getcwd failed: %s\n", strerror(errno));
close(ctx->fd);
free(ctx); free(ctx);
return NULL; return NULL;
} }
@@ -280,14 +309,6 @@ extern "C"
{ {
close(ctx->fd); close(ctx->fd);
} }
if (ctx->c2s_tcp_seg_hexdump_fd > 0)
{
close(ctx->c2s_tcp_seg_hexdump_fd);
}
if (ctx->s2c_tcp_seg_hexdump_fd > 0)
{
close(ctx->s2c_tcp_seg_hexdump_fd);
}
pthread_spin_destroy(&ctx->lock); pthread_spin_destroy(&ctx->lock);
free(ctx); free(ctx);
} }