Dmitry Novikov 8 years ago
parent
commit
892f680989
  1. 4
      abonapp/templates/abonapp/editAbon.html
  2. 4
      abonapp/templates/abonapp/group_list.html
  3. 34
      abonapp/templates/abonapp/peoples.html
  4. 16
      accounts_app/templates/accounts/acc_list.html
  5. 13
      accounts_app/templates/accounts/login.html
  6. 4
      agent/commands/dhcp.py
  7. 20
      agent/mod_mikrotik.py
  8. 2
      clientsideapp/templates/clientsideapp/ext.html
  9. 2
      devapp/models.py
  10. 2
      devapp/templates/devapp/custom_dev_page/onu.html
  11. 44
      dhcp_lever.py
  12. 5
      msg_app/admin.py
  13. 2
      msg_app/locale/ru/LC_MESSAGES/django.po
  14. 9
      mydefs.py
  15. 69
      queue_mngr.py
  16. 2
      systemd_units/djing_telebot.service
  17. 2
      telebot.py
  18. 2
      templates/all_base.html
  19. 4
      templates/base.html

4
abonapp/templates/abonapp/editAbon.html

@ -4,7 +4,7 @@
{% block content %}
<div class="row">
<div class="col-sm-6">
<div class="col-sm-6 col-xs-8">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'Change subscriber' %}</h3>
@ -131,7 +131,7 @@
</div>
</div>
</div>
<div class="col-sm-6">
<div class="col-sm-6 col-xs-4">
{% if perms.abonapp.change_abon %}
<div class="panel panel-default">
<div class="panel-heading">

4
abonapp/templates/abonapp/group_list.html

