Связка с flow-tools
Материал из BiTel WiKi
(Новая: Прежде всего нужно инсталировать flow-tools. Для этого в [http://www.gentoo.org/ gentoo] достаточно набрать от root одну ко...)
Следующая правка →
Версия 17:27, 9 мая 2008
Прежде всего нужно инсталировать flow-tools.
Для этого в gentoo достаточно набрать от root одну команду emerge flow-tools
вот текст программы которая конвертирует файлы в формате flow-tools в формат бгбиллинга
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include "ftlib.h"
/* $Id: $ */
#pragma pack(1)
typedef struct
{
unsigned long fromAddr;
unsigned long toAddr;
short int fromIface;
short int toIface;
short int fromPort;
short int toPort;
unsigned long amount;
} bitel;
/* parameters
* dstfile router_ip [dstfile router] sb srcfile [srcfile..]
*/
int
main (int argc, char *argv[])
{
int i = 0;
int fd = 0;
int str_count = 0;
FILE *fp;
FILE *out;
struct ftio ftio;
struct ftprof ftp;
struct fts3rec_offsets fo;
struct ftver ftv;
char *rec;
u_int32 last_time;
u_int32 tm;
bitel b_rec;
if (argc < 3)
{
fprintf (stderr, "Usage: %s out_file in_file1 in_file2 in_file3 ... \n",
argv[0]);
return 1;
}
if ((out = fopen (argv[1], "wb")) == NULL)
{
perror ("Cannot create file %m");
return 2;
}
for (i = 2; i < argc; i++)
{
if ((fp = fopen (argv[i], "rb")) == NULL)
{
perror ("Cannot open file %m");
return 1;
}
fd = fileno (fp);
fterr_setid (argv[0]);
ftprof_start (&ftp);
if (ftio_init (&ftio, fd, FT_IO_FLAG_READ) < 0)
{
perror ("Error in initialization ftio structure:%m");
return 0;
}
ftio_get_ver (&ftio, &ftv);
fts3rec_compute_offsets (&fo, &ftv);
last_time = 0;
while ( (rec = ftio_read (&ftio)) )
{
str_count++;
tm = *((u_int32 *) (rec + fo.unix_secs));
if (last_time != tm)
{
b_rec.fromAddr = 0;
b_rec.toAddr = 0;
b_rec.fromIface = htons (0xff77);
b_rec.toIface = htons (0xff77);
b_rec.fromPort = htons ((u_int16) ((tm >> 16) & 0xFFFF));
b_rec.toPort = htons ((u_int16) (tm & 0xFFFF));
b_rec.amount = 0;
fwrite (&b_rec, sizeof (bitel), 1, out);
last_time = tm;
}
b_rec.fromAddr = htonl (*((u_int32 *) (rec + fo.srcaddr)));
b_rec.toAddr = htonl (*((u_int32 *) (rec + fo.dstaddr)));
b_rec.fromIface = htons (*((u_int16 *) (rec + fo.input)));
b_rec.toIface = htons (*((u_int16 *) (rec + fo.output)));
b_rec.fromPort = htons (*((u_int16 *) (rec + fo.srcport)));
b_rec.toPort = htons (*((u_int16 *) (rec + fo.dstport)));
b_rec.amount = htonl (*((u_int32 *) (rec + fo.dOctets)));
fwrite (&b_rec, sizeof (bitel), 1, out);
}
ftio_close (&ftio);
fclose (fp);
}
fclose (out);
fprintf (stderr, "Total lines: %d\n", str_count);
return 0;
}
программа собирается так gcc -Wall -o f2b f2b.c -lz -lft
Как агрумент программа берет файл в который нужно записать данные в формате бгбиллинга и список файлов в формате flow-tools из которых брать исходные данные
вот пример скрипта который вызывается по крону каждый час и конвертит данные. скрипт берет данные из файлов /mnt/flow_export/имя_наса/2008-05-01/ft-v05.2008-05-01.110503+0900 (это стандартный формат имени для flow-tools) конвертит их и переносит в /mnt/flow_export_converted/source_id/2008/05/01/log_11
запущеный без параметра скрипт обрабатывает все данные за предыдущий час. Скрипт можно вызывать с параметром число часов которые нужно отступить назад.
#!/bin/bash
export JAVA_HOME=/etc/java-config-2/current-system-vm
indir=/mnt/flow_export
outdir=/mnt/flow_export_converted
convprog=f2b
load_prog=/usr/local/BGIPNNetflowCollector/netflow.sh
flowload=/var/log/flowload.log
umask 027
hours_ago=$1
[[ -z "${hours_ago}" ]] && hours_ago=1
year=`date --date="${hours_ago} hour ago" +"%Y"`
month=`date --date="${hours_ago} hour ago" +"%m"`
day=`date --date="${hours_ago} hour ago" +"%d"`
hour=`date --date="${hours_ago} hour ago" +"%H"`
echo `date` >>$flowload
for nas in nas1 nas2 nas3 nas4 nas5
do
case "$nas" in
nas1) nas_num=5;;
nas2) nas_num=6;;
nas3) nas_num=7;;
nas4) nas_num=8;;
nas5) nas_num=9;;
*) echo "unknown nas $nas"
exit 1;;
esac
if [ ! -d "$indir/$nas/$year-$month-$day" ]
then
echo "Data dir $indir/$nas/$year-$month-$day not found"
exit 1
fi
echo ==== $nas start >>$flowload
mkdir -p $outdir/source_$nas_num/$year/$month/$day
sleep 2
echo . $nas/$year-$month-$day >>$flowload
$convprog $outdir/source_$nas_num/$year/$month/$day/log_$hour $indir/$nas/$year-$month-$day/ft-v05.????-??-??.$hour* >>$flowload 2>&1
echo == add $nas $year-$month-$day-$hour >>$flowload
$load_prog isload $nas_num $year-$month-$day-$hour >>$flowload
echo ==== $nas stop >>$flowload
done
exit 0
--Blib 17:27, 9 мая 2008 (UTC)
