diff --git a/devapp/locale/ru/LC_MESSAGES/django.po b/devapp/locale/ru/LC_MESSAGES/django.po index 0be4c36..0d31521 100644 --- a/devapp/locale/ru/LC_MESSAGES/django.po +++ b/devapp/locale/ru/LC_MESSAGES/django.po @@ -511,3 +511,6 @@ msgstr "Показать абонента на порту" msgid "Subscribers on port does not exist" msgstr "Абоненты на порту не найдены" + +msgid "Export to nagios objects" +msgstr "Экспортировать конфиг для nagios" diff --git a/devapp/templates/devapp/group_list.html b/devapp/templates/devapp/group_list.html index 487e2aa..dbd78b1 100644 --- a/devapp/templates/devapp/group_list.html +++ b/devapp/templates/devapp/group_list.html @@ -27,10 +27,13 @@ - - + + {% trans 'Devices without group' %} + + {% trans 'Export to nagios objects' %} + diff --git a/devapp/urls.py b/devapp/urls.py index 13a048e..adeeca8 100644 --- a/devapp/urls.py +++ b/devapp/urls.py @@ -26,5 +26,8 @@ urlpatterns = [ url(r'^search_dev$', views.search_dev), # Monitoring api - url(r'^on_device_event/$', views.OnDeviceMonitoringEvent.as_view()) + url(r'^on_device_event/$', views.OnDeviceMonitoringEvent.as_view()), + + # Nagios mon generate + url(r'^nagios/hosts/$', views.nagios_objects_conf, name='nagios_objects_conf') ] diff --git a/devapp/views.py b/devapp/views.py index 714db7a..05ba58f 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -11,7 +11,7 @@ from django.contrib import messages from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _, gettext from easysnmp import EasySNMPTimeoutError, EasySNMPError -from django.views.generic import DetailView +from django.views.generic import DetailView, ListView from devapp.base_intr import DeviceImplementationError from mydefs import res_success, res_error, only_admins, ping, ip_addr_regex @@ -573,3 +573,35 @@ class OnDeviceMonitoringEvent(global_base_views.AllowedSubnetMixin, global_base_ return { 'text': str(e) } + + +@login_required +@only_admins +def nagios_objects_conf(request): + from transliterate import translit + confs = list() + + def templ(host_name, host_addr, parent_host_name): + return '\n'.join([ + "define host{", + "\tuse generic-switch", + "\thost_name %s" % host_name, + "\taddress %s" % host_addr, + "\tparents %s" % parent_host_name if parent_host_name is not None else '', + "}\n" + ]) + + def norm_name(name: str, replreg=re.compile(r'\W+', re.IGNORECASE)): + return replreg.sub('', name) + + for dev in Device.objects.exclude(devtype='On').select_related('parent_dev').only('ip_address', 'comment', 'parent_dev'): + conf = templ(host_name=norm_name("%d%s" % (dev.pk, translit(dev.comment, language_code='ru', reversed=True))), + host_addr=dev.ip_address, + parent_host_name=norm_name("%d%s" % (dev.parent_dev.pk, + translit(dev.parent_dev.comment, language_code='ru', + reversed=True))) if dev.parent_dev else None, + ) + confs.append(conf) + response = HttpResponse(''.join(confs), content_type='text/plain') + response['Content-Disposition'] = 'attachment; filename="objects.cfg"' + return response diff --git a/requirements.txt b/requirements.txt index 4b8ad89..2ab81bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,3 +22,4 @@ webdavclient pyst2 django-jsonview django-bitfield +transliterate \ No newline at end of file