diff --git a/api/urls.py b/api/urls.py index 584dd600..f9838d38 100644 --- a/api/urls.py +++ b/api/urls.py @@ -45,6 +45,9 @@ urlpatterns = [ url(r'^dns/srv/$', views.dns_srv), url(r'^dns/zones/$', views.dns_zones), + # Unifi controler AP names + url(r'^unifi/ap_names/$', views.accesspoint_ip_dns), + # Firewall url(r'^firewall/ouverture_ports/$', views.firewall_ouverture_ports), diff --git a/api/views.py b/api/views.py index cc2237de..3e4b90ed 100644 --- a/api/views.py +++ b/api/views.py @@ -163,6 +163,36 @@ def dns_alias(request): return JSONSuccess(seria.data) +@csrf_exempt +@login_required +@permission_required('machines.serveur') +@accept_method(['GET']) +def accesspoint_ip_dns(request): + """The list of all active interfaces with all the associated infos + (MAC, IP, IpType, DNS name and associated zone extension) + + Only display access points. Use to gen unifi controler names + + Returns: + GET: + A JSON Success response with a field `data` containing: + * a list of dictionnaries (one for each interface) containing: + * a field `ipv4` containing: + * a field `ipv4`: the ip for this interface + * a field `ip_type`: the name of the IpType of this interface + * a field `ipv6` containing `null` if ipv6 is deactivated else: + * a field `ipv6`: the ip for this interface + * a field `ip_type`: the name of the IpType of this interface + * a field `mac_address`: the MAC of this interface + * a field `domain`: the DNS name for this interface + * a field `extension`: the extension for the DNS zone of this interface + """ + interfaces = all_active_assigned_interfaces(full=True)\ + .filter(machine__accesspoint__isnull=False) + seria = FullInterfaceSerializer(interfaces, many=True) + return JSONSuccess(seria.data) + + @csrf_exempt @login_required @permission_required('machines.serveur') diff --git a/topologie/management/commands/sync_unifi_ap.py b/topologie/management/commands/sync_unifi_ap.py deleted file mode 100644 index 574c3e98..00000000 --- a/topologie/management/commands/sync_unifi_ap.py +++ /dev/null @@ -1,47 +0,0 @@ -# ⁻*- mode: python; coding: utf-8 -*- -# Re2o est un logiciel d'administration développé initiallement au rezometz. Il -# se veut agnostique au réseau considéré, de manière à être installable en -# quelques clics. -# -# Copyright © 2018 Gabriel Detraz -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from django.core.management.base import BaseCommand, CommandError -from pymongo import MongoClient -from topologie.models import Borne - -class Command(BaseCommand): - help = 'Ce script donne un nom aux bornes dans le controleur unifi. - A lancer sur le serveur en local où se trouve le controleur' - - def handle(self, *args, **options): - # Connexion mongodb - client = MongoClient("mongodb://localhost:27117") - db = client.ace - device = db['device'] - - bornes = Borne.objects.all() - - def set_bornes_names(liste_bornes): - """Met à jour les noms des bornes dans la bdd du controleur""" - for borne in liste_bornes: - if borne.ipv4 and borne.domain: - device.find_one_and_update({'ip': str(borne.ipv4)}, {'$set': {'name': str(borne.domain.name)}}) - return - - set_bornes_names(bornes) - - self.stdout.write(self.style.SUCCESS('Mise à jour de la base de donnée unifi avec succès')) diff --git a/topologie/models.py b/topologie/models.py index 3cf0d5b2..22c0192d 100644 --- a/topologie/models.py +++ b/topologie/models.py @@ -40,7 +40,7 @@ from __future__ import unicode_literals import itertools from django.db import models -from django.db.models.signals import post_delete +from django.db.models.signals import post_save, post_delete from django.dispatch import receiver from django.core.exceptions import ValidationError from django.db import IntegrityError @@ -538,6 +538,18 @@ class Room(models.Model): return self.name +@receiver(post_save, sender=AccessPoint) +def ap_post_save(sender, **kwargs): + """Regeneration des noms des bornes vers le controleur""" + regen('unifi-ap-names') + + +@receiver(post_delete, sender=AccessPoint) +def ap_post_delete(sender, **kwargs): + """Regeneration des noms des bornes vers le controleur""" + regen('unifi-ap-names') + + @receiver(post_delete, sender=Stack) def stack_post_delete(sender, **kwargs): """Vide les id des switches membres d'une stack supprimée"""