142 lines
4.8 KiB
Python
142 lines
4.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo import models, fields, api, _
|
|
from odoo.exceptions import ValidationError
|
|
import logging
|
|
import json
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
class UnifiDnsConfig(models.Model):
|
|
"""Configuration DNS pour le système UniFi
|
|
|
|
Ce modèle stocke la configuration DNS pour les contrôleurs UniFi.
|
|
Il gère les paramètres DNS comme les serveurs personnalisés et le filtrage de contenu.
|
|
|
|
La configuration DNS est liée à un site spécifique et est automatiquement supprimée
|
|
lorsque le site est supprimé (cascade).
|
|
"""
|
|
_name = 'unifi.dns.config'
|
|
_description = 'UniFi DNS Configuration'
|
|
|
|
site_id = fields.Many2one(
|
|
comodel_name='unifi.site',
|
|
string='Site',
|
|
required=True,
|
|
ondelete='cascade',
|
|
help='Site this DNS configuration belongs to'
|
|
)
|
|
|
|
enabled = fields.Boolean(
|
|
string='Enabled',
|
|
default=True,
|
|
help='Enable DNS server'
|
|
)
|
|
|
|
filters_enabled = fields.Boolean(
|
|
string='Content Filtering Enabled',
|
|
default=False,
|
|
help='Enable DNS content filtering'
|
|
)
|
|
|
|
custom_dns = fields.Char(
|
|
string='Custom DNS Servers',
|
|
help='Comma-separated list of custom DNS servers'
|
|
)
|
|
|
|
forwarding_enabled = fields.Boolean(
|
|
string='DNS Forwarding Enabled',
|
|
default=False,
|
|
help='Enable DNS query forwarding'
|
|
)
|
|
|
|
mdns_enabled = fields.Boolean(
|
|
string='mDNS Enabled',
|
|
default=False,
|
|
help='Enable multicast DNS (mDNS)'
|
|
)
|
|
|
|
unifi_id = fields.Char(
|
|
string='UniFi ID',
|
|
help='ID of this DNS configuration in the UniFi system'
|
|
)
|
|
|
|
last_sync = fields.Datetime(
|
|
string='Last Synchronization',
|
|
help='Last time this DNS configuration was synchronized with the UniFi system'
|
|
)
|
|
|
|
raw_data = fields.Text(
|
|
string='Raw Data',
|
|
help='Raw DNS configuration data in JSON format'
|
|
)
|
|
|
|
@api.constrains('custom_dns')
|
|
def _check_custom_dns_format(self):
|
|
"""Vérifie que les serveurs DNS personnalisés sont au format valide"""
|
|
for record in self:
|
|
if not record.custom_dns:
|
|
continue
|
|
|
|
dns_servers = record.custom_dns.split(',')
|
|
for server in dns_servers:
|
|
server = server.strip()
|
|
# Validation simple pour IPv4
|
|
if server:
|
|
ip_parts = server.split('.')
|
|
if len(ip_parts) != 4:
|
|
raise ValidationError(_("Les serveurs DNS doivent être au format IPv4 (x.x.x.x)."))
|
|
|
|
for part in ip_parts:
|
|
try:
|
|
num = int(part)
|
|
if num < 0 or num > 255:
|
|
raise ValidationError(_("Chaque partie de l'adresse IP doit être comprise entre 0 et 255."))
|
|
except ValueError:
|
|
raise ValidationError(_("L'adresse IP doit contenir uniquement des nombres."))
|
|
|
|
def name_get(self):
|
|
"""Personnalise l'affichage du nom des enregistrements"""
|
|
result = []
|
|
for record in self:
|
|
name = f"Configuration DNS - {record.site_id.name}"
|
|
result.append((record.id, name))
|
|
return result
|
|
|
|
def sync_from_unifi(self):
|
|
"""Synchronise les données depuis le système UniFi"""
|
|
for record in self:
|
|
site = record.site_id
|
|
if not site:
|
|
continue
|
|
|
|
_logger.info("Synchronizing DNS configuration from UniFi site %s", site.name)
|
|
|
|
# La synchronisation dépend du type d'API du site
|
|
if site.api_type == 'controller':
|
|
# TODO: Implémenter la synchronisation depuis l'API Controller
|
|
pass
|
|
elif site.api_type == 'site_manager':
|
|
# TODO: Implémenter la synchronisation depuis l'API Site Manager
|
|
pass
|
|
|
|
record.last_sync = fields.Datetime.now()
|
|
|
|
def push_to_unifi(self):
|
|
"""Pousse les modifications vers le système UniFi"""
|
|
for record in self:
|
|
site = record.site_id
|
|
if not site:
|
|
continue
|
|
|
|
_logger.info("Pushing DNS configuration to UniFi site %s", site.name)
|
|
|
|
# La synchronisation dépend du type d'API du site
|
|
if site.api_type == 'controller':
|
|
# TODO: Implémenter la synchronisation vers l'API Controller
|
|
pass
|
|
elif site.api_type == 'site_manager':
|
|
# TODO: Implémenter la synchronisation vers l'API Site Manager
|
|
pass
|
|
|
|
record.last_sync = fields.Datetime.now()
|