From 8c5a0de5b8cbf5f38d97c193a5f348182cad92e7 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Wed, 27 Mar 2019 14:28:54 +0300 Subject: [PATCH] make reboot button for dlink --- devapp/base_intr.py | 9 ++++++-- devapp/dev_types.py | 18 ++++++---------- devapp/locale/ru/LC_MESSAGES/django.po | 11 +++++++++- devapp/views.py | 29 +++++++++++++++++--------- djing/lib/__init__.py | 2 +- 5 files changed, 43 insertions(+), 26 deletions(-) diff --git a/devapp/base_intr.py b/devapp/base_intr.py index 84a5077..b4afe0f 100644 --- a/devapp/base_intr.py +++ b/devapp/base_intr.py @@ -3,7 +3,7 @@ from datetime import timedelta from typing import Union, Iterable, AnyStr, Generator, Optional, Dict from easysnmp import Session -from django.utils.translation import gettext +from django.utils.translation import gettext, gettext_lazy as _ ListOrError = Union[ Iterable, @@ -34,7 +34,12 @@ class DevBase(object, metaclass=ABCMeta): @abstractmethod def reboot(self, save_before_reboot=False): - pass + """ + Send signal reboot to device + :param save_before_reboot: + :return: tuple of command return number and text of operation + """ + return 5, _('Reboot not ready') @abstractmethod def get_ports(self) -> ListOrError: diff --git a/devapp/dev_types.py b/devapp/dev_types.py index 901634d..853d10f 100644 --- a/devapp/dev_types.py +++ b/devapp/dev_types.py @@ -87,7 +87,10 @@ class DLinkDevice(DevBase, SNMPBaseWorker): def reboot(self, save_before_reboot=False): dat = self.db_instance.extra_data if dat is None: - return + raise DeviceConfigurationError( + _('You have not info in extra_data ' + 'field, please fill it in JSON') + ) login = dat.get('login') passw = dat.get('password') if login and passw: @@ -95,7 +98,7 @@ class DLinkDevice(DevBase, SNMPBaseWorker): self.db_instance.ip_address, login, passw, 1 if save_before_reboot else 0 - )) + )), None def get_ports(self) -> ListOrError: interfaces_count = safe_int(self.get_item('.1.3.6.1.2.1.2.1.0')) @@ -167,9 +170,6 @@ class OLTDevice(DevBase, SNMPBaseWorker): DevBase.__init__(self, dev_instance) SNMPBaseWorker.__init__(self, dev_instance.ip_address, dev_instance.man_passw, 2) - def reboot(self, save_before_reboot=False): - pass - def get_ports(self) -> ListOrError: nms = self.get_list('.1.3.6.1.4.1.3320.101.10.1.1.79') res = [] @@ -238,9 +238,6 @@ class OnuDevice(DevBase, SNMPBaseWorker): )) SNMPBaseWorker.__init__(self, dev_ip_addr, dev_instance.man_passw, 2) - def reboot(self, save_before_reboot=False): - pass - def get_ports(self) -> ListOrError: return () @@ -365,7 +362,7 @@ class EltexSwitch(DLinkDevice): return plain_ip_device_mon_template(device) def reboot(self, save_before_reboot=False): - pass + return DevBase.reboot(self, save_before_reboot) def conv_signal(lvl: int) -> float: @@ -607,6 +604,3 @@ class HuaweiSwitch(EltexSwitch): ) ep.writable = True yield ep - - def reboot(self, save_before_reboot=False): - pass diff --git a/devapp/locale/ru/LC_MESSAGES/django.po b/devapp/locale/ru/LC_MESSAGES/django.po index 8287887..f95746b 100644 --- a/devapp/locale/ru/LC_MESSAGES/django.po +++ b/devapp/locale/ru/LC_MESSAGES/django.po @@ -229,7 +229,7 @@ msgstr "Сбросить форму" #: templates/devapp/custom_dev_page/onu_for_zte.html:12 #: templates/devapp/custom_dev_page/ports.html:12 msgid "Uptime" -msgstr "Без перезагрузки" +msgstr "Время работы" #: templates/devapp/custom_dev_page/olt.html:17 msgid "SNMP Num" @@ -663,3 +663,12 @@ msgstr "Комманда вернула %s" msgid "Command return nothing" msgstr "Комманда вернула пустое значение" + +msgid "Command return unknown" +msgstr "Комманда вернула что-то не понятное" + +msgid "Reboot not ready" +msgstr "Перезагрузка для устройства не готова" + +msgid "Is save before reboot" +msgstr "Сохраниться перед перезагрузкой" diff --git a/devapp/views.py b/devapp/views.py index d332fd3..fd9b1b3 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -1,9 +1,6 @@ import re from ipaddress import ip_address -from abonapp.models import Abon -from accounts_app.models import UserProfile -from devapp.base_intr import DeviceImplementationError from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import login_required @@ -24,12 +21,15 @@ from djing.lib.mixins import LoginAdminPermissionMixin, LoginAdminMixin from djing.tasks import multicast_email_notify from easysnmp import EasySNMPTimeoutError, EasySNMPError from group_app.models import Group +from abonapp.models import Abon +from accounts_app.models import UserProfile from messenger.tasks import multicast_viber_notify from guardian.decorators import permission_required_or_403 as permission_required from guardian.shortcuts import get_objects_for_user from devapp.forms import DeviceForm, PortForm, DeviceExtraDataForm, DeviceRebootForm from devapp.models import Device, Port, DeviceDBException, DeviceMonitoringException from devapp.tasks import onu_register +from devapp.base_intr import DeviceImplementationError, DeviceConfigurationError from devapp import expect_scripts @@ -544,13 +544,22 @@ class RebootDevice(LoginAdminPermissionMixin, UpdateView): device = self.object manager = device.get_manager_object() is_save = form.cleaned_data.get('is_save') - ret = manager.reboot(save_before_reboot=is_save) - if ret == 0: - messages.success(self.request, _('Signal for reboot has been sent')) - elif ret is None: - messages.warning(self.request, _('Command return nothing')) - else: - messages.error(self.request, _('Command returned %s') % str(ret)) + try: + r = manager.reboot(save_before_reboot=is_save) + if isinstance(r, tuple) and len(r) == 2: + ret, ret_text = r + if ret == 0: + messages.success(self.request, ret_text or _('Signal for reboot has been sent')) + elif ret is None: + messages.warning(self.request, ret_text or _('Command return nothing')) + else: + messages.error(self.request, ret_text or _('Command returned %s') % str(ret)) + elif r is None: + messages.warning(self.request, _('Command return nothing')) + else: + messages.warning(self.request, _('Command return unknown')) + except DeviceConfigurationError as e: + messages.error(self.request, e) return redirect( 'devapp:view', device.group.pk if device.group is not None else 0, diff --git a/djing/lib/__init__.py b/djing/lib/__init__.py index 16e94b9..3e66880 100644 --- a/djing/lib/__init__.py +++ b/djing/lib/__init__.py @@ -62,7 +62,7 @@ class RuTimedelta(timedelta): # text_date = '%d %s %s' % (self.days, ru_days, text_date) text_date = '%d %s' % (self.days, ru_days) else: - text_date = '' + text_date = super(RuTimedelta, self).__str__() return text_date