@ -23,7 +23,7 @@
</a>
{% if order_by == 'title' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th width="100">
<th width="100" class="hidden-xs">
{% trans 'Number of subscribers' %}
</th>
<th width="100">#</th>
@ -34,7 +34,7 @@
<tr>
<td>{{ gr.pk }}</td>
<td><a href="{% url 'abonapp:people_list' gr.pk %}">{{ gr.title }}</a></td>
<td>{{ gr.usercount }}</td>
<td class="hidden-xs">{{ gr.usercount }}</td>
<td class="btn-group">
{% if perms.abonapp.delete_abongroup %}
{% if gr.usercount == 0 %}

34
abonapp/templates/abonapp/peoples.html

@ -14,52 +14,52 @@
<h3>{% trans 'The people in the selected group' %}</h3>
<div class="row">
<div class="col-lg-10">
<div class="col-lg-10 col-md-8">
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>#</th>
<th>
<th class="hidden-xs">#</th>
<th class="col-xs-1">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=username dir=dir|default:"down" %}">
{% trans 'Sub' %}
</a>
{% if order_by == 'username' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>{% trans 'Last traffic' %}</th>
<th>
<th class="hidden-xs">{% trans 'Last traffic' %}</th>
<th class="col-xs-1 hidden-md">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=ip_address dir=dir|default:"down" %}">
{% trans 'Ip address' %}
</a>
{% if order_by == 'ip_address' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>
<th class="col-xs-2">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=fio dir=dir|default:"down" %}">
{% trans 'fio' %}
</a>
{% if order_by == 'fio' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>
<th class="col-xs-2">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=street dir=dir|default:"down" %}">
{% trans 'Street' %}
</a>
{% if order_by == 'street' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th width="100">
<th class="col-xs-1">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=house dir=dir|default:"down" %}">
{% trans 'Apartment' %}
</a>
{% if order_by == 'house' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th width="150">{% trans 'Telephone' %}</th>
<th width="150">{% trans 'Service' %}</th>
<th width="50">
<th class="col-xs-2">{% trans 'Telephone' %}</th>
<th class="col-xs-2">{% trans 'Service' %}</th>
<th class="hidden-xs col-sm-1">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?{% url_replace request order_by=ballance dir=dir|default:"down" %}">
{% trans 'Ballance' %}
</a>
{% if order_by == 'ballance' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th width="10">#</th>
<th class="col-xs-1">#</th>
</tr>
</thead>
<tbody>
@ -70,7 +70,7 @@
{% else %}
<tr class="danger">
{% endif %}
<td>{% if human.stat_cache and human.stat_cache.is_online %}
<td class="hidden-xs">{% if human.stat_cache and human.stat_cache.is_online %}
<span class="glyphicon glyphicon-ok text-success"></span>
{% else %}
<span class="glyphicon glyphicon-remove-sign text-muted"></span>
@ -78,7 +78,7 @@
<td>
<a href="{% url 'abonapp:abon_home' human.group.pk human.pk %}">{{ human.username }}</a>
</td>
<td>
<td class="hidden-xs">
{% if human.stat_cache %}
{% if human.stat_cache.is_today %}
{{ human.stat_cache.last_time|date:"H:i" }}
@ -87,7 +87,7 @@
{% endif %}
{% endif %}
</td>
<td>{{ human.ip_address|default:_('Not assigned') }}</td>
<td class="hidden-md">{{ human.ip_address|default:_('Not assigned') }}</td>
<td>{{ human.fio }}</td>
<td>{{ human.street|default:_('Not assigned') }}</td>
<td>{{ human.house|default:'-' }}</td>
@ -102,7 +102,7 @@
{% else %}&mdash;&mdash;&mdash;
{% endif %}
</td>
<td>{{ human.ballance }}</td>
<td class="hidden-xs">{{ human.ballance }}</td>
<td>
{% if can_del_trf %}
<a href="{% url 'abonapp:del_abon' %}?id={{ human.pk }}" class="btn btn-danger btn-sm">
@ -140,7 +140,7 @@
</table>
</div>
</div>
<div class="col-lg-2 sidebar-offcanvas">
<div class="col-lg-2 col-md-4">
<div class="panel panel-default">
<div class="panel-heading">{% trans 'Streets' %}</div>
<div class="list-group">

16
accounts_app/templates/accounts/acc_list.html

@ -14,11 +14,11 @@
<thead>
<tr>
<th class="col-sm-1">Фото</th>
<th>Ник</th>
<th>ФИО (или ник если нет)</th>
<th class="col-sm-2">Телефон</th>
<th class="col-sm-2">Email</th>
<th width="150">&mdash;</th>
<th class="col-sm-2">Ник</th>
<th class="col-sm-4">ФИО (или ник если нет)</th>
<th class="col-sm-2 hidden-xs">Телефон</th>
<th class="col-sm-2 hidden-xs">Email</th>
<th class="col-sm-1 hidden-xs">&mdash;</th>
</tr>
</thead>
<tbody>
@ -30,11 +30,11 @@
</a></td>
<td><a href="{% url 'acc_app:other_profile' usr.id %}">{{ usr.username }}</a></td>
<td>{{ usr.get_full_name }}</td>
<td>{% if usr.telephone %}<a href="tel:{{ usr.telephone }}">{{ usr.telephone }}</a>{% else %}
<td class="hidden-xs">{% if usr.telephone %}<a href="tel:{{ usr.telephone }}">{{ usr.telephone }}</a>{% else %}
Нету{% endif %}</td>
<td>{% if usr.email %}<a href="mailto:{{ usr.email }}">{{ usr.email }}{% else %}
<td class="hidden-xs">{% if usr.email %}<a href="mailto:{{ usr.email }}">{{ usr.email }}{% else %}
Нету{% endif %}</a></td>
<td class="btn-group">
<td class="btn-group hidden-xs">
<a href="#" class="btn btn-sm btn-default disabled"
title="Дать задание">
<span class="glyphicon glyphicon-tasks"></span>

13
accounts_app/templates/accounts/login.html

@ -15,6 +15,10 @@
margin: 10% auto;
position: relative;
}
footer{
position: absolute;
bottom: 0;
}
</style>
</head>
<body>
@ -60,5 +64,14 @@
</div>
</div>
<footer class="footer">
<div class="container">
<p class="text-muted">
Напишите нам <i>is-ttk@ya.ru</i>.
</p>
</div>
</footer>
</div>
</body>
</html>

4
agent/commands/dhcp.py

@ -20,12 +20,12 @@ def dhcp_commit(client_ip, client_mac, switch_mac, switch_port):
print('D:', _('User settings is not dynamic'))
return
if not abon.is_access():
print('D:', _('User is not access to service'))
print('D:', 'User %s is not access to service' % abon.username)
return
abon.ip_address = client_ip
abon.is_dhcp = True
abon.save(update_fields=['ip_address'])
print('S:', _("Ip address:'%s' update for '%s' successfull, on port: %s") % (client_ip, abon.get_short_name(), port))
#print('S:', _("Ip address:'%s' update for '%s' successfull, on port: %s") % (client_ip, abon.get_short_name(), port))
except Abon.DoesNotExist:
print('N:', _("User with device '%s' does not exist") % dev)
except Device.DoesNotExist:

20
agent/mod_mikrotik.py

@ -4,7 +4,7 @@ import binascii
from abc import ABCMeta
from hashlib import md5
from .core import BaseTransmitter, NasFailedResult, NasNetworkError
from mydefs import ping
from mydefs import ping, singleton
from .structs import TariffStruct, AbonStruct, IpStruct
from . import settings as local_settings
from django.conf import settings
@ -17,14 +17,23 @@ LIST_USERS_ALLOWED = 'DjingUsersAllowed'
LIST_USERS_BLOCKED = 'DjingUsersBlocked'
@singleton
class ApiRos:
"Routeros api"
sk = None
is_login = False
def __init__(self, sk):
def __init__(self, ip, port):
if self.sk is None:
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.connect((ip, port or getattr(local_settings, 'NAS_PORT', 8728)))
self.sk = sk
self.currenttag = 0
def login(self, username, pwd):
if self.is_login:
return
chal = None
for repl, attrs in self.talk_iter(["/login"]):
chal = binascii.unhexlify(attrs['=ret'])
@ -34,6 +43,7 @@ class ApiRos:
md.update(chal)
for r in self.talk_iter(["/login", "=name=" + username,
"=response=00" + binascii.hexlify(md.digest()).decode('utf-8')]): pass
self.is_login = True
def talk_iter(self, words):
if self.writeSentence(words) == 0: return
@ -143,6 +153,7 @@ class ApiRos:
class TransmitterManager(BaseTransmitter, metaclass=ABCMeta):
def __init__(self, login=None, password=None, ip=None, port=None):
ip = ip or getattr(local_settings, 'NAS_IP')
if ip is None:
@ -150,10 +161,7 @@ class TransmitterManager(BaseTransmitter, metaclass=ABCMeta):
if not ping(ip):
raise NasNetworkError('NAS %s не пингуется' % ip)
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port or getattr(local_settings, 'NAS_PORT', 8728)))
self.s = s
self.ar = ApiRos(s)
self.ar = ApiRos(ip, port)
self.ar.login(login or getattr(local_settings, 'NAS_LOGIN'), password or getattr(local_settings, 'NAS_PASSW'))
except ConnectionRefusedError:
raise NasNetworkError('Подключение к %s отклонено (Connection Refused)' % ip)

