From 9318d1a8156b987cb2ca889d0eda77bfa8882e44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 20 May 2016 21:06:10 +0000 Subject: [PATCH] More matching criteria Issue #537 mysql_query_rules now matches also on : - client_addr - proxy_addr - proxy_port - digest --- include/MySQL_Data_Stream.h | 6 ++++- include/MySQL_Thread.h | 6 ++++- lib/MySQL_Thread.cpp | 16 +++++++++++++ lib/Query_Processor.cpp | 45 +++++++++++++++++++++++++++---------- lib/mysql_data_stream.cpp | 6 +++++ 5 files changed, 65 insertions(+), 14 deletions(-) diff --git a/include/MySQL_Data_Stream.h b/include/MySQL_Data_Stream.h index f27a2a7c6..35232aa0d 100644 --- a/include/MySQL_Data_Stream.h +++ b/include/MySQL_Data_Stream.h @@ -107,8 +107,12 @@ class MySQL_Data_Stream struct { char *addr; - uint16_t port; + int port; } addr; + struct { + char *addr; + int port; + } proxy_addr; unsigned int connect_tries; int connect_retries_on_failure; diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index 6903400ea..8aaa59386 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -196,7 +196,6 @@ typedef MySQL_Thread * create_MySQL_Thread_t(); typedef void destroy_MySQL_Thread_t(MySQL_Thread *); - class iface_info { public: char *iface; @@ -218,6 +217,7 @@ class iface_info { + class MySQL_Listeners_Manager { private: PtrArray *ifaces; @@ -228,6 +228,7 @@ class MySQL_Listeners_Manager { int add(const char *address, int port); int find_idx(const char *iface); int find_idx(const char *address, int port); + iface_info * find_iface_from_fd(int fd); int get_fd(unsigned int idx); void del(unsigned int idx); }; @@ -346,6 +347,9 @@ class MySQL_Threads_Handler unsigned long long get_slow_queries(); unsigned long long get_queries_backends_bytes_recv(); unsigned long long get_queries_backends_bytes_sent(); + iface_info *MLM_find_iface_from_fd(int fd) { + return MLM->find_iface_from_fd(fd); + } }; diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 498666f19..e379123ca 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -111,6 +111,16 @@ int MySQL_Listeners_Manager::find_idx(const char *iface) { return -1; } +iface_info * MySQL_Listeners_Manager::find_iface_from_fd(int fd) { + for (unsigned int i=0; ilen; i++) { + iface_info *ifi=(iface_info *)ifaces->index(i); + if (ifi->fd==fd) { + return ifi; + } + } + return NULL; +} + int MySQL_Listeners_Manager::find_idx(const char *address, int port) { for (unsigned int i=0; ilen; i++) { iface_info *ifi=(iface_info *)ifaces->index(i); @@ -2054,6 +2064,12 @@ void MySQL_Thread::listener_handle_new_connection(MySQL_Data_Stream *myds, unsig } else { sess->client_myds->addr.addr=strdup("localhost"); } + iface_info *ifi=NULL; + ifi=GloMTH->MLM_find_iface_from_fd(myds->fd); // here we try to get the info about the proxy bind address + if (ifi) { + sess->client_myds->proxy_addr.addr=strdup(ifi->address); + sess->client_myds->proxy_addr.port=ifi->port; + } sess->client_myds->myprot.generate_pkt_initial_handshake(true,NULL,NULL, &sess->thread_session_id); ioctl_FIONBIO(sess->client_myds->fd, 1); mypolls.add(POLLIN|POLLOUT, sess->client_myds->fd, sess->client_myds, curtime); diff --git a/lib/Query_Processor.cpp b/lib/Query_Processor.cpp index 87ca883a3..801974c3a 100644 --- a/lib/Query_Processor.cpp +++ b/lib/Query_Processor.cpp @@ -51,9 +51,10 @@ class QP_rule_text { itostr(pta[7], (long long)QPr->proxy_port); char buf[20]; - uint32_t d32[2]; - memcpy(&d32,&QPr->digest,sizeof(QPr->digest)); - sprintf(buf,"0x%X%X", d32[0], d32[1]); + //uint32_t d32[2]; + //memcpy(&d32,&QPr->digest,sizeof(QPr->digest)); + //sprintf(buf,"0x%X%X", d32[0], d32[1]); + sprintf(buf,"0x%016llX", (long long unsigned int)QPr->digest); pta[8]=strdup(buf); pta[9]=strdup_null(QPr->match_digest); @@ -154,9 +155,10 @@ class QP_query_digest_stats { assert(username); pta[1]=strdup(username); - uint32_t d32[2]; - memcpy(&d32,&digest,sizeof(digest)); - sprintf(buf,"0x%X%X", d32[0], d32[1]); + //uint32_t d32[2]; + //memcpy(&d32,&digest,sizeof(digest)); + //sprintf(buf,"0x%X%X", d32[0], d32[1]); + sprintf(buf,"0x%016llX", (long long unsigned int)digest); pta[2]=strdup(buf); assert(digest_text); @@ -621,9 +623,10 @@ Query_Processor_Output * Query_Processor::process_mysql_query(MySQL_Session *ses proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 4, "Copying Query Rule id: %d\n", qr1->rule_id); char buf[20]; if (qr1->digest) { // not 0 - uint32_t d32[2]; - memcpy(&d32,&qr1->digest,sizeof(qr1->digest)); - sprintf(buf,"0x%X%X", d32[0], d32[1]); + //uint32_t d32[2]; + //memcpy(&d32,&qr1->digest,sizeof(qr1->digest)); + //sprintf(buf,"0x%X%X", d32[0], d32[1]); + sprintf(buf,"0x%016llX", (long long unsigned int)qr1->digest); } qr2=new_query_rule(qr1->rule_id, qr1->active, qr1->username, qr1->schemaname, qr1->flagIN, qr1->client_addr, qr1->proxy_addr, qr1->proxy_port, @@ -684,9 +687,27 @@ Query_Processor_Output * Query_Processor::process_mysql_query(MySQL_Session *ses // match on client address if (qr->client_addr && strlen(qr->client_addr)) { - if (strcmp(qr->client_addr,sess->client_myds->addr.addr)!=0) { - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "query rule %d has no matching client_addr\n", qr->rule_id); - continue; + if (sess->client_myds->addr.addr) { + if (strcmp(qr->client_addr,sess->client_myds->addr.addr)!=0) { + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "query rule %d has no matching client_addr\n", qr->rule_id); + continue; + } + } + } + + // match on proxy_addr & proxy_port + if (qr->proxy_addr && strlen(qr->proxy_addr)) { + if (sess->client_myds->proxy_addr.addr) { + if (strcmp(qr->proxy_addr,sess->client_myds->proxy_addr.addr)!=0) { + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "query rule %d has no matching proxy_addr\n", qr->rule_id); + continue; + } + if (qr->proxy_port>=0) { + if (qr->proxy_port!=sess->client_myds->proxy_addr.port) { + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "query rule %d has no matching proxy_port\n", qr->rule_id); + continue; + } + } } } diff --git a/lib/mysql_data_stream.cpp b/lib/mysql_data_stream.cpp index 7b1f77bfe..dd0048019 100644 --- a/lib/mysql_data_stream.cpp +++ b/lib/mysql_data_stream.cpp @@ -99,6 +99,8 @@ MySQL_Data_Stream::MySQL_Data_Stream() { addr.addr=NULL; addr.port=0; + proxy_addr.addr=NULL; + proxy_addr.port=0; sess=NULL; mysql_real_query.pkt.ptr=NULL; @@ -155,6 +157,10 @@ MySQL_Data_Stream::~MySQL_Data_Stream() { free(addr.addr); addr.addr=NULL; } + if (proxy_addr.addr) { + free(proxy_addr.addr); + proxy_addr.addr=NULL; + } free_mysql_real_query();