diff --git a/devapp/models.py b/devapp/models.py index 945edd2..3737835 100644 --- a/devapp/models.py +++ b/devapp/models.py @@ -1,3 +1,4 @@ +import os from django.db import models from djing.fields import MACAddressField from .base_intr import DevBase @@ -81,45 +82,19 @@ 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): + def update_dhcp(self, remove=False): if self.devtype not in ('On', 'Dl'): return - # raise ProgrammingError('переделать это безобразие') - # FIXME: переделать это безобразие - grp = self.group.id - code = '' - if grp == 87: - code = 'chk' - elif grp == 85: - code = 'drf' - elif grp == 86: - code = 'eme' - elif grp == 84: - code = 'kunc' - elif grp == 47: - code = 'mtr' - elif grp == 60: - code = 'nvg' - elif grp == 65: - code = 'ohot' - elif grp == 89: - code = 'psh' - elif grp == 92: - code = 'str' - elif grp == 80 or grp == 94: - code = 'uy' - elif grp == 79 or grp == 91: - code = 'zrk' - elif grp == 95: - code = 'yst' - elif grp == 96: - code = 'lzk' - elif grp == 51: - code = 'sad' - elif grp == 46: - code = 'zhem' + 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) - run(["%s/devapp/onu_register.sh" % settings.BASE_DIR, newmac, code]) + filepath = os.path.join(settings.BASE_DIR, 'devapp', 'onu_register.sh') + if remove: + param = 'del' + else: + param = 'update' + run([filepath, param, newmac, code]) class Port(models.Model): @@ -128,11 +103,11 @@ class Port(models.Model): descr = models.CharField(_('Description'), max_length=60, null=True, blank=True) def __str__(self): - return "%d: %s" % (int(self.num), self.descr) + return "%d: %s" % (self.num, self.descr) class Meta: db_table = 'dev_port' - unique_together = (('device', 'num')) + unique_together = (('device', 'num'),) permissions = ( ('can_toggle_ports', _('Can toggle ports')), ) diff --git a/devapp/onu_register.sh b/devapp/onu_register.sh index fb64e5a..f112247 100755 --- a/devapp/onu_register.sh +++ b/devapp/onu_register.sh @@ -1,9 +1,16 @@ #!/bin/bash +# Action +ACT=$1 +if [[ ${ACT} == '' ]]; then + echo 'Need the action type parameter' + exit +fi + # old mac address -if [[ $1 =~ ^([0-9A-Fa-f]{1,2}[:-]){5}([0-9A-Fa-f]{1,2})$ ]]; then - MAC=$1 +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 @@ -11,24 +18,38 @@ fi # part code -if [[ $2 =~ ^[a-zA-Z]+$ ]]; then - PART_CODE=$2 +if [[ $3 =~ ^[a-zA-Z]+$ ]]; then + PART_CODE=$3 else echo 'code must contains only letters' exit fi -DHCP_PATH='/etc/dhcp/macs' +DHCP_MACS='./macs.conf' PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin -if grep "${MAC}" "${DHCP_PATH}/${PART_CODE}.conf" > /dev/null; then - # mac is already exists +# 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_PATH}/${PART_CODE}.conf" + 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 cdb5085..b2f85f4 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -74,6 +74,7 @@ def devdel(request, device_id): try: dev = Device.objects.get(pk=device_id) back_url = resolve_url('devapp:devs', group_id=dev.group.pk if dev.group else 0) + dev.update_dhcp(remove=True) dev.delete() return res_success(request, back_url) except Device.DoesNotExist: diff --git a/group_app/forms.py b/group_app/forms.py index ecd3512..4bdce2e 100644 --- a/group_app/forms.py +++ b/group_app/forms.py @@ -5,4 +5,4 @@ from . import models class GroupForm(forms.ModelForm): class Meta: model = models.Group - fields = ['title'] + fields = '__all__' diff --git a/group_app/locale/ru/LC_MESSAGES/django.po b/group_app/locale/ru/LC_MESSAGES/django.po index 25251e4..4e5baf8 100644 --- a/group_app/locale/ru/LC_MESSAGES/django.po +++ b/group_app/locale/ru/LC_MESSAGES/django.po @@ -73,3 +73,6 @@ msgstr "Исправьте ошибки формы" #: group_app/views.py:47 msgid "New group are created" msgstr "Новая группа успешно создана" + +msgid "Tech code" +msgstr "Технический код" diff --git a/group_app/migrations/0002_group_code.py b/group_app/migrations/0002_group_code.py new file mode 100644 index 0000000..ee96af7 --- /dev/null +++ b/group_app/migrations/0002_group_code.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-04-26 15:43 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('group_app', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='group', + name='code', + field=models.CharField(blank=True, max_length=12, verbose_name='Tech code'), + ), + ] diff --git a/group_app/models.py b/group_app/models.py index 0d92b18..f6cedbb 100644 --- a/group_app/models.py +++ b/group_app/models.py @@ -5,6 +5,7 @@ from django.db import models class Group(models.Model): title = models.CharField(_('Title'), max_length=127, unique=True) + code = models.CharField(_('Tech code'), blank=True, max_length=12) def get_absolute_url(self): url = resolve_url('group_app:edit', self.pk) diff --git a/group_app/templates/group_app/group_list.html b/group_app/templates/group_app/group_list.html index 1843888..99e3ae3 100644 --- a/group_app/templates/group_app/group_list.html +++ b/group_app/templates/group_app/group_list.html @@ -29,8 +29,12 @@ {% for gr in groups %} {{ gr.pk }} - {{ gr.title }} - + + + {{ gr.title }} + + +