2
clientsideapp/templates/clientsideapp/ext.html

@ -94,7 +94,7 @@
<div id="footer">
<div class="container">
<p class="text-muted">
Напишите разработчику <i>djing-developer@yandex.ru</i>.
Напишите разработчику <i>is-ttk@ya.ru</i>.
</p>
</div>
</div>

2
devapp/models.py

@ -109,6 +109,8 @@ def dev_post_save_signal(sender, instance, **kwargs):
code = 'uy'
elif grp == 79 or grp == 91:
code = 'zrk'
elif grp == 95:
code = 'yst'
newmac = str(instance.mac_addr)
call(["%s/devapp/onu_register.sh" % settings.BASE_DIR, newmac, code])

2
devapp/templates/devapp/custom_dev_page/onu.html

@ -16,7 +16,7 @@
<ul class="list-group">
<li class="list-group-item">{% trans 'Ip address' %}: {{ dev.ip_address }}</li>
<li class="list-group-item">{% trans 'Mac' %}: {{ dev.mac_addr }}</li>
<li class="list-group-item">{% trans 'Description' %} {{ dev.comment }}</li>
<li class="list-group-item">{% trans 'Description' %}: {{ dev.comment }}</li>
{% for da in dev_accs %}
<li class="list-group-item">{% trans 'Attached user' %}:
{% if da.group %}

44
dhcp_lever.py

@ -1,25 +1,53 @@
#!/usr/bin/env python3
import sys
from redis import Redis
from rq import Queue
import socket
def die(text):
print(text)
exit(1)
'''
obj = {
'client_ip': ip2int('127.0.0.1'),
'client_mac': 'aa:bb:cc:dd:ee:ff',
'switch_mac': 'aa:bb:cc:dd:ee:ff',
'switch_port': 3,
'cmd': 'commit'
}
'''
def send_to(data, addr='127.0.0.1', port=5436):
from pickle import dumps
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((addr, port))
data = dumps(data)
s.send(data)
except ConnectionRefusedError:
print('ERROR: connection refused')
if __name__ == "__main__":
argv = sys.argv
if len(argv) < 3:
die('Too few arguments, exiting...')
action = argv[1]
q = Queue(connection=Redis())
if action == 'commit':
if len(argv) < 6:
die('Too few arguments, exiting...')
q.enqueue('agent.commands.dhcp.dhcp_commit', argv[2], argv[3], argv[4], int(argv[5]))
elif action == 'expiry':
q.enqueue('agent.commands.dhcp.dhcp_expiry', argv[2])
elif action == 'release':
q.enqueue('agent.commands.dhcp.dhcp_release', argv[2])
dat = {
'client_ip': argv[2],
'client_mac': argv[3],
'switch_mac': argv[4],
'switch_port': int(argv[5]),
'cmd': 'commit'
}
send_to(dat)
elif action == 'expiry' or action == 'release':
dat = {
'client_ip': argv[2],
'cmd': action
}
send_to(dat)

