2011-11-14 15:57:52 +01:00
|
|
|
/*
|
|
|
|
* counters.c, SJ
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2012-08-10 13:04:54 +02:00
|
|
|
#include <strings.h>
|
2011-11-14 15:57:52 +01:00
|
|
|
#include <time.h>
|
|
|
|
#include <syslog.h>
|
|
|
|
#include <piler.h>
|
|
|
|
|
|
|
|
|
2018-09-29 08:43:50 +02:00
|
|
|
struct counters load_counters(struct session_data *sdata){
|
2011-11-14 15:57:52 +01:00
|
|
|
char buf[SMALLBUFSIZE];
|
2016-08-17 23:22:02 +02:00
|
|
|
struct counters counters;
|
2017-08-11 18:18:45 +02:00
|
|
|
struct sql sql;
|
2011-11-14 15:57:52 +01:00
|
|
|
|
|
|
|
bzero(&counters, sizeof(counters));
|
|
|
|
|
2014-05-05 15:26:42 +02:00
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "SELECT `rcvd`, `virus`, `duplicate`, `ignore`, `size`, `stored_size` FROM `%s`", SQL_COUNTER_TABLE);
|
2011-11-14 15:57:52 +01:00
|
|
|
|
2013-05-05 11:57:14 +02:00
|
|
|
|
2017-08-11 18:18:45 +02:00
|
|
|
if(prepare_sql_statement(sdata, &sql, buf) == ERR) return counters;
|
2013-05-05 11:57:14 +02:00
|
|
|
|
|
|
|
|
2017-08-11 18:18:45 +02:00
|
|
|
p_bind_init(&sql);
|
2013-05-05 11:57:14 +02:00
|
|
|
|
2017-08-11 18:18:45 +02:00
|
|
|
if(p_exec_stmt(sdata, &sql) == OK){
|
2013-05-05 11:57:14 +02:00
|
|
|
|
2017-08-11 18:18:45 +02:00
|
|
|
p_bind_init(&sql);
|
2013-05-05 11:57:14 +02:00
|
|
|
|
2017-08-11 18:18:45 +02:00
|
|
|
sql.sql[sql.pos] = (char *)&counters.c_rcvd; sql.type[sql.pos] = TYPE_LONGLONG; sql.len[sql.pos] = sizeof(uint64); sql.pos++;
|
|
|
|
sql.sql[sql.pos] = (char *)&counters.c_virus; sql.type[sql.pos] = TYPE_LONGLONG; sql.len[sql.pos] = sizeof(uint64); sql.pos++;
|
|
|
|
sql.sql[sql.pos] = (char *)&counters.c_duplicate; sql.type[sql.pos] = TYPE_LONGLONG; sql.len[sql.pos] = sizeof(uint64); sql.pos++;
|
|
|
|
sql.sql[sql.pos] = (char *)&counters.c_ignore; sql.type[sql.pos] = TYPE_LONGLONG; sql.len[sql.pos] = sizeof(uint64); sql.pos++;
|
|
|
|
sql.sql[sql.pos] = (char *)&counters.c_size; sql.type[sql.pos] = TYPE_LONGLONG; sql.len[sql.pos] = sizeof(uint64); sql.pos++;
|
|
|
|
sql.sql[sql.pos] = (char *)&counters.c_stored_size; sql.type[sql.pos] = TYPE_LONGLONG; sql.len[sql.pos] = sizeof(uint64); sql.pos++;
|
2013-05-05 11:57:14 +02:00
|
|
|
|
2017-08-11 18:18:45 +02:00
|
|
|
p_store_results(&sql);
|
|
|
|
p_fetch_results(&sql);
|
|
|
|
p_free_results(&sql);
|
2011-11-14 15:57:52 +01:00
|
|
|
}
|
|
|
|
|
2017-08-11 18:18:45 +02:00
|
|
|
close_prepared_statement(&sql);
|
2011-11-14 15:57:52 +01:00
|
|
|
|
|
|
|
return counters;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-11-03 14:57:55 +01:00
|
|
|
void update_counters(struct session_data *sdata, struct data *data, struct counters *counters, struct config *cfg){
|
2011-11-14 15:57:52 +01:00
|
|
|
char buf[MAXBUFSIZE];
|
|
|
|
#ifdef HAVE_MEMCACHED
|
|
|
|
unsigned long long mc, rcvd;
|
2016-08-17 23:22:02 +02:00
|
|
|
struct counters c;
|
2011-11-14 15:57:52 +01:00
|
|
|
char key[MAX_MEMCACHED_KEY_LEN];
|
|
|
|
unsigned int flags=0;
|
2018-11-03 14:57:55 +01:00
|
|
|
#endif
|
2011-11-14 15:57:52 +01:00
|
|
|
|
2015-07-28 21:57:51 +02:00
|
|
|
if(counters->c_virus + counters->c_duplicate + counters->c_ignore + counters->c_size + counters->c_stored_size <= 0) return;
|
|
|
|
|
2018-11-03 14:57:55 +01:00
|
|
|
#ifdef HAVE_MEMCACHED
|
2011-11-14 15:57:52 +01:00
|
|
|
if(cfg->update_counters_to_memcached == 1){
|
|
|
|
|
|
|
|
/* increment counters to memcached */
|
|
|
|
|
2018-11-03 14:57:55 +01:00
|
|
|
if(memcached_increment(&(data->memc), MEMCACHED_MSGS_RCVD, counters->c_rcvd, &mc) == MEMCACHED_SUCCESS){
|
2011-11-14 15:57:52 +01:00
|
|
|
rcvd = mc;
|
|
|
|
|
2018-11-03 14:57:55 +01:00
|
|
|
if(counters->c_virus > 0) memcached_increment(&(data->memc), MEMCACHED_MSGS_VIRUS, counters->c_virus, &mc);
|
|
|
|
if(counters->c_duplicate > 0) memcached_increment(&(data->memc), MEMCACHED_MSGS_DUPLICATE, counters->c_duplicate, &mc);
|
|
|
|
if(counters->c_ignore > 0) memcached_increment(&(data->memc), MEMCACHED_MSGS_IGNORE, counters->c_ignore, &mc);
|
|
|
|
if(counters->c_size > 0) memcached_increment(&(data->memc), MEMCACHED_MSGS_SIZE, counters->c_size, &mc);
|
|
|
|
if(counters->c_stored_size > 0) memcached_increment(&(data->memc), MEMCACHED_MSGS_STORED_SIZE, counters->c_stored_size, &mc);
|
2011-11-14 15:57:52 +01:00
|
|
|
|
|
|
|
|
2020-03-03 15:47:02 +01:00
|
|
|
bzero(&c, sizeof(c));
|
2011-11-14 15:57:52 +01:00
|
|
|
|
2014-05-05 15:26:42 +02:00
|
|
|
snprintf(buf, MAXBUFSIZE-1, "%s %s %s %s %s %s %s", MEMCACHED_MSGS_RCVD, MEMCACHED_MSGS_VIRUS, MEMCACHED_MSGS_DUPLICATE, MEMCACHED_MSGS_IGNORE, MEMCACHED_MSGS_SIZE, MEMCACHED_MSGS_STORED_SIZE, MEMCACHED_COUNTERS_LAST_UPDATE);
|
2011-11-14 15:57:52 +01:00
|
|
|
|
|
|
|
if(memcached_mget(&(data->memc), buf) == MEMCACHED_SUCCESS){
|
|
|
|
while((memcached_fetch_result(&(data->memc), &key[0], &buf[0], &flags))){
|
|
|
|
if(!strcmp(key, MEMCACHED_MSGS_RCVD)) c.c_rcvd = strtoull(buf, NULL, 10);
|
|
|
|
else if(!strcmp(key, MEMCACHED_MSGS_VIRUS)) c.c_virus = strtoull(buf, NULL, 10);
|
|
|
|
else if(!strcmp(key, MEMCACHED_MSGS_DUPLICATE)) c.c_duplicate = strtoull(buf, NULL, 10);
|
2011-12-27 20:51:56 +01:00
|
|
|
else if(!strcmp(key, MEMCACHED_MSGS_IGNORE)) c.c_ignore = strtoull(buf, NULL, 10);
|
2012-02-10 13:57:04 +01:00
|
|
|
else if(!strcmp(key, MEMCACHED_MSGS_SIZE)) c.c_size = strtoull(buf, NULL, 10);
|
2014-05-05 15:26:42 +02:00
|
|
|
else if(!strcmp(key, MEMCACHED_MSGS_STORED_SIZE)) c.c_stored_size = strtoull(buf, NULL, 10);
|
2011-11-14 15:57:52 +01:00
|
|
|
else if(!strcmp(key, MEMCACHED_COUNTERS_LAST_UPDATE)) mc = strtoull(buf, NULL, 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-11-03 14:57:55 +01:00
|
|
|
if(sdata->now - mc > (unsigned long long)cfg->memcached_to_db_interval && c.c_rcvd > 0 && c.c_rcvd >= rcvd){
|
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "%ld", sdata->now); memcached_add(&(data->memc), "set", MEMCACHED_COUNTERS_LAST_UPDATE, buf, strlen(buf), 0, 0);
|
2011-11-14 15:57:52 +01:00
|
|
|
|
2014-05-05 15:26:42 +02:00
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "UPDATE `%s` SET `rcvd`=%llu, `virus`=%llu, `duplicate`=%llu, `ignore`=%llu, `size`=%llu, `stored_size`=%llu", SQL_COUNTER_TABLE, c.c_rcvd, c.c_virus, c.c_duplicate, c.c_ignore, c.c_size, c.c_stored_size);
|
2020-03-03 15:47:02 +01:00
|
|
|
|
2011-11-14 15:57:52 +01:00
|
|
|
//if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: update counters: %s", sdata->ttmpfile, buf);
|
|
|
|
|
2016-01-02 08:16:38 +01:00
|
|
|
p_query(sdata, buf);
|
2011-11-14 15:57:52 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
|
2018-09-29 08:43:50 +02:00
|
|
|
c = load_counters(sdata);
|
2011-11-14 15:57:52 +01:00
|
|
|
|
2018-11-03 14:57:55 +01:00
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "%ld", sdata->now); memcached_add(&(data->memc), "add", MEMCACHED_COUNTERS_LAST_UPDATE, buf, strlen(buf), 0, 0);
|
2011-11-14 15:57:52 +01:00
|
|
|
|
2018-11-03 14:57:55 +01:00
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "%llu", c.c_virus + counters->c_virus); memcached_add(&(data->memc), "add", MEMCACHED_MSGS_VIRUS, buf, strlen(buf), 0, 0);
|
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "%llu", c.c_rcvd + counters->c_rcvd); memcached_add(&(data->memc), "add", MEMCACHED_MSGS_RCVD, buf, strlen(buf), 0, 0);
|
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "%llu", c.c_duplicate + counters->c_duplicate); memcached_add(&(data->memc), "add", MEMCACHED_MSGS_DUPLICATE, buf, strlen(buf), 0, 0);
|
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "%llu", c.c_ignore + counters->c_ignore); memcached_add(&(data->memc), "add", MEMCACHED_MSGS_IGNORE, buf, strlen(buf), 0, 0);
|
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "%llu", c.c_size + counters->c_size); memcached_add(&(data->memc), "add", MEMCACHED_MSGS_SIZE, buf, strlen(buf), 0, 0);
|
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "%llu", c.c_stored_size + counters->c_stored_size); memcached_add(&(data->memc), "add", MEMCACHED_MSGS_STORED_SIZE, buf, strlen(buf), 0, 0);
|
2011-11-14 15:57:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
#endif
|
2014-05-05 15:26:42 +02:00
|
|
|
snprintf(buf, SMALLBUFSIZE-1, "UPDATE `%s` SET `rcvd`=`rcvd`+%llu, `virus`=`virus`+%llu, `duplicate`=`duplicate`+%llu, `ignore`=`ignore`+%llu, `size`=`size`+%llu, `stored_size`=`stored_size`+%llu", SQL_COUNTER_TABLE, counters->c_rcvd, counters->c_virus, counters->c_duplicate, counters->c_ignore, counters->c_size, counters->c_stored_size);
|
2016-01-02 08:16:38 +01:00
|
|
|
p_query(sdata, buf);
|
2011-11-14 15:57:52 +01:00
|
|
|
|
|
|
|
#ifdef HAVE_MEMCACHED
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|