~ignacio-nin/percona-server/5.1-issue26684

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# name       : mysql-syslog.patch
# introduced : 12
# maintainer : Oleg
#
#!!! notice !!!
# Any small change to this file in the main branch
# should be done or reviewed by the maintainer!
diff -ruN a/client/client_priv.h b/client/client_priv.h
--- a/client/client_priv.h	2011-01-07 18:46:05.000000000 +0300
+++ b/client/client_priv.h	2011-01-07 18:53:03.000000000 +0300
@@ -90,6 +90,9 @@
   OPT_FIX_TABLE_NAMES, OPT_FIX_DB_NAMES, OPT_SSL_VERIFY_SERVER_CERT,
   OPT_DEBUG_INFO, OPT_DEBUG_CHECK, OPT_COLUMN_TYPES, OPT_ERROR_LOG_FILE,
   OPT_WRITE_BINLOG, OPT_DUMP_DATE,
+#ifndef __WIN__
+  OPT_SYSLOG,
+#endif
   OPT_FIRST_SLAVE,
   OPT_ALL,
   OPT_MAX_CLIENT_OPTION
diff -ruN a/client/mysql.cc b/client/mysql.cc
--- a/client/mysql.cc	2010-11-29 13:37:59.000000000 +0300
+++ b/client/mysql.cc	2011-01-07 18:57:05.000000000 +0300
@@ -43,6 +43,9 @@
 #include "my_readline.h"
 #include <signal.h>
 #include <violite.h>
+#ifndef __WIN__
+#include "syslog.h"
+#endif
 
 #if defined(USE_LIBEDIT_INTERFACE) && defined(HAVE_LOCALE_H)
 #include <locale.h>
@@ -62,6 +65,8 @@
 /* Version numbers for deprecation messages */
 #define VER_CELOSIA "5.6"
 
+#define MAX_SYSLOG_MESSAGE 900
+
 void* sql_alloc(unsigned size);	     // Don't use mysqld alloc for these
 void sql_element_free(void *ptr);
 #include "sql_string.h"
@@ -151,7 +156,7 @@
 	       default_charset_used= 0, opt_secure_auth= 0,
                default_pager_set= 0, opt_sigint_ignore= 0,
                show_warnings= 0, executing_query= 0, interrupted_query= 0,
-               ignore_spaces= 0;
+               ignore_spaces= 0, opt_syslog= 0;
 static my_bool debug_info_flag, debug_check_flag;
 static my_bool column_types_flag;
 static my_bool preserve_comments= 0;
@@ -206,6 +211,7 @@
 void tee_fputs(const char *s, FILE *file);
 void tee_puts(const char *s, FILE *file);
 void tee_putc(int c, FILE *file);
+void write_syslog(String *buffer);
 static void tee_print_sized_data(const char *, unsigned int, unsigned int, bool);
 /* The names of functions that actually do the manipulation. */
 static int get_options(int argc,char **argv);
@@ -1563,6 +1569,10 @@
   {"show-warnings", OPT_SHOW_WARNINGS, "Show warnings after every statement.",
     &show_warnings, &show_warnings, 0, GET_BOOL, NO_ARG,
     0, 0, 0, 0, 0, 0},
+#ifndef __WIN__
+  {"syslog", OPT_SYSLOG, "Logs all queries to syslog", 0, 0, 0, GET_NO_ARG,
+   NO_ARG, 0, 0, 0, 0, 0, 0},
+#endif
   { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
 };
 
@@ -1686,6 +1696,11 @@
                                     opt->name);
 #endif
     break;
+#ifndef __WIN__
+  case OPT_SYSLOG:
+    opt_syslog = 1;
+    break;
+#endif
   case OPT_SERVER_ARG:
 #ifdef EMBEDDED_LIBRARY
     /*
@@ -2066,6 +2081,40 @@
   DBUG_RETURN((COMMANDS *) 0);
 }
 
+void write_syslog(String *line){
+#ifndef __WIN__
+  uint length= line->length();
+  uint chunk_len= min(MAX_SYSLOG_MESSAGE, length);
+  char *ptr= line->c_ptr_safe();
+  char buff[MAX_SYSLOG_MESSAGE + 1];
+
+  for (;
+       length;
+       length-= chunk_len, ptr+= chunk_len, chunk_len= min(MAX_SYSLOG_MESSAGE,
+                                                           length))
+  {
+    char *str;
+    if (length == chunk_len)
+      str= ptr;                                 // last chunk => skip copy
+    else
+    {
+      memcpy(buff, ptr, chunk_len);
+      buff[chunk_len]= '\0';
+      str= buff;
+    }
+    syslog(LOG_INFO,
+           "SYSTEM_USER:'%s', MYSQL_USER:'%s', CONNECTION_ID:%lu, "
+           "DB_SERVER:'%s', DB:'%s', QUERY:'%s'",
+           getenv("SUDO_USER") ? getenv("SUDO_USER") : 
+           getenv("USER") ? getenv("USER") : "--",
+           current_user ? current_user : "--",
+           mysql_thread_id(&mysql),
+           current_host ? current_host : "--",
+           current_db ? current_db : "--",
+           str);
+  }
+#endif
+}
 
 static bool add_line(String &buffer,char *line,char *in_string,
                      bool *ml_comment, bool truncated)
@@ -3041,6 +3090,11 @@
     fix_history(buffer);
   }
 #endif
+#ifndef __WIN__
+  if (opt_syslog && buffer->length() && connect_flag == CLIENT_INTERACTIVE){
+    write_syslog(buffer);
+  }
+#endif
 
   buffer->length(0);