diff --git a/agent/netflow/netflow_collect.sh b/agent/netflow/netflow_collect.sh new file mode 100755 index 0000000..7d43819 --- /dev/null +++ b/agent/netflow/netflow_collect.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +PATH=/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin + + +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 +spec = spec_from_file_location('local_settings', '../../djing/local_settings.py') +ls = module_from_spec(spec) +spec.loader.exec_module(ls) +db = ls.DATABASES +ldb = db.get('default') +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';" + +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';"` +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; +do + echo "${uip}-${uid}" >> ${tmp_ipuser_file} +done + + +# Сигналим коллекторам чтоб они сбросили дамп в папку /tmp/djing_flow/dump +for fl in /run/flow.pid.*; do + kill -HUP `cat ${fl}` +done +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} + + +rm -f tmp_ipuser_file +rm -f /tmp/djing_flow/dump/*.dmp diff --git a/agent/netflow/netflow_handler.sh b/agent/netflow/netflow_handler.sh new file mode 100755 index 0000000..e7e4b03 --- /dev/null +++ b/agent/netflow/netflow_handler.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +if [-n "$1" ]; then + echo "missing filename" + exit +fi + +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 diff --git a/agent/netflow/start_netflow.sh b/agent/netflow/start_netflow.sh old mode 100644 new mode 100755 diff --git a/docs/netflow.md b/docs/netflow.md index df3d33b..4b6a113 100644 --- a/docs/netflow.md +++ b/docs/netflow.md @@ -25,7 +25,7 @@ rm -rf djing_flow_git Запустится сбор трафика. Чтоб узнать больше почитайте инструкции по использованию flow-tools. Настройте netflow sensor на ваш сервер. Для того чтоб сбросить дамп трафика на диск отправте сигнал **-HUP** процессу flow-capture. В */tmp/djing_flow* вы найдёте этот самый файл дампа трафика. И тут уже можно посмотреть как работает утилита **djing_flow**: -> \$ ./djing_flow < /tmp/djing_flow_dump.tmp +> \$ ./djing_flow < /tmp/.tmp На выходе вы получите запрос для mysql. Можно перенаправить его по конвееру в mysql, рабочий пример перенаправления этогй утилиты вы можете увидеть в файле diff --git a/install/install_debian.sh b/install/install_debian.sh index b7e6450..c65804c 100644 --- a/install/install_debian.sh +++ b/install/install_debian.sh @@ -49,6 +49,7 @@ find . -type d \( -path ./venv -o -path ./src -o -path ./.git \) -prune -o -type find . -type d \( -path ./venv -o -path ./src -o -path ./.git \) -prune -o -type f -exec chmod 640 {} \; # exec scripts chmod 750 dhcp_lever.py manage.py periodic.py devapp/expect_scripts/dlink_DGS1100_reboot.exp agent/netflow/netflow_handler.py +chmod 750 agent/netflow/netflow_handler_slave.sh chmod 400 djing/settings.py rm /etc/nginx/sites-enabled/default diff --git a/systemd_units/djing_rotate.service b/systemd_units/djing_rotate.service index f783804..e0858d2 100644 --- a/systemd_units/djing_rotate.service +++ b/systemd_units/djing_rotate.service @@ -4,7 +4,7 @@ Description=A job for rotate djing netflow data [Service] Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/bin" Type=oneshot -ExecStart=/bin/bash -c "kill -HUP `/bin/cat /run/flow.pid.6343`" +ExecStart=/var/www/djing/agent/netflow/netflow_handler.sh User=root Group=root diff --git a/traf_stat/models.py b/traf_stat/models.py index 00b6d42..b1f59a8 100644 --- a/traf_stat/models.py +++ b/traf_stat/models.py @@ -103,13 +103,13 @@ class StatElem(models.Model): abstract = True -def getModel(want_date=now()): - class DynamicStatElem(StatElem): - class Meta: - db_table = 'flowstat_%s' % want_date.strftime("%d%m%Y") - abstract = False - - return DynamicStatElem +def getModel(want_date=None): + if want_date is None: + want_date = now() + se = StatElem + se.Meta.db_table = 'flowstat_%s' % want_date.strftime("%d%m%Y") + se.Meta.abstract = False + return se class StatCache(models.Model):