From e4c19c2ab31d98e39439e326eb6d81564ef883cf Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Mon, 15 Apr 2019 12:05:27 +0300 Subject: [PATCH] make collect script --- agent/netflow/netflow_collect.sh | 19 +++++---- agent/netflow/netflow_handler.py | 69 -------------------------------- agent/netflow/netflow_handler.sh | 6 +-- agent/netflow/start_netflow.sh | 9 ++++- docs/netflow.md | 17 +++----- install/install_debian.sh | 5 +++ 6 files changed, 31 insertions(+), 94 deletions(-) delete mode 100644 agent/netflow/netflow_handler.py diff --git a/agent/netflow/netflow_collect.sh b/agent/netflow/netflow_collect.sh index 7d43819..59519cc 100755 --- a/agent/netflow/netflow_collect.sh +++ b/agent/netflow/netflow_collect.sh @@ -1,7 +1,11 @@ -#!/usr/bin/env bash +#!/bin/bash PATH=/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin +DIRECTORY=`dirname $(readlink -e "$0")` +tmp_ipuser_file='/tmp/ipuser.txt' + +cd "$DIRECTORY" read -r mysql_database mysql_user mysql_passw mysql_host mysql_port <<< `python3 -c "\ from importlib.util import spec_from_file_location, module_from_spec @@ -14,21 +18,17 @@ print('%s %s %s %s %d' % (ldb['NAME'], ldb['USER'], ldb['PASSWORD'], ldb['HOST'], ldb['PORT']))"` -tmp_ipuser_file='/tmp/ipuser.txt' - if ! ping -c 1 ${mysql_host} &> /dev/null; then echo "Host ${mysql_host} is not accessible" fi -cd /var/www/djing - # Формируем список абонентов и их id -sql="SELECT INET_ATON(ip_address) as uip, baseaccount_ptr_id FROM abonent WHERE INET_ATON(ip_address) != 'NULL';" +sql='SELECT INET_ATON(ip_address) as uip, baseaccount_ptr_id FROM abonent WHERE INET_ATON(ip_address) != "NULL";' -count=`mysql -u${mysql_user} -h ${mysql_host} -p --password=${mysql_passw} -P ${mysql_port} -NBe "select COUNT(*) from abonent WHERE INET_ATON(ip_address) != 'NULL';"` +count=`mysql -u${mysql_user} -h ${mysql_host} -p --password=${mysql_passw} -D ${mysql_database} -P ${mysql_port} -NBe "select COUNT(*) from abonent WHERE INET_ATON(ip_address) != 'NULL';"` echo "count: $count" > ${tmp_ipuser_file} -mysql -u${mysql_user} -h ${mysql_host} -p --password=${mysql_passw} -P ${mysql_port} -D ${mysql_database} -NBe ${sql} | while read -r uip uid; +mysql -u ${mysql_user} -h ${mysql_host} -p --password=${mysql_passw} -P ${mysql_port} -D ${mysql_database} -NBe "${sql}" | while read -r uip uid; do echo "${uip}-${uid}" >> ${tmp_ipuser_file} done @@ -44,8 +44,7 @@ sleep 0.5 # Экспортируем всё в mysql export LD_LIBRARY_PATH=. -./djing_flow ${tmp_ipuser_file} < flow-cat /tmp/djing_flow/dump/*.dmp | \ -mysql -u${mysql_user} -h ${mysql_host} -p ${mysql_database} -P ${mysql_port}--password=${mysql_passw} +flow-cat /tmp/djing_flow/dump/*.dmp | ./djing_flow ${tmp_ipuser_file}| mysql -u ${mysql_user} -h ${mysql_host} -p -D ${mysql_database} -P ${mysql_port} --password=${mysql_passw} rm -f tmp_ipuser_file diff --git a/agent/netflow/netflow_handler.py b/agent/netflow/netflow_handler.py deleted file mode 100644 index 0f60b70..0000000 --- a/agent/netflow/netflow_handler.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python3 -import MySQLdb -import sys -import os -from importlib import import_module - - -USING_DB = 'default' - - -if __name__ == '__main__': - if len(sys.argv) < 2: - print("File name of netflow required") - exit(1) - - FNAME = sys.argv[1] - - cur_dir = os.path.dirname(os.path.abspath(__file__)) - tmp_dir = '/tmp/djing_flow' - tmp_ipuser_file = '/tmp/ipuser.txt' - tmp_dump_file = '%s/djing_flow_dump.tmp' % tmp_dir - - os.chdir(cur_dir) - if not os.path.isdir(tmp_dir): - os.mkdir(tmp_dir) - os.rename('/tmp/djing_flow/%s' % FNAME, tmp_dump_file) - - sys.path.append('../../') - local_settings = import_module('djing.local_settings') - usedb = local_settings.DATABASES.get(USING_DB) - - db = MySQLdb.connect( - host=usedb['HOST'], - user=usedb['USER'], - passwd=usedb['PASSWORD'], - db=usedb['NAME'], - charset='utf8' - ) - cursor = db.cursor() - - sql = ( - "SELECT INET_ATON(ip_address) as uip, baseaccount_ptr_id FROM abonent " - "WHERE INET_ATON(ip_address) != 'NULL';" - ) - ln = cursor.execute(sql) - with open(tmp_ipuser_file, 'w') as f: - f.write("count: %d\n" % ln) - while True: - row = cursor.fetchone() - if row is None: - break - f.write("%d-%d\n" % row) - db.close() - - os.system( - '/bin/bash -c "export LD_LIBRARY_PATH=. && ' - '%(CUR_DIR)s/djing_flow %(TMP_IPUSER_FILE)s < %(TMP_DUMP)s | ' - '/usr/bin/mysql -u%(DB_USER)s -h %(HOST)s -p %(DB_NAME)s --password=%(DB_PASSW)s"' % { - 'CUR_DIR': cur_dir, - 'TMP_IPUSER_FILE': tmp_ipuser_file, - 'TMP_DUMP': tmp_dump_file, - 'DB_USER': usedb['USER'], - 'HOST': usedb['HOST'], - 'DB_NAME': usedb['NAME'], - 'DB_PASSW': usedb['PASSWORD'] - }) - - os.remove(tmp_dump_file) - os.remove(tmp_ipuser_file) diff --git a/agent/netflow/netflow_handler.sh b/agent/netflow/netflow_handler.sh index e7e4b03..2d85c05 100755 --- a/agent/netflow/netflow_handler.sh +++ b/agent/netflow/netflow_handler.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -if [-n "$1" ]; then +if [ -z "$1" ]; then echo "missing filename" exit fi @@ -9,5 +9,5 @@ fname=$1 PATH=/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin cd /tmp/djing_flow -mkdir -p /tmp/djing_flow/dump -mv ${fname} /tmp/djing_flow/dump/${fname}.dmp +mkdir -p dump +mv ${fname} dump/${fname}.dmp diff --git a/agent/netflow/start_netflow.sh b/agent/netflow/start_netflow.sh index a298f8e..8d0f9d4 100755 --- a/agent/netflow/start_netflow.sh +++ b/agent/netflow/start_netflow.sh @@ -2,6 +2,13 @@ PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/bin +if ! [ -n "$1" ]; then + echo 'Missing port parameter' + exit +fi + +port=$1 + mkdir -p /tmp/djing_flow -flow-capture -R /var/www/djing/agent/netflow/netflow_handler.py -p /run/flow.pid -w /tmp/djing_flow -n1 -N0 0/0/6343 +flow-capture -R /home/ns/Projects/djing/agent/netflow/netflow_handler.sh -p /run/flow.pid -w /tmp/djing_flow -n1 -N0 0/0/${port} diff --git a/docs/netflow.md b/docs/netflow.md index 4b6a113..b21b8e0 100644 --- a/docs/netflow.md +++ b/docs/netflow.md @@ -1,13 +1,10 @@ ### Сбор информации трафика по netflow -Установим flow-tools - -Fedora: - -> dnf install -y flow-tools flow-tools-devel +Установите flow-tools, мы будем использовать его в качестве коллектора. Затем надо собрать утилиту для преобразования flow в запрос для mysql. -Возьмём её из github: +Если не хотите собирать то есть собранный бинарь в папке */var/www/djing/agent/netflow/djing_flow.tar.gz*. +Распакуйте его или соберите из github: ``` cd /var/www/djing/agent/netflow/ git clone https://github.com/nerosketch/djing_flow.git djing_flow_git @@ -20,13 +17,11 @@ rm -rf djing_flow_git Инструкцию по использованию можно найти на странице [djing_flow](https://github.com/nerosketch/djing_flow). Посмотреть пример работы можно с помощью файла дампа трафика flow-tools. Соберём такой дамп с помощью **flow-capture**. -> \# flow-capture -p /run/flow.pid -w /tmp/djing_flow -n1 -N0 0/0/6343 +> \# flow-capture -p /run/flow.pid -w /tmp/djing_flow -n1 -N0 0/0/1234 Запустится сбор трафика. Чтоб узнать больше почитайте инструкции по использованию flow-tools. Настройте netflow sensor на ваш сервер. Для того чтоб сбросить дамп трафика на диск отправте сигнал **-HUP** процессу flow-capture. В */tmp/djing_flow* вы найдёте этот самый файл дампа трафика. И тут уже можно посмотреть как работает утилита **djing_flow**: -> \$ ./djing_flow < /tmp/.tmp +> \$ ./djing_flow < /tmp/*.tmp -На выходе вы получите запрос для mysql. Можно перенаправить его по конвееру в mysql, рабочий пример -перенаправления этогй утилиты вы можете увидеть в файле -*agent/netflow/netflow_handler.sh*. +На выходе вы получите запрос для mysql. Можно перенаправить его по конвееру в mysql. diff --git a/install/install_debian.sh b/install/install_debian.sh index c65804c..a4fbe3d 100644 --- a/install/install_debian.sh +++ b/install/install_debian.sh @@ -41,6 +41,11 @@ ln -s /etc/uwsgi/apps-available/djing.ini /etc/uwsgi/apps-enabled/djing.ini cp install/nginx_server.conf /etc/nginx/sites-available/djing.conf ln -s /etc/nginx/sites-available/djing.conf /etc/nginx/sites-enabled/djing.conf +# Extract executable for netflow dumping +cd agent/netflow +tar -xvzf djing_flow.tar.gz +cd ../../ + chown -R www-data:www-data /var/www/djing # dirs