Exemple #1
0
/*
 * 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);
}
Exemple #4
0
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;
}