#pragma module NETFLOW_RDB "NETFLOW_RDB-1-D" #define __MODULE__ "NETFLOW_RDB" /* **++ ** FACILITY: NetFlow Host Collector ** ** MODULE DESCRIPTION: ** ** This module contains a set of routines to store Netflow Data records ** in the Digital RDB (ORACLE RDB). ** ** AUTHORS: ** ** Ruslan R. Laishev ** ** CREATION DATE: 10-AUG-2009 ** ** ** USAGE: ** DEFINE /SYS NETFLOW_DB dev:[dir]NETFLOW_RDB.EXE ** ** MODIFICATION HISTORY: ** ** 5-NOV-2009 RRL Added srcas (Source AS number). ** {@tbs@}... **-- */ /* ** ** INCLUDE FILES ** */ #include #include #include #include #include #include #include #include #define __NEW_STARLET 1 #include "netflowdef.h" int exit_flag = 0, debug_flag = 1; #define DEBUG if(debug_flag)printf("%-24.24s:%-08.0u ",__MODULE__,__LINE__);if(debug_flag)printf #define INIT_SDESC(dsc, len, ptr) {(dsc).dsc$b_dtype = DSC$K_DTYPE_T;\ (dsc).dsc$b_class = DSC$K_CLASS_S; (dsc).dsc$w_length = (short) (len);\ (dsc).dsc$a_pointer = (ptr);} /* **++ ** FUNCTIONAL DESCRIPTION: ** ** Add user to the Users Authorization Table. INSERT-int new record into the ** uat Table. ** ** FORMAL PARAMETERS: ** ** name: A Short NAme/Nickname ** pass: An initial password ** email: A user E-Mail ** uic: User Identification Code to be returned ** ** RETURN VALUE: ** ** VMS Condition code ** **-- */ static void rdb_errhnd ( RDB$_MESSAGE_VECTOR *msgvec, int *sqlcode, char *sqlcodeate, void *context ) { char msgtxt[1024]; int msglen = 0; struct dsc$descriptor msg_dsc; sql_get_error_text(msgtxt,sizeof(msgtxt),&msglen); INIT_SDESC(msg_dsc,msglen,msgtxt); lib$put_output(&msg_dsc); } void *errrtn = NULL, *errctx = NULL; int netflow_dbinit (void ** ctx) { int status; debug_flag = (NULL != getenv("NETFLOW$DEBUG")); sql_deregister_error_handler(); status = sql_get_error_handler(&errrtn, &errctx); status = sql_register_error_handler(&rdb_errhnd,NULL); return SS$_NORMAL;; } int netflow_dbshut (void * ctx) { int status; db_flush(&status); if ( status ) sql_signal(); return SS$_NORMAL; } int netflow_dbsave ( void * ctx, NF_RECV5 * rec ) { int status; static int rcount = 0; unsigned char sysip[16] = {0},src[16] = {0},dst[16] = {0}; strncpy(&sysip,&rec->nf_rec$t_sysip,15); strncpy(&src,&rec->nf_rec$t_srcaddr,15); strncpy(&dst,&rec->nf_rec$t_dstaddr,15); sysip[15] = src[15] = dst[15] = '\0'; db_put(&status, sysip,src,dst, &rec->nf_rec$w_input,&rec->nf_rec$w_output, &rec->nf_rec$l_dpkts,&rec->nf_rec$l_doctets, &rec->nf_rec$w_srcport,&rec->nf_rec$w_dstport, &rec->nf_rec$b_tcp_flags,&rec->nf_rec$b_prot, &rec->nf_rec$b_tos,&rec->nf_rec$w_dst_as, &rec->nf_rec$w_src_as); if ( status ) sql_signal(); if ( !((++rcount)%512) ) db_flush(&status); if ( status ) sql_signal(); return SS$_NORMAL; }