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 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()

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):
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'))

Loading…
Cancel
Save