New feature: write header message at start of logging (both file and socket) or file flush. Includes configuration parameter: audit_header_msg to control if header message enabled/disabled (default enabled).

pull/86/head
Guy Lichtman 2014-06-11 10:49:56 +03:00
parent a935dc105a
commit d3eddd6cf7
3 changed files with 53 additions and 2 deletions

View File

@ -12,6 +12,7 @@
#include <yajl/yajl_gen.h>
#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).

39
src/audit_handler.cc Executable file → Normal file
View File

@ -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)
{

View File

@ -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),