Browse Source

fix onu save to isc dhcp server config

devel
bashmak 8 years ago
parent
commit
6c7e76fdb1
  1. 26
      devapp/models.py
  2. 14
      devapp/onu_register.py
  3. 55
      devapp/onu_register.sh
  4. 2
      devapp/views.py

26
devapp/models.py

@ -1,8 +1,5 @@
import os
from typing import Optional, AnyStr from typing import Optional, AnyStr
from subprocess import run
from django.db import models from django.db import models
from django.conf import settings
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from jsonfield import JSONField from jsonfield import JSONField
@ -66,12 +63,6 @@ class Device(models.Model):
verbose_name_plural = _('Devices') verbose_name_plural = _('Devices')
ordering = ('id',) ordering = ('id',)
def get_abons(self):
pass
def get_status(self):
return self.status
def get_manager_klass(self): def get_manager_klass(self):
klasses = next(kl for kl in self.DEVICE_TYPES if kl[0] == self.devtype) klasses = next(kl for kl in self.DEVICE_TYPES if kl[0] == self.devtype)
if klasses: if klasses:
@ -95,20 +86,9 @@ class Device(models.Model):
def __str__(self): def __str__(self):
return "%s: (%s) %s %s" % (self.comment, self.get_devtype_display(), self.ip_address or '', self.mac_addr or '') return "%s: (%s) %s %s" % (self.comment, self.get_devtype_display(), self.ip_address or '', self.mac_addr or '')
def update_dhcp(self, remove=False):
# FIXME: Remove static list of registrable device types
if self.devtype not in ('On', 'Dl', 'Zo'):
return
if self.group is None:
raise DeviceDBException(_('Device does not have a group, please fix that'))
code = self.group.code
newmac = str(self.mac_addr)
filepath = os.path.join(settings.BASE_DIR, 'devapp', 'onu_register.sh')
if remove:
param = 'del'
else:
param = 'update'
run((filepath, param, newmac, code))
def update_dhcp(self):
from .onu_register import onu_register
onu_register(self.objects.exclude(group=None).iterator())
def generate_config_template(self) -> Optional[AnyStr]: def generate_config_template(self) -> Optional[AnyStr]:
mng = self.get_manager_object() mng = self.get_manager_object()

14
devapp/onu_register.py

@ -0,0 +1,14 @@
#!/usr/bin/env python3
from typing import Iterable
from subprocess import run
def onu_register(devices: Iterable):
with open('/etc/dhcp/macs.conf', 'w') as f:
for dev in devices:
if dev.has_attachable_to_subscriber():
f.write('subclass "%(code)s" "%(mac)s";\n' % {
'code': dev.group.code,
'mac': dev.mac_addr
})
run(('/usr/bin/sudo', 'systemctl', 'restart', 'isc-dhcp-server.service'))

55
devapp/onu_register.sh

@ -1,55 +0,0 @@
#!/bin/bash
# Action
ACT=$1
if [[ ${ACT} == '' ]]; then
echo 'Need the action type parameter'
exit
fi
# old mac address
if [[ $2 =~ ^([0-9A-Fa-f]{1,2}[:-]){5}([0-9A-Fa-f]{1,2})$ ]]; then
MAC=$2
else
echo "Bad mac $MAC addr"
exit
fi
# part code
if [[ $3 =~ ^[a-zA-Z]+$ ]]; then
PART_CODE=$3
else
echo 'code must contains only letters'
exit
fi
DHCP_MACS='/etc/dhcp/macs.conf'
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin
# if just remove device
if [[ ${ACT} == 'del' ]]; then
sed -i "/${MAC}/d" ${DHCP_MACS}
exit
fi
# If exist mac with code
if grep "^subclass\ \"${PART_CODE}\" \"${MAC}\";$" "${DHCP_MACS}" > /dev/null; then
# mac is already exists, quit
exit
else
# If mac existing in another group
if grep "${MAC}" ${DHCP_MACS} > /dev/null; then
# remove it
sed -i "/${MAC}/d" ${DHCP_MACS}
fi
# add new mac
echo "subclass \"${PART_CODE}\" \"${MAC}\";" >> ${DHCP_MACS}
sudo systemctl restart isc-dhcp-server.service
fi

2
devapp/views.py

@ -76,7 +76,7 @@ class DeviceDeleteView(DeleteView):
def delete(self, request, *args, **kwargs): def delete(self, request, *args, **kwargs):
res = super().delete(request, *args, **kwargs) res = super().delete(request, *args, **kwargs)
try: try:
self.object.update_dhcp(remove=True)
self.object.update_dhcp()
except DeviceDBException as e: except DeviceDBException as e:
messages.error(request, e) messages.error(request, e)
messages.success(request, _('Device successfully deleted')) messages.success(request, _('Device successfully deleted'))

Loading…
Cancel
Save