From 6c7e76fdb10237e4b514d2fa2aab8c680034b8a8 Mon Sep 17 00:00:00 2001 From: bashmak Date: Thu, 5 Jul 2018 19:41:22 +0300 Subject: [PATCH] fix onu save to isc dhcp server config --- devapp/models.py | 26 +++----------------- devapp/onu_register.py | 14 +++++++++++ devapp/onu_register.sh | 55 ------------------------------------------ devapp/views.py | 2 +- 4 files changed, 18 insertions(+), 79 deletions(-) create mode 100644 devapp/onu_register.py delete mode 100755 devapp/onu_register.sh diff --git a/devapp/models.py b/devapp/models.py index 5f2dedd..210047d 100644 --- a/devapp/models.py +++ b/devapp/models.py @@ -1,8 +1,5 @@ -import os from typing import Optional, AnyStr -from subprocess import run from django.db import models -from django.conf import settings from django.utils.translation import gettext_lazy as _ from jsonfield import JSONField @@ -66,12 +63,6 @@ class Device(models.Model): verbose_name_plural = _('Devices') ordering = ('id',) - def get_abons(self): - pass - - def get_status(self): - return self.status - def get_manager_klass(self): klasses = next(kl for kl in self.DEVICE_TYPES if kl[0] == self.devtype) if klasses: @@ -95,20 +86,9 @@ class Device(models.Model): def __str__(self): 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]: mng = self.get_manager_object() diff --git a/devapp/onu_register.py b/devapp/onu_register.py new file mode 100644 index 0000000..0ab6ec6 --- /dev/null +++ b/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')) diff --git a/devapp/onu_register.sh b/devapp/onu_register.sh deleted file mode 100755 index 485a43f..0000000 --- a/devapp/onu_register.sh +++ /dev/null @@ -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 diff --git a/devapp/views.py b/devapp/views.py index 46e5a1d..985fcac 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -76,7 +76,7 @@ class DeviceDeleteView(DeleteView): def delete(self, request, *args, **kwargs): res = super().delete(request, *args, **kwargs) try: - self.object.update_dhcp(remove=True) + self.object.update_dhcp() except DeviceDBException as e: messages.error(request, e) messages.success(request, _('Device successfully deleted'))