/* ** Copyright(C) 2003-2004 Eric Leblond ** Vincent Deffontaines ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // SSL notes : /* the client cert needs to go in * $HOME/.postgresql/root.crt see the comments at the top of * src/interfaces/libpq/fe-secure.c */ #include #include #include #include #include confparams pgsql_nuauth_vars[] = { { "pgsql_server_addr" , G_TOKEN_STRING, 0 , PGSQL_SERVER }, { "pgsql_server_port" ,G_TOKEN_INT , PGSQL_SERVER_PORT,NULL }, { "pgsql_user" , G_TOKEN_STRING , 0 ,PGSQL_USER}, { "pgsql_passwd" , G_TOKEN_STRING , 0 ,PGSQL_PASSWD}, { "pgsql_ssl" , G_TOKEN_STRING , 0 ,PGSQL_SSL}, { "pgsql_db_name" , G_TOKEN_STRING , 0 ,PGSQL_DB_NAME}, { "pgsql_table_name" , G_TOKEN_STRING , 0 ,PGSQL_TABLE_NAME}, { "pgsql_request_timeout" , G_TOKEN_INT , PGSQL_REQUEST_TIMEOUT , NULL } }; G_MODULE_EXPORT gchar* g_module_unload(void) { PGconn *ld = g_private_get (pgsql_priv); PQfinish(ld); return NULL; } /* Init pgsql system */ G_MODULE_EXPORT gchar* g_module_check_init(GModule *module){ char *configfile=DEFAULT_CONF_FILE; gpointer vpointer; /* init global variables */ pgsql_user=PGSQL_USER; pgsql_passwd=PGSQL_PASSWD; pgsql_server=PGSQL_SERVER; pgsql_server_port=PGSQL_SERVER_PORT; pgsql_ssl=PGSQL_SSL; pgsql_db_name=PGSQL_DB_NAME; pgsql_request_timeout=PGSQL_REQUEST_TIMEOUT; /* parse conf file */ parse_conffile(configfile,sizeof(pgsql_nuauth_vars)/sizeof(confparams),pgsql_nuauth_vars); /* set variables */ vpointer=get_confvar_value(pgsql_nuauth_vars,sizeof(pgsql_nuauth_vars)/sizeof(confparams),"pgsql_server_addr"); pgsql_server=(char *)(vpointer?vpointer:pgsql_server); vpointer=get_confvar_value(pgsql_nuauth_vars,sizeof(pgsql_nuauth_vars)/sizeof(confparams),"pgsql_server_port"); pgsql_server_port=*(int *)(vpointer?vpointer:&pgsql_server_port); vpointer=get_confvar_value(pgsql_nuauth_vars,sizeof(pgsql_nuauth_vars)/sizeof(confparams),"pgsql_user"); pgsql_user=(char *)(vpointer?vpointer:pgsql_user); vpointer=get_confvar_value(pgsql_nuauth_vars,sizeof(pgsql_nuauth_vars)/sizeof(confparams),"pgsql_passwd"); pgsql_passwd=(char *)(vpointer?vpointer:pgsql_passwd); vpointer=get_confvar_value(pgsql_nuauth_vars,sizeof(pgsql_nuauth_vars)/sizeof(confparams),"pgsql_ssl"); pgsql_ssl=(char *)(vpointer?vpointer:pgsql_ssl); vpointer=get_confvar_value(pgsql_nuauth_vars,sizeof(pgsql_nuauth_vars)/sizeof(confparams),"pgsql_db_name"); pgsql_db_name=(char *)(vpointer?vpointer:pgsql_db_name); vpointer=get_confvar_value(pgsql_nuauth_vars,sizeof(pgsql_nuauth_vars)/sizeof(confparams),"pgsql_table_name"); pgsql_table_name=(char *)(vpointer?vpointer:pgsql_table_name); vpointer=get_confvar_value(pgsql_nuauth_vars,sizeof(pgsql_nuauth_vars)/sizeof(confparams),"pgsql_request_timeout"); pgsql_request_timeout=*(int *)(vpointer?vpointer:&pgsql_request_timeout); /* init thread private stuff */ pgsql_priv = g_private_new (g_free); return NULL; } /* In : time in seconds from epoch * Out : char* containing acceptable input to POstgresql. Must be allocated with at least 26 bytes*/ void epoch_to_char(long unsigned int i, char **value) { struct tm *time; time = (struct tm *)malloc(sizeof(struct tm)); gmtime_r(&i,time); asctime_r(time,*value); free(time); } /* * Initialize connection to pgsql server */ G_MODULE_EXPORT PGconn *pgsql_conn_init(void){ PGconn *ld = NULL; char *pgsql_conninfo; int pgsql_status; //,err,version=3; char port[15],timeout[15],server_port[15]; if (snprintf(port,14,"%d",pgsql_server_port) >= 14){return NULL;} if (snprintf(timeout,14,"%d",pgsql_request_timeout) >= 14){return NULL;}; if (snprintf(server_port,14,"%d",pgsql_server_port) >= 14){return NULL;}; pgsql_conninfo = (char *)calloc(strlen(pgsql_user) + strlen(pgsql_passwd) + strlen(pgsql_server) + strlen(pgsql_ssl) + strlen(server_port) + strlen(pgsql_db_name) + strlen(port) + strlen(timeout) + strlen("hostaddr='' port= dbname='' user='' password='' connect_timeout= sslmode='' ") + 1, sizeof(char)); if (pgsql_conninfo == NULL){return NULL;} //Build string we will pass to PQconnectdb strncat(pgsql_conninfo,"host='",6); strncat(pgsql_conninfo,pgsql_server,strlen(pgsql_server)); strncat(pgsql_conninfo,"' port=",7); strncat(pgsql_conninfo,port,strlen(pgsql_conninfo)); strncat(pgsql_conninfo," dbname='",9); strncat(pgsql_conninfo,pgsql_db_name,strlen(pgsql_db_name)); strncat(pgsql_conninfo,"' user='",8); strncat(pgsql_conninfo,pgsql_user,strlen(pgsql_user)); strncat(pgsql_conninfo,"' password='",12); strncat(pgsql_conninfo,pgsql_passwd,strlen(pgsql_passwd)); strncat(pgsql_conninfo,"' connect_timeout=",18); strncat(pgsql_conninfo,timeout,strlen(timeout)); /* strcat(pgsql_conninfo," sslmode='"); strcat(pgsql_conninfo,pgsql_ssl); strcat(pgsql_conninfo,"'"); */ /* init connection */ #if OTHER_CHOICE pgsql_conninfo=g_strjoin(" ","host='",pgsql_server, "' port=",port, " dbname='", pgsql_db_name, "' user='",pgsql_user, "' password='",pgsql_passwd, "' connect_timeout=",timeout); #endif if (DEBUG_OR_NOT(DEBUG_LEVEL_DEBUG,DEBUG_AREA_MAIN)) g_message("Going to init pgsql connection "); ld = PQconnectdb(pgsql_conninfo); if (DEBUG_OR_NOT(DEBUG_LEVEL_DEBUG,DEBUG_AREA_MAIN)) g_message("..."); pgsql_status=PQstatus(ld); if(pgsql_status != CONNECTION_OK) { if (DEBUG_OR_NOT(DEBUG_LEVEL_WARNING,DEBUG_AREA_MAIN)) g_warning("pgsql init error : %s\n",strerror(errno)); if (DEBUG_OR_NOT(DEBUG_LEVEL_DEBUG,DEBUG_AREA_MAIN)) g_message("connection : %s",pgsql_conninfo); free(pgsql_conninfo); PQfinish(ld); return NULL; } if (DEBUG_OR_NOT(DEBUG_LEVEL_DEBUG,DEBUG_AREA_MAIN)) g_message("Pgsql init done"); free(pgsql_conninfo); return ld; } static gchar * generate_osname(gchar *Name,gchar *Version,gchar *Release) { if (Name && Release && Version){ if ((strlen(Name)+strlen(Release)+strlen(Version)+3) > OSNAME_MAX_SIZE) return g_strdup(""); }else return g_strdup(""); return g_strjoin("-",Name,Version,Release); } static gchar* generate_appname(gchar *Name) { if (!Name) return g_strdup(""); if ((strlen(Name)+1) > APPNAME_MAX_SIZE) { return g_strdup(""); } return g_strdup(Name); } G_MODULE_EXPORT gint user_packet_logs (connection element, int state){ PGconn *ld = g_private_get (pgsql_priv); char request[LONG_REQUEST_SIZE]; struct in_addr ipone,iptwo; PGresult *Result; char tmp_inet1[41], tmp_inet2[41]; if (ld == NULL){ ld=pgsql_conn_init(); if (ld == NULL){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Can not initiate PGSQL conn\n"); return -1; } g_private_set(pgsql_priv,ld); } /* contruct request */ switch (state){ case STATE_OPEN: switch ((element.tracking_hdrs).protocol){ case IPPROTO_TCP: // // FIELD IN NUAUTH STRUCTURE IN ULOG //user_id u_int16_t integer //ip_protocol u_int8_t smallint 2 bytes //ip_saddr u_int32_t inet 12 or 24 bytes (ipv4 or ipv6) //ip_daddr u_int32_t inet //tcp_sport u_int16_t integer 4 bytes //tcp_dport u_int16_t integer //udp_sport u_int16_t integer //udp_dport u_int16_t integer //icmp_type u_int8_t smallint 2 bytes //icmp_code u_int8_t smallint 2 bytes //start_timestamp long bigint 8 bytes //end_timestamp long bigint // // // ipone.s_addr=ntohl((element.tracking_hdrs).saddr); strncpy(tmp_inet1,inet_ntoa(ipone),40) ; if (nuauth_log_users_strict){ char *my_timestamp; my_timestamp=(char *)calloc(26,sizeof(char)); if (my_timestamp == NULL) { g_warning("Can not malloc for my_timestamp"); return -1; } epoch_to_char(element.timestamp,&my_timestamp); if (snprintf(request,SHORT_REQUEST_SIZE-1,"UPDATE %s SET end_timestamp='%s', state=%hu WHERE (ip_saddr='%s' and tcp_sport=%u and (state=1 or state=2))", pgsql_table_name, my_timestamp, STATE_CLOSE, tmp_inet1, (element.tracking_hdrs).source ) >= SHORT_REQUEST_SIZE-1){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Building pgsql update query, the SHORT_REQUEST_SIZE limit was reached!\n"); free(my_timestamp); return -1; } free(my_timestamp); Result = PQexec(ld, request); if (!Result == PGRES_TUPLES_OK){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Can not update Data : %s\n",PQerrorMessage(ld)); return -1; } } if (element.username != NULL) { gchar* OSFullname; gchar* AppFullname; OSFullname = generate_osname(element.sysname,element.version,element.release); AppFullname = generate_appname(element.appname); /*Just a size check actually*/ if (snprintf(request,LONG_REQUEST_SIZE-1,"INSERT INTO %s (username,user_id,oob_time_sec,ip_protocol,ip_saddr,ip_daddr,tcp_sport,tcp_dport,state,oob_prefix,client_os,client_app) VALUES ('%s',%u,%lu,%u,'%s','%s',%u,%u,%hu,'ACCEPT','%s','%s');", pgsql_table_name, element.username, (element.user_id), element.timestamp, (element.tracking_hdrs).protocol, tmp_inet1, tmp_inet2, (element.tracking_hdrs).source, (element.tracking_hdrs).dest, STATE_OPEN, OSFullname, AppFullname ) >= LONG_REQUEST_SIZE-1 ) { if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Building pgsql insert query, the LONG_REQUEST_SIZE limit was reached!\n"); g_free(OSFullname); g_free(AppFullname); return -1; } g_free(OSFullname); g_free(AppFullname); } else { if (snprintf(request,SHORT_REQUEST_SIZE-1,"INSERT INTO %s (user_id,oob_time_sec,ip_protocol,ip_saddr,ip_daddr,tcp_sport,tcp_dport,state,oob_prefix) VALUES (%u,%lu,%u,'%s','%s',%u,%u,%hu,'ACCEPT');", pgsql_table_name, (element.user_id), element.timestamp, (element.tracking_hdrs).protocol, tmp_inet1, tmp_inet2, (element.tracking_hdrs).source, (element.tracking_hdrs).dest, STATE_OPEN ) >= SHORT_REQUEST_SIZE-1){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Building pgsql insert query, the SHORT_REQUEST_SIZE limit was reached!\n"); return -1; } } if (DEBUG_OR_NOT(DEBUG_LEVEL_DEBUG,DEBUG_AREA_MAIN)) g_message("Doing %s ...",request); Result = PQexec(ld, request); if (!Result == PGRES_TUPLES_OK){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Can not insert Data : %s\n",PQerrorMessage(ld)); return -1; } else { if (DEBUG_OR_NOT(DEBUG_LEVEL_DEBUG,DEBUG_AREA_MAIN)) g_message("Request done\n"); } break; case IPPROTO_UDP: { gchar* OSFullname; gchar* AppFullname; OSFullname = generate_osname(element.sysname,element.version,element.release); AppFullname = generate_appname(element.appname); /*Just a size check actually*/ ipone.s_addr=ntohl((element.tracking_hdrs).saddr); iptwo.s_addr=ntohl((element.tracking_hdrs).daddr); strncpy(tmp_inet1,inet_ntoa(ipone),40) ; strncpy(tmp_inet2,inet_ntoa(iptwo),40) ; if (snprintf(request,LONG_REQUEST_SIZE-1,"INSERT INTO %s (username,user_id,oob_time_sec,ip_protocol,ip_saddr,ip_daddr,udp_sport,udp_dport,state,oob_prefix,client_os,client_app) VALUES ('%s',%u,%lu,%u,'%s','%s',%u,%u,%hu,'ACCEPT','%s','%s');", //TODO : Add a check about username being NULL pgsql_table_name, element.username, (element.user_id), element.timestamp, (element.tracking_hdrs).protocol, tmp_inet1, tmp_inet2, (element.tracking_hdrs).source, (element.tracking_hdrs).dest, STATE_OPEN, OSFullname, AppFullname ) >= LONG_REQUEST_SIZE-1 ){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Building pgsql insert query, the LONG_REQUEST_SIZE limit was reached!\n"); g_free(OSFullname); g_free(AppFullname); return -1; } g_free(OSFullname); g_free(AppFullname); Result = PQexec(ld, request); if (!Result == PGRES_TUPLES_OK){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Can not insert Data : %s\n",PQerrorMessage(ld)); return -1; } return 0; } default: { gchar* OSFullname; gchar* AppFullname; OSFullname = generate_osname(element.sysname,element.version,element.release); AppFullname = generate_appname(element.appname); /*Just a size check actually*/ ipone.s_addr=ntohl((element.tracking_hdrs).saddr); iptwo.s_addr=ntohl((element.tracking_hdrs).daddr); strncpy(tmp_inet1,inet_ntoa(ipone),40) ; strncpy(tmp_inet2,inet_ntoa(iptwo),40) ; if (snprintf(request,LONG_REQUEST_SIZE-1,"INSERT INTO %s (username,user_id,oob_time_sec,ip_protocol,ip_saddr,ip_daddr,state,oob_prefix,client_os,client_app) VALUES ('%s',%u,%lu,%u,'%s','%s',%hu,'ACCEPT','%s','%s');", //TODO : username NULL? pgsql_table_name, element.username, (element.user_id), element.timestamp, (element.tracking_hdrs).protocol, tmp_inet1, tmp_inet2, STATE_OPEN, OSFullname, AppFullname ) >= LONG_REQUEST_SIZE-1){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Building pgsql insert query, the LONG_REQUEST_SIZE limit was reached!\n"); g_free(OSFullname); g_free(AppFullname); return -1; } g_free(OSFullname); g_free(AppFullname); Result = PQexec(ld, request); if (!Result == PGRES_TUPLES_OK){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Can not insert Data : %s\n",PQerrorMessage(ld)); return -1; } return 0; } } break; case STATE_ESTABLISHED: if ((element.tracking_hdrs).protocol == IPPROTO_TCP){ int update_status = 0; while (update_status < 2){ char *my_timestamp; my_timestamp=(char *)calloc(26,sizeof(char)); if (my_timestamp == NULL) { g_warning("Can not malloc for my_timestamp"); return -1; } epoch_to_char(element.timestamp,&my_timestamp); update_status++; ipone.s_addr=ntohl((element.tracking_hdrs).saddr); iptwo.s_addr=ntohl((element.tracking_hdrs).daddr); strncpy(tmp_inet1,inet_ntoa(ipone),40) ; strncpy(tmp_inet2,inet_ntoa(iptwo),40) ; if (snprintf(request,SHORT_REQUEST_SIZE-1,"UPDATE %s SET state=%hu, start_timestamp='%s' WHERE (ip_daddr='%s' and ip_saddr='%s' and tcp_dport=%u and tcp_sport=%u and state=%hu);", pgsql_table_name, STATE_ESTABLISHED, my_timestamp, tmp_inet1, tmp_inet2, (element.tracking_hdrs).source, (element.tracking_hdrs).dest, STATE_OPEN ) >= SHORT_REQUEST_SIZE-1){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Building pgsql update query, the SHORT_REQUEST_SIZE limit was reached!\n"); free(my_timestamp); return -1; } free(my_timestamp); Result = PQexec(ld, request); if (!Result == PGRES_TUPLES_OK){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Can not update Data : %s\n",PQerrorMessage(ld)); return -1; } if (atoi(PQcmdTuples(Result)) >= 1){ return 0; }else{ if (update_status <2){ usleep(33333); //Sleep for 1/3 sec }else{ #ifdef DEBUG_ENABLE if (DEBUG_OR_NOT(DEBUG_LEVEL_WARNING,DEBUG_AREA_MAIN)) g_warning("Tried to update PGSQL entry twice, looks like data to update wasn't inserted\n"); #endif } } } return 0; } //Nothing will be done... return 0; case STATE_CLOSE: if ((element.tracking_hdrs).protocol == IPPROTO_TCP){ int update_status = 0; while (update_status < 2){ char *my_timestamp; my_timestamp=(char *)calloc(26,sizeof(char)); if (my_timestamp == NULL) { g_warning("Can not malloc for my_timestamp"); return -1; } epoch_to_char(element.timestamp,&my_timestamp); update_status++; ipone.s_addr=ntohl((element.tracking_hdrs).saddr); iptwo.s_addr=ntohl((element.tracking_hdrs).daddr); strncpy(tmp_inet1,inet_ntoa(ipone),40) ; strncpy(tmp_inet2,inet_ntoa(iptwo),40) ; if (snprintf(request,SHORT_REQUEST_SIZE-1,"UPDATE %s SET end_timestamp='%s', state=%hu WHERE (ip_saddr='%s' and ip_daddr='%s' and tcp_sport=%u and tcp_dport=%u and state=%hu);", pgsql_table_name, my_timestamp, STATE_CLOSE, tmp_inet1, tmp_inet2, (element.tracking_hdrs).source, (element.tracking_hdrs).dest, STATE_ESTABLISHED ) >= SHORT_REQUEST_SIZE-1){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Building pgsql update query, the SHORT_REQUEST_SIZE limit was reached!\n"); free(my_timestamp); return -1; } free(my_timestamp); Result = PQexec(ld, request); if (!Result == PGRES_TUPLES_OK){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Can not update Data : %s\n",PQerrorMessage(ld)); return -1; } if (atoi(PQcmdTuples(Result)) >=1){ return 0; }else{ if (update_status <2){ usleep(66666); //Sleep for 2/3 sec }else{ #ifdef DEBUG_ENABLE if (DEBUG_OR_NOT(DEBUG_LEVEL_WARNING,DEBUG_AREA_MAIN)) g_warning("Tried to update PGSQL entry twice, looks like data to update wasn't inserted\n"); #endif } } } return 0; } //Nothing will be done... return 0; case STATE_DROP: switch ((element.tracking_hdrs).protocol) { case IPPROTO_TCP: { gchar* OSFullname; gchar* AppFullname; OSFullname = generate_osname(element.sysname,element.version,element.release); AppFullname = generate_appname(element.appname); /*Just a size check actually*/ ipone.s_addr=ntohl((element.tracking_hdrs).saddr); iptwo.s_addr=ntohl((element.tracking_hdrs).daddr); strncpy(tmp_inet1,inet_ntoa(ipone),40) ; strncpy(tmp_inet2,inet_ntoa(iptwo),40) ; if (element.username == NULL){ element.username="No User Given"; } if (snprintf(request,LONG_REQUEST_SIZE-1,"INSERT INTO %s (username,user_id,oob_time_sec,ip_protocol,ip_saddr,ip_daddr,tcp_sport,tcp_dport,state,oob_prefix,client_os,client_app) VALUES ('%s',%u,%lu,%u,'%s','%s',%u,%u,%hu,'DROP','%s','%s');",//TODO : username NULL? pgsql_table_name, element.username, (element.user_id), element.timestamp, (element.tracking_hdrs).protocol, tmp_inet1, tmp_inet2, (element.tracking_hdrs).source, (element.tracking_hdrs).dest, STATE_DROP, OSFullname, AppFullname ) >= LONG_REQUEST_SIZE-1 ){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Building pgsql insert query, the LONG_REQUEST_SIZE limit was reached!\n"); g_free(OSFullname); g_free(AppFullname); return -1; } g_free(OSFullname); g_free(AppFullname); Result = PQexec(ld, request); if (!Result == PGRES_TUPLES_OK){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Can not insert Data : %s\n",PQerrorMessage(ld)); return -1; } break; } case IPPROTO_UDP: { gchar* OSFullname; gchar* AppFullname; OSFullname = generate_osname(element.sysname,element.version,element.release); AppFullname = generate_appname(element.appname); /*Just a size check actually*/ ipone.s_addr=ntohl((element.tracking_hdrs).saddr); iptwo.s_addr=ntohl((element.tracking_hdrs).daddr); strncpy(tmp_inet1,inet_ntoa(ipone),40) ; strncpy(tmp_inet2,inet_ntoa(iptwo),40) ; if (element.username == NULL){ element.username="No User Given"; } if (snprintf(request,LONG_REQUEST_SIZE-1,"INSERT INTO %s (username,user_id,oob_time_sec,ip_protocol,ip_saddr,ip_daddr,udp_sport,udp_dport,state,oob_prefix,client_os,client_app) VALUES ('%s',%u,%lu,%u,'%s','%s',%u,%u,%hu,'DROP','%s','%s');", //TODO : username NULL? pgsql_table_name, element.username, (element.user_id), element.timestamp, (element.tracking_hdrs).protocol, tmp_inet1, tmp_inet2, (element.tracking_hdrs).source, (element.tracking_hdrs).dest, STATE_DROP, OSFullname, AppFullname ) >= LONG_REQUEST_SIZE-1 ){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Building pgsql insert query, the LONG_REQUEST_SIZE limit was reached!\n"); g_free(OSFullname); g_free(AppFullname); return -1; } g_free(OSFullname); g_free(AppFullname); Result = PQexec(ld, request); if (!Result == PGRES_TUPLES_OK){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Can not insert Data : %s\n",PQerrorMessage(ld)); return -1; } return 0; break; } default: { gchar* OSFullname; gchar* AppFullname; OSFullname = generate_osname(element.sysname,element.version,element.release); AppFullname = generate_appname(element.appname); /*Just a size check actually*/ ipone.s_addr=ntohl((element.tracking_hdrs).saddr); iptwo.s_addr=ntohl((element.tracking_hdrs).daddr); strncpy(tmp_inet1,inet_ntoa(ipone),40) ; strncpy(tmp_inet2,inet_ntoa(iptwo),40) ; if (snprintf(request,LONG_REQUEST_SIZE-1,"INSERT INTO %s (username,user_id,oob_time_sec,ip_protocol,ip_saddr,ip_daddr,state,oob_prefix,client_os,client_app) VALUES ('%s',%u,%lu,%u,'%s','%s',%lu,%hu,'DROP','%s','%s');", //TODO : username NULL? pgsql_table_name, element.username, (element.user_id), element.timestamp, (element.tracking_hdrs).protocol, tmp_inet1, tmp_inet2, element.timestamp, STATE_DROP, OSFullname, AppFullname ) >= LONG_REQUEST_SIZE-1){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Building pgsql insert query, the LONG_REQUEST_SIZE limit was reached!\n"); g_free(OSFullname); g_free(AppFullname); return -1; } g_free(OSFullname); g_free(AppFullname); Result = PQexec(ld, request); if (!Result == PGRES_TUPLES_OK){ if (DEBUG_OR_NOT(DEBUG_LEVEL_SERIOUS_WARNING,DEBUG_AREA_MAIN)) g_warning("Can not insert Data : %s\n",PQerrorMessage(ld)); return -1; } return 0; } } break; } //This return is just here to please GCC, will never be reached return 0; } G_MODULE_EXPORT gint log_sql_disconnect(void){ PGconn *ld = g_private_get (pgsql_priv); PQfinish(ld); return 0; }