More matching criteria

Issue #537
mysql_query_rules now matches also on :
- client_addr
- proxy_addr
- proxy_port
- digest
connleak
René Cannaò 10 years ago
parent f02fabeec9
commit 9318d1a815

@ -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;

@ -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);
}
};

@ -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; i<ifaces->len; 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; i<ifaces->len; 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);

@ -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;
}
}
}
}

@ -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();

Loading…
Cancel
Save