/* * Class: de_fraunhofer_fokus_ants_jipfix_jIPFIX * Method: ipfixCollectorListen * Signature: (IIII)V */ JNIEXPORT jbyte JNICALL Java_de_fraunhofer_fokus_ants_jipfix_jIPFIX_ipfixCollectorListen(JNIEnv *env, jobject self, jint protocol, jint port, jint family, jint maxcon) { if ( ipfix_col_listen( &ntcp_s, &tcp_s, protocol, port, family, 10 ) <0 ) { checkException(env); return -1; } checkException(env); return 0; }
int main (int argc, char *argv[]) { char opt; /* short options: character */ char optstr[] = "hp:c:P:r:stuvlf:"; int port; /* port number */ int cport = 4740; /* target collector port number */ int protocol = IPFIX_PROTO_TCP; int do_log = 0; /* flag to stre whether logging to stdout was enabled */ /** set default options */ port = 4739; datadir = NULL; snprintf( progname, sizeof(progname), "%s", basename( argv[0]) ); /* --- command line parsing --- */ int cisset = 0; while( ( opt = getopt( argc, argv, optstr ) ) != EOF ) { switch ( opt ) { case 'o': if ((sourceid=atoi(optarg)) <0) { fprintf( stderr, "Invalid -o argument!\n" ); exit(1); } break; case 'p': if ((port=atoi(optarg)) <0) { fprintf( stderr, "Invalid -p argument!\n" ); exit(1); } break; case 'v': verbose_level ++; break; case 'l': do_log = 1; break; case 'P': if ((cport=atoi(optarg)) <0) { fprintf( stderr, "Invalid -P argument!\n" ); exit(1); } break; case 'r': if ((degrade=atoi(optarg)) <0) { fprintf( stderr, "Invalid -r argument!\n" ); exit(1); } break; case 'c': if (chost) free(chost); /* executed in case of multiple "-c <collectorhost>" */ chost = strdup(optarg); cisset = 1; break; case 'f': if (datadir) free(datadir); /* executed in case of multiple "-f <datadir>" */ datadir = strdup(optarg); break; case 's': protocol = IPFIX_PROTO_SCTP; break; case 't': protocol = IPFIX_PROTO_TCP; break; case 'u': protocol = IPFIX_PROTO_UDP; break; case 'h': default: usage(progname); exit(1); } } if (!chost && !datadir && !do_log) { fprintf( stderr, "You must specify either an IPFIX target collector host or a datadir or enable log to stdout. Type option '-h' for help.\n"); exit(1); } /** init hashtable structures */ hi_init_uint32_t(&indegree, 1000); hi_init_uint32_t(&outdegree, 1000); hi_init_uint32_t(&flows, 1000); hi_init_str (&templates, 100); /** init logging */ mlog_set_vlevel( verbose_level ); /** init ipfix lib */ if ( ipfix_init() <0 ) { fprintf( stderr, "ipfix_init() failed: %s\n", strerror(errno) ); exit(1); } if ( ipfix_add_vendor_information_elements( ipfix_ft_fokus ) <0 ) { fprintf( stderr, "ipfix_add_ie() failed: %s\n", strerror(errno) ); exit(1); } /** init ipfix import/export */ if ( ipfix_open( &ipfixh, sourceid, IPFIX_VERSION ) <0 ) { fprintf( stderr, "ipfix_open() failed: %s\n", strerror(errno) ); exit(1); } /** signal handler */ signal( SIGKILL, exit_func ); signal( SIGTERM, exit_func ); signal( SIGINT, exit_func ); /** initialize callback methods */ /** activate stdout log output * if "-l" was specified on cmd line */ if (do_log) { (void) ipfix_col_start_msglog( stdout ); } /** activate file export * if "-f <datadir>" was specified on cmd line */ if (datadir) { (void) ipfix_col_init_fileexport( datadir ); } if (chost) { if ( ipfix_add_collector( ipfixh, chost, cport, protocol ) <0 ) { fprintf( stderr, "ipfix_add_collector(%s,%d) failed: %s\n", chost, cport, strerror(errno)); exit(1); } /** activate callback for re-export */ if ( (g_colinfo=calloc( 1, sizeof(ipfix_col_info_t))) ==NULL) { fprintf( stderr, "a calloc failed while initializing callback methods.\n" ); return -1; } g_colinfo->export_newsource = export_newsource_cb; g_colinfo->export_newmsg = export_newmsg_cb; g_colinfo->export_trecord = export_trecord_cb; g_colinfo->export_drecord = export_drecord_cb; g_colinfo->export_cleanup = export_cleanup_cb; g_colinfo->data = NULL; if ( ipfix_col_register_export( g_colinfo ) <0 ) { fprintf( stderr, "ipfix_col_register_export() failed: %s\n", strerror(errno) ); exit(1); } } /** open ipfix collector port(s) */ if ( ipfix_col_listen( &ntcp_s, &tcp_s, IPFIX_PROTO_TCP, port, AF_INET, 10 ) <0 ) { fprintf( stderr, "[%s] ipfix_listen(tcp) failed.\n", progname ); return -1; } /** event loop */ (void) mpoll_loop( -1 ); exit(1); }
int main (int argc, char *argv[]) { int port; /* port number */ char *dbuser; /* db username */ char *dbpw; /* db password */ char *dbname; /* db name */ char *dbhost; /* hostname */ char arg; /* short options: character */ char opt[] = "hp:v"; /** set default options */ port = 4739; dbhost = MYSQL_HOST; dbname = MYSQL_DBNAME; dbuser = MYSQL_USER; dbpw = MYSQL_PASSWORD; snprintf( progname, sizeof(progname), "%s", basename( argv[0]) ); /* --- command line parsing --- */ while( (arg=getopt( argc, argv, opt )) != EOF ) { switch (arg) { case 'p': if ((port=atoi(optarg)) <0) { fprintf( stderr, "invalid -p argument!\n" ); exit(1); } break; case 'v': verbose_level ++; break; case 'h': default: usage(progname); exit(1); } } /** init loggin */ mlog_set_vlevel( verbose_level ); /** signal handler */ signal( SIGKILL, exit_func ); signal( SIGTERM, exit_func ); signal( SIGINT, exit_func ); /** init ipfix lib */ if ( ipfix_init() <0 ) { fprintf( stderr, "ipfix_init() failed: %s\n", strerror(errno) ); exit(1); } if ( ipfix_add_vendor_information_elements( ipfix_ft_fokus ) <0 ) { fprintf( stderr, "ipfix_add_ie() failed: %s\n", strerror(errno) ); ipfix_cleanup(); exit(1); } /** activate database export */ if ( ipfix_col_init_mysqlexport( dbhost, dbuser, dbpw, dbname ) <0 ) { fprintf( stderr, "cannot connect to database\n" ); ipfix_cleanup(); exit(1); } /** open ipfix collector port(s) */ if ( ipfix_col_listen( &ntcp_s, &tcp_s, IPFIX_PROTO_TCP, port, AF_INET, 10 ) <0 ) { fprintf( stderr, "[%s] ipfix_listen(tcp) failed.\n", progname ); return -1; } /** event loop */ (void) mpoll_loop( -1 ); exit(1); }
int do_collect() { int i, retval = -1; ipfix_ssl_opts_t opts; if ( par.ssl ) { opts.cafile = par.cafile; opts.cadir = par.cadir; opts.keyfile = par.keyfile; opts.certfile= par.certfile; } /** activate file export */ if ( par.datadir || par.datafile) (void) ipfix_col_init_fileexport( par.datadir, par.datafile); #ifdef DBSUPPORT if ( par.dbexport ) { if ( ipfix_col_init_mysqlexport( par.dbhost, par.dbuser, par.dbpw, par.dbname ) <0 ) { mlogf( 0, "[%s] cannot connect to database\n", par.progname ); return -1; } } #endif /** open ipfix collector port(s) */ if ( par.tcp ) { if ( par.ssl ) { if ( ipfix_col_listen_ssl( &scol, IPFIX_PROTO_TCP, par.port, par.family, par.maxcon, &opts ) <0 ) { fprintf( stderr, "ipfix_listen_ssl(tcp) failed: %s\n", strerror(errno) ); return -1; } } else if ( ipfix_col_listen( &ntcp_s, &tcp_s, IPFIX_PROTO_TCP, par.port, par.family, par.maxcon ) <0 ) { fprintf( stderr, "ipfix_listen(tcp) failed: %s\n", strerror(errno) ); return -1; } } if ( par.udp ) { if ( par.ssl ) { if ( ipfix_col_listen_ssl( &scol, IPFIX_PROTO_UDP, par.port, par.family, 0, &opts ) <0 ) { fprintf( stderr, "ipfix_listen_ssl(udp) failed: %s\n", strerror(errno) ); return -1; } } else if ( ipfix_col_listen( &nudp_s, &udp_s, IPFIX_PROTO_UDP, par.port, par.family, 0 ) <0 ) { fprintf( stderr, "ipfix_listen(udp) failed: %s\n", strerror(errno) ); goto end; } } if ( par.sctp ) { if ( ipfix_col_listen( &nsctp_s, &sctp_s, IPFIX_PROTO_SCTP, par.port, par.family, par.maxcon ) <0 ) { fprintf( stderr, "ipfix_listen(sctp) failed: %s\n", strerror(errno) ); goto end; } } /** event loop */ for (;;) { if ( mpoll_loop( 10 ) <0 ) break; } /* forever */ end: if ( par.tcp && tcp_s ) { for( i=0; i<ntcp_s; i++ ) ipfix_col_close( tcp_s[i] ); } if ( par.udp && udp_s ) { for( i=0; i<nudp_s; i++ ) ipfix_col_close( udp_s[i] ); } if ( par.sctp && sctp_s ) { for( i=0; i<nsctp_s; i++ ) ipfix_col_close( sctp_s[i] ); } return retval; }