Browse Source

Create view mixin for access by browser auth or api hash if not

authenticated.
And make view to download devices to nagios config.
devel
bashmak 8 years ago
parent
commit
f43c8a7cdb
  1. 5
      agent/monitoring_agent.py
  2. 2
      devapp/urls.py
  3. 67
      devapp/views.py
  4. 18
      djing/global_base_views.py

5
agent/monitoring_agent.py

@ -66,6 +66,9 @@ if __name__ == '__main__':
dev_ip = validate(IP_REGEXP, sys.argv[1]) dev_ip = validate(IP_REGEXP, sys.argv[1])
status = validate_status(sys.argv[2]) status = validate_status(sys.argv[2])
sign = calc_hash('_'.join((dev_ip, status, API_AUTH_SECRET)))
vars_to_hash = [dev_ip, status]
vars_to_hash.sort()
vars_to_hash.append(API_AUTH_SECRET)
sign = calc_hash('_'.join(vars_to_hash))
send_request(dev_ip, status, sign) send_request(dev_ip, status, sign)

2
devapp/urls.py

@ -29,5 +29,5 @@ urlpatterns = [
url(r'^on_device_event/$', views.OnDeviceMonitoringEvent.as_view()), url(r'^on_device_event/$', views.OnDeviceMonitoringEvent.as_view()),
# Nagios mon generate # Nagios mon generate
url(r'^nagios/hosts/$', views.nagios_objects_conf, name='nagios_objects_conf')
url(r'^nagios/hosts/$', views.NagiosObjectsConfView.as_view(), name='nagios_objects_conf')
] ]

67
devapp/views.py

@ -576,13 +576,42 @@ class OnDeviceMonitoringEvent(global_base_views.AllowedSubnetMixin, global_base_
} }
@login_required
@only_admins
def nagios_objects_conf(request):
from transliterate import translit
confs = list()
class NagiosObjectsConfView(global_base_views.AuthenticatedOrHashAuthView):
http_method_names = ['get']
def get(self, request, *args, **kwargs):
from transliterate import translit
confs = list()
def norm_name(name: str, replreg=re.compile(r'\W{1,255}', re.IGNORECASE)):
return replreg.sub('', name)
for dev in Device.objects.exclude(Q(ip_address=None) | Q(ip_address='127.0.0.1')) \
.select_related('parent_dev') \
.only('ip_address', 'comment', 'parent_dev'):
host_name = norm_name("%d%s" % (dev.pk, translit(dev.comment, language_code='ru', reversed=True)))
conf = None
if dev.devtype == 'On':
if dev.parent_dev:
host_addr = dev.parent_dev.ip_address
conf = self.templ_onu(host_name, host_addr, snmp_item=dev.snmp_item_num or None)
else:
if dev.ip_address:
host_addr = dev.ip_address
conf = self.templ_onu(host_name, host_addr, snmp_item=dev.snmp_item_num or None)
else:
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
conf = self.templ(host_name, host_addr=dev.ip_address, parent_host_name=parent_host_name)
if conf is not None:
confs.append(conf)
response = HttpResponse(''.join(confs), content_type='text/plain')
response['Content-Disposition'] = 'attachment; filename="objects.cfg"'
return response
def templ(host_name, host_addr, parent_host_name):
@staticmethod
def templ(host_name: str, host_addr: str, parent_host_name: str):
return '\n'.join([ return '\n'.join([
"define host{", "define host{",
"\tuse generic-switch", "\tuse generic-switch",
@ -592,19 +621,13 @@ def nagios_objects_conf(request):
"}\n" "}\n"
]) ])
def norm_name(name: str, replreg=re.compile(r'\W{1,255}', re.IGNORECASE)):
return replreg.sub('', name)
for dev in Device.objects.exclude(Q(ip_address=None) | Q(ip_address='127.0.0.1'))\
.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
@staticmethod
def templ_onu(host_name: str, host_addr: str, snmp_item: int):
return '\n'.join([
"define host{",
"\tuse device-onu",
"\thost_name %s" % host_name,
"\taddress %s" % host_addr,
"\t_snmp_item %d" % snmp_item if snmp_item is not None else '',
"}\n"
])

18
djing/global_base_views.py

@ -51,13 +51,27 @@ class HashAuthView(View):
# Transmittent get list without sign # Transmittent get list without sign
get_values = request.GET.copy() get_values = request.GET.copy()
del get_values['sign'] del get_values['sign']
heshable = (get_values.get('ip'), get_values.get('status'), API_AUTH_SECRET)
if HashAuthView.check_sign(heshable, sign):
values_list = [l for l in get_values.values() if l]
values_list.sort()
values_list.append(API_AUTH_SECRET)
if self.check_sign(values_list, sign):
return super(HashAuthView, self).dispatch(request, *args, **kwargs) return super(HashAuthView, self).dispatch(request, *args, **kwargs)
else: else:
return HttpResponseForbidden('Access Denied') return HttpResponseForbidden('Access Denied')
class AuthenticatedOrHashAuthView(HashAuthView):
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated():
if request.user.is_admin:
return View.dispatch(self, request, *args, **kwargs)
else:
return HttpResponseRedirect('client_side:home')
else:
return HashAuthView.dispatch(self, request, *args, **kwargs)
class AllowedSubnetMixin(object): class AllowedSubnetMixin(object):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
""" """

Loading…
Cancel
Save