38 changed files with 418 additions and 176 deletions
-
5README.md
-
3abonapp/locale/ru/LC_MESSAGES/django.po
-
8abonapp/templates/abonapp/buy_tariff.html
-
3abonapp/templates/abonapp/editAbon.html
-
4abonapp/templates/abonapp/group_list.html
-
184abonapp/tests.py
-
2abonapp/urls.py
-
52abonapp/views.py
-
2accounts_app/models.py
-
4agent/core.py
-
68agent/mod_mikrotik.py
-
8agent/structs.py
-
16agent/utils.py
-
19chatbot/email_bot.py
-
5chatbot/send_func.py
-
9devapp/dev_types.py
-
13devapp/views.py
-
2dhcp_lever.py
-
12djing/fields.py
-
23djing/lib/tln/tln.py
-
7djing/local_settings.py.template
-
14djing/settings.py
-
2docs/dev.md
-
28docs/dhcp.md
-
20docs/extra_func.md
-
5docs/install.md
-
2docs/map.md
-
3docs/netflow.md
-
14docs/user_page.md
-
6docs/views.md
-
1group_app/views.py
-
2msg_app/models.py
-
6periodic.py
-
14tariff_app/custom_tariffs.py
-
3tariff_app/locale/ru/LC_MESSAGES/django.po
-
4tariff_app/views.py
-
2taskapp/handle.py
-
19taskapp/models.py
@ -1,16 +0,0 @@ |
|||||
import socket |
|
||||
import struct |
|
||||
|
|
||||
|
|
||||
def ip2int(addr): |
|
||||
try: |
|
||||
return struct.unpack("!I", socket.inet_aton(addr))[0] |
|
||||
except: |
|
||||
return 0 |
|
||||
|
|
||||
|
|
||||
def int2ip(addr): |
|
||||
try: |
|
||||
return socket.inet_ntoa(struct.pack("!I", addr)) |
|
||||
except: |
|
||||
return '' |
|
||||
@ -0,0 +1,19 @@ |
|||||
|
from smtplib import SMTPException |
||||
|
from django.core.mail import send_mail |
||||
|
from django.conf import settings |
||||
|
|
||||
|
from chatbot.models import ChatException, MessageQueue |
||||
|
|
||||
|
|
||||
|
def send_notify(msg_text, account, tag='none'): |
||||
|
try: |
||||
|
MessageQueue.objects.push(msg=msg_text, user=account, tag=tag) |
||||
|
target_email = account.email |
||||
|
send_mail( |
||||
|
subject=getattr(settings, 'COMPANY_NAME', 'Djing notify'), |
||||
|
message=msg_text, |
||||
|
from_email=getattr(settings, 'DEFAULT_FROM_EMAIL'), |
||||
|
recipient_list=(target_email,) |
||||
|
) |
||||
|
except SMTPException as e: |
||||
|
raise ChatException('SMTPException: %s' % e) |
||||
@ -0,0 +1,5 @@ |
|||||
|
# send via email |
||||
|
from .email_bot import send_notify |
||||
|
|
||||
|
# for Telegram |
||||
|
# from chatbot.telebot import send_notify |
||||
@ -0,0 +1,28 @@ |
|||||
|
## ISC-DHCP Сервер, взаимодействие с биллингом. |
||||
|
Вобщих чертах взаимодействие происходит с помощью скрипта **dhcp_lever.py** |
||||
|
в корне проекта. Запущенный DHCP сервер, при возникновении событий запускает |
||||
|
этот сценарий , а тот говорит биллингу подробнее что произошло. |
||||
|
|
||||
|
При событии *expiry* или *release* биллингу нужно освободить ip, а при *commit* |
||||
|
нужно назначить динамическую аренду ip для учётной записи абонента в биллинге. |
||||
|
|
||||
|
Сам скрипт не выполняет все эти действия, он просто отправляет полученные от dhcp |
||||
|
сервера параметры на url адрес для обработки dhcp. View распологается в **abonapp.views.DhcpLever**. |
||||
|
|
||||
|
### Выделение аренды ip |
||||
|
Как происходит выделение аренды ip, от события в dhcp сервере и до появления интернета у |
||||
|
абонента. |
||||
|
|
||||
|
Когда в dhcp сервере происходит событие *commit* то из **abonapp.views.DhcpLever** вызывается |
||||
|
функция **agent.commands.dhcp.dhcp_commit**, с помощью DHCP OPTION.82 получаем mac адрес управляемого |
||||
|
свича и порт через который пришёл запрос. Каждое такое устройство должно быть зарегистрировано в биллинге. |
||||
|
Далее ищем в базе абонента, или абонентов к которому привязано устройство с переданным mac адресом. |
||||
|
Проверяем может-ли данный тип устройства содержать несколько подключённых абонентов(напрмер PON ONU, в основном, |
||||
|
содержит одного абонента). Проверка происходит по свойству **is_use_device_port** из менеджера устройства, |
||||
|
которое открыто для кастомизации, подробнее в [Менеджер устройства](./docs/dev.md). |
||||
|
А далее, если может быть несколько абонентов, то фильтруем вывод ещё по порту свича. |
||||
|
Получется что на управляемом свиче мы авторизуем абонентов при помощи dhcp option.82 по маку свича и порту абонента. |
||||
|
Если наше устройство PON ONU(ONT) то авторизуем только по mac адресу оптического юнита(onu). |
||||
|
|
||||
|
После добавления абоненту аренды динамического ip, он(абонент) синхронизуется с nas сервером и открывается доступ |
||||
|
к интернету в соответствии с тарифом абонента. |
||||
@ -0,0 +1,20 @@ |
|||||
|
## Дополнительный фунционал |
||||
|
В процессе реализации проекта понадобился функционал, который отсутствует в базовой поставке **Django**. |
||||
|
Его совсем не много, но без внимания оставить нельзя. |
||||
|
|
||||
|
Все вспомогательные модули можно найти в пакете **djing.lib**. |
||||
|
### tln |
||||
|
Это модуль работы по *telnet* |
||||
|
|
||||
|
### messaging |
||||
|
Этот модуль помогает работать с форматами СМС сообщений. |
||||
|
|
||||
|
|
||||
|
### init |
||||
|
Содержит всякие мелкие примочки, код прост и с комментариями, зайдите посмотрите. |
||||
|
|
||||
|
## auth_decorators |
||||
|
Бэкенд авторизации |
||||
|
|
||||
|
## decorators |
||||
|
Дополнительные декораторы. |
||||
@ -0,0 +1,14 @@ |
|||||
|
## Особенности страницы абонента. |
||||
|
Находится она в разделе **Абоненты** внутри группы. На этой странице вы увидите несколько логических блоков, |
||||
|
из которых самые важные, пожалуй, 2. Первый это **Изменение абонента** а второй **Выберите устройство**. |
||||
|
На первом блоке можно редактировать базовую информацию абонента. Если снять галку *Активен* то абонент перестанет |
||||
|
получать услуги даже при подключённой услуге. |
||||
|
|
||||
|
Блок с устройством содержит то самое устройство, к которому подключён абонент. Если это устройство не будет назначено |
||||
|
то биллинг не сможет авторизовать абонента по dhcp option.82. Галочка **Динамические настройки по dhcp** означает что |
||||
|
учётная запись абонента сможет получать динамический ip. Это означает что если галка не будет выставлена, то сколько бы |
||||
|
запросов не приходило с этого устройства абонент не изменить свой ip, это полезно когда абонент работает со статическим |
||||
|
ip. |
||||
|
|
||||
|
Вверху есть вкладки. с соответствующим названию функционалом. Например на вкладке **Тарифы** вы можете назначить |
||||
|
абоненту услугу или добавить периодический платёж, который абонент увидит в своём личном кабинете. |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue