Browse Source

make collect script

devel
Dmitry Novikov 7 years ago
parent
commit
e4c19c2ab3
  1. 19
      agent/netflow/netflow_collect.sh
  2. 69
      agent/netflow/netflow_handler.py
  3. 6
      agent/netflow/netflow_handler.sh
  4. 9
      agent/netflow/start_netflow.sh
  5. 17
      docs/netflow.md
  6. 5
      install/install_debian.sh

19
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 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 "\ 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 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']))"` ldb['PASSWORD'], ldb['HOST'], ldb['PORT']))"`
tmp_ipuser_file='/tmp/ipuser.txt'
if ! ping -c 1 ${mysql_host} &> /dev/null; then if ! ping -c 1 ${mysql_host} &> /dev/null; then
echo "Host ${mysql_host} is not accessible" echo "Host ${mysql_host} is not accessible"
fi fi
cd /var/www/djing
# Формируем список абонентов и их id # Формируем список абонентов и их 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} 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 do
echo "${uip}-${uid}" >> ${tmp_ipuser_file} echo "${uip}-${uid}" >> ${tmp_ipuser_file}
done done
@ -44,8 +44,7 @@ sleep 0.5
# Экспортируем всё в mysql # Экспортируем всё в mysql
export LD_LIBRARY_PATH=. 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 rm -f tmp_ipuser_file

69
agent/netflow/netflow_handler.py

@ -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)

6
agent/netflow/netflow_handler.sh

@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
if [-n "$1" ]; then
if [ -z "$1" ]; then
echo "missing filename" echo "missing filename"
exit exit
fi fi
@ -9,5 +9,5 @@ fname=$1
PATH=/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin PATH=/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
cd /tmp/djing_flow 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

9
agent/netflow/start_netflow.sh

@ -2,6 +2,13 @@
PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/bin 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 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}

17
docs/netflow.md

@ -1,13 +1,10 @@
### Сбор информации трафика по netflow ### Сбор информации трафика по netflow
Установим flow-tools
Fedora:
> dnf install -y flow-tools flow-tools-devel
Установите flow-tools, мы будем использовать его в качестве коллектора.
Затем надо собрать утилиту для преобразования flow в запрос для mysql. Затем надо собрать утилиту для преобразования flow в запрос для mysql.
Возьмём её из github:
Если не хотите собирать то есть собранный бинарь в папке */var/www/djing/agent/netflow/djing_flow.tar.gz*.
Распакуйте его или соберите из github:
``` ```
cd /var/www/djing/agent/netflow/ cd /var/www/djing/agent/netflow/
git clone https://github.com/nerosketch/djing_flow.git djing_flow_git 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). Инструкцию по использованию можно найти на странице [djing_flow](https://github.com/nerosketch/djing_flow).
Посмотреть пример работы можно с помощью файла дампа трафика flow-tools. Соберём такой дамп с помощью **flow-capture**. Посмотреть пример работы можно с помощью файла дампа трафика 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 на Запустится сбор трафика. Чтоб узнать больше почитайте инструкции по использованию flow-tools. Настройте netflow sensor на
ваш сервер. Для того чтоб сбросить дамп трафика на диск отправте сигнал **-HUP** процессу flow-capture. В */tmp/djing_flow* ваш сервер. Для того чтоб сбросить дамп трафика на диск отправте сигнал **-HUP** процессу flow-capture. В */tmp/djing_flow*
вы найдёте этот самый файл дампа трафика. И тут уже можно посмотреть как работает утилита **djing_flow**: вы найдёте этот самый файл дампа трафика. И тут уже можно посмотреть как работает утилита **djing_flow**:
> \$ ./djing_flow < /tmp/.tmp
> \$ ./djing_flow < /tmp/*.tmp
На выходе вы получите запрос для mysql. Можно перенаправить его по конвееру в mysql, рабочий пример
перенаправления этогй утилиты вы можете увидеть в файле
*agent/netflow/netflow_handler.sh*.
На выходе вы получите запрос для mysql. Можно перенаправить его по конвееру в mysql.

5
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 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 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 chown -R www-data:www-data /var/www/djing
# dirs # dirs

Loading…
Cancel
Save