5
msg_app/admin.py

@ -1,3 +1,6 @@
from django.contrib import admin
from . import models
admin.site.register(models.Message)
admin.site.register(models.Conversation)
# Register your models here.

2
msg_app/locale/ru/LC_MESSAGES/django.po

@ -146,7 +146,7 @@ msgstr "Создать беседу"
#: templates/msg_app/modal_new_conversation.html:19
msgid "for select multiple press ctrl and click on field"
msgstr "Для выбора нескольких ывриантов зажмите ctrl и кликните вариант"
msgstr "Для выбора нескольких вариантов зажмите ctrl и кликните нужный вариант"
#: templates/msg_app/modal_new_conversation.html:28
msgid "Add"

9
mydefs.py

@ -215,3 +215,12 @@ class MultipleException(Exception):
class LogicError(Exception):
pass
def singleton(class_):
instances = {}
def getinstance(*args, **kwargs):
if class_ not in instances:
instances[class_] = class_(*args, **kwargs)
return instances[class_]
return getinstance

69
queue_mngr.py

@ -1,30 +1,55 @@
#!/usr/bin/env python3
import os
import sys
from rq import Connection, Worker
from pickle import loads
from pid.decorator import pidfile
import socket
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
from agent import NasFailedResult, NasNetworkError
from django.core.exceptions import ValidationError
"""
Заустить этот скрипт как демон, он соединяет redis и django
"""
@pidfile()
def main():
'''
obj = {
'client_ip': ip2int('127.0.0.1'),
'client_mac': 'aa:bb:cc:dd:ee:ff',
'switch_mac': 'aa:bb:cc:dd:ee:ff',
'switch_port': 3,
'cmd': 'commit'
}
'''
def on_new_data(client_sock, ip):
from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release
data = client_sock.recv(16384)
data = loads(data)
action = data['cmd']
if action == 'commit':
dhcp_commit(
data['client_ip'], data['client_mac'],
data['switch_mac'], data['switch_port']
)
elif action == 'expiry':
dhcp_expiry(data['client_ip'])
elif action == 'release':
dhcp_release(data['client_ip'])
client_sock.close()
@pidfile(pidname='queue_mngr.py.pid', piddir='/run')
def serve(addr='127.0.0.1', port=5436):
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((addr, port))
s.listen(3)
print('ready')
while True:
conn, client_addr = s.accept()
on_new_data(conn, client_addr)
except ConnectionRefusedError:
print('ERROR: connection refused')
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup()
with Connection():
qs = sys.argv[1:] or ['default']
w = Worker(qs)
w.work()
except (NasNetworkError, NasFailedResult) as e:
print('NAS:', e)
except (ValidationError, ValueError) as e:
print('ERROR:', e)
if __name__ == "__main__":
main()
serve()

2
systemd_units/djing_telebot.service

@ -4,7 +4,7 @@ Description=Djing telegram bot
[Service]
Type=simple
ExecStart=/usr/bin/python3 ./telebot.py > /dev/null
PIDFile=/run/telebot.py.pid
PIDFile=/run/djing_telebot.pid
WorkingDirectory=/var/www/djing
TimeoutSec=9
Restart=always

2
telebot.py

@ -7,7 +7,7 @@ from telepot import DelegatorBot
from telepot.delegate import per_chat_id, create_open, pave_event_space
@pidfile()
@pidfile(pidname='djing_telebot.pid', piddir='/run')
def main():
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup()

2
templates/all_base.html

@ -31,7 +31,7 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{% url 'acc_app:other_profile' request.user.id %}">InternetService</a>
<a class="navbar-brand hidden-xs" href="{% url 'acc_app:other_profile' request.user.id %}">InternetService</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">

4
templates/base.html

@ -2,7 +2,7 @@
{% block base_content %}
<!-- Left menu -->
<div class="col-sm-2 sidebar sidebar-offcanvas" role="navigation">
<div class="col-sm-3 col-md-2 sidebar sidebar-offcanvas" role="navigation">
<div class="row profile_img">
<div class="col-sm-5">
@ -82,7 +82,7 @@
<!-- END Left menu -->
<!-- Main content -->
<div class="col-sm-10 col-sm-offset-2 main">
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<p class="pull-left visible-xs">
<button type="button" data-toggle="offcanvas"></button>
</p>

Loading…
Cancel
Save