diff --git a/include/audit_handler.h b/include/audit_handler.h index 568a0d3..88daa66 100644 --- a/include/audit_handler.h +++ b/include/audit_handler.h @@ -12,6 +12,7 @@ #include #define AUDIT_LOG_PREFIX "Audit Plugin:" +#define AUDIT_PROTOCOL_VERSION "1.0" class THD; @@ -267,13 +268,20 @@ public: static const char * DEF_MSG_DELIMITER; - Audit_json_formatter(): m_msg_delimiter(NULL) + Audit_json_formatter(): m_msg_delimiter(NULL), m_write_start_msg(true) { config.beautify = 0; config.indentString = NULL; } virtual ~Audit_json_formatter() {} virtual ssize_t event_format(ThdSesData *pThdData, IWriter * writer); + virtual ssize_t start_msg_format(IWriter * writer); + + /** + * Boolean indicating if to log start msg. + * Public so sysvar can update. + */ + my_bool m_write_start_msg; /** * Message delimiter. Should point to a valid json string (supporting the json escapping format). diff --git a/src/audit_handler.cc b/src/audit_handler.cc old mode 100755 new mode 100644 index f38debd..09ef05f --- a/src/audit_handler.cc +++ b/src/audit_handler.cc @@ -389,6 +389,45 @@ static const char * thd_query_str(THD * thd, size_t * len) } #endif +ssize_t Audit_json_formatter::start_msg_format(IWriter * writer) +{ + if(!m_write_start_msg) //disabled + { + return 0; + } + //initialize yajl + yajl_gen gen = yajl_gen_alloc(&config, NULL); + yajl_gen_map_open(gen); + yajl_add_string_val(gen, "msg-type", "header"); + uint64 ts = my_getsystime() / (10000); + yajl_add_uint64(gen, "date", ts); + yajl_add_string_val(gen, "audit-version", MYSQL_AUDIT_PLUGIN_VERSION"-"MYSQL_AUDIT_PLUGIN_REVISION); + yajl_add_string_val(gen, "audit-protocol-version", AUDIT_PROTOCOL_VERSION); + yajl_add_string_val(gen, "hostname", glob_hostname); + yajl_add_string_val(gen, "mysql-version", server_version); + yajl_add_string_val(gen, "mysql-program", my_progname); + yajl_add_string_val(gen, "mysql-socket", mysqld_unix_port); + yajl_add_uint64(gen, "mysql-port", mysqld_port); + ssize_t res = -2; + yajl_gen_status stat = yajl_gen_map_close(gen); //close the object + if(stat == yajl_gen_status_ok) //all is good write the buffer out + { + const unsigned char * text = NULL; + unsigned int len = 0; + yajl_gen_get_buf(gen, &text, &len); + //print the json + res = writer->write((const char *)text, len); + if(res >= 0) + { + //TODO: use the msg_delimiter + res = writer->write("\n", 1); + } + //my_fwrite(log_file, (uchar *) b.data, json_size(&b), MYF(0)); + } + yajl_gen_free(gen); //free the generator + return res; + +} ssize_t Audit_json_formatter::event_format(ThdSesData* pThdData, IWriter * writer) { diff --git a/src/audit_plugin.cc b/src/audit_plugin.cc index 40ffc42..5d4f737 100644 --- a/src/audit_plugin.cc +++ b/src/audit_plugin.cc @@ -2089,7 +2089,7 @@ static struct st_mysql_show_var audit_status[] = (char *) MYSQL_AUDIT_PLUGIN_VERSION "-" MYSQL_AUDIT_PLUGIN_REVISION, SHOW_CHAR }, { "Audit_protocol_version", - (char *) "1.0", + (char *) AUDIT_PROTOCOL_VERSION, SHOW_CHAR }, //{"called", (char *)&number_of_calls, SHOW_LONG}, { 0, 0, (enum_mysql_show_type) 0 } }; @@ -2134,6 +2134,9 @@ static void json_log_socket_enable(THD *thd, struct st_mysql_sys_var *var, //setup sysvars which update directly the relevant plugins +static MYSQL_SYSVAR_BOOL(header_msg, json_formatter.m_write_start_msg, + PLUGIN_VAR_RQCMDARG, + "AUDIT write header message at start of logging or file flush Enable|Disable. Default enabled.", NULL, NULL, 1); static MYSQL_SYSVAR_STR(json_log_file, json_file_handler.m_filename, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC, @@ -2218,6 +2221,7 @@ static MYSQL_SYSVAR_STR(record_objs, record_objs_string, */ static struct st_mysql_sys_var* audit_system_variables[] = { + MYSQL_SYSVAR(header_msg), MYSQL_SYSVAR(json_log_file), MYSQL_SYSVAR(json_file_sync), MYSQL_SYSVAR(json_file),