more on that

This commit is contained in:
xtremxpert 2024-12-09 09:35:56 -05:00
parent 7783b04e73
commit fb057ada9a
18 changed files with 466 additions and 10 deletions

BIN
odoo_unifi_manager.zip Normal file

Binary file not shown.

View file

@ -8,10 +8,13 @@
'base'
],
'data': [
'views/firewall_rule_wizard_action.xml',
'views/controller_views.xml',
'views/firewall_rule_action.xml',
'views/firewall_rule_views.xml',
'views/firewall_rule_template_views.xml',
# 'views/unify_menu.xml',
'views/network_views.xml',
'views/wifi_views.xml',
'views/unify_menu.xml',
'security/ir.model.access.csv'
],
'installable': True,

View file

@ -1,2 +1,6 @@
from . import ctrl
from . import firewall_rule
from . import firewall_rule_template
from . import network
from . import wifi
from . import unifi_client

View file

@ -0,0 +1,57 @@
from .unifi_client import Unifi
from odoo import models, fields, api
from odoo.exceptions import ValidationError
#from unificontrol import UnifiClient
class UnifiCtrl(models.Model):
_name = 'unifi.ctrl'
_description = 'Unifi Controller'
name = fields.Char(
string='Name',
required=True
)
ip_address = fields.Char(
string='IP Address',
required=True,
help="IP address of the Unifi Controller."
)
api_port = fields.Integer(
string='API Port',
default=8443,
help="Port used for the Unifi API."
)
username = fields.Char(
string='Username',
required=True,
help="Username for API authentication."
)
password = fields.Char(
string='Password',
required=True,
help="Password for API authentication."
)
def action_test_connection(self):
"""Test connection to Unifi Controller."""
self.ensure_one()
client = Unifi(self.ip_address, self.username, self.password)
try:
client.login()
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': 'Success',
'message': 'Connection successful!',
'type': 'success',
},
}
except Exception as e:
raise ValidationError(f"Connection failed: {e}")

View file

@ -9,6 +9,13 @@ class FirewallRule(models.Model):
required=True
)
ctrl_id = fields.Many2one(
'unifi.ctrl',
string='Controller',
required=True,
help="Controller where this rule is applied."
)
action = fields.Selection(
selection=[
('accept', 'Accept'),

View file

@ -8,7 +8,14 @@ class FirewallRuleTemplate(models.Model):
string='Template Name',
required=True
)
ctrl_id = fields.Many2one(
'unifi.ctrl',
string='Controller',
required=True,
help="Controller where this rule is applied."
)
action = fields.Selection(
selection=[
('accept', 'Accept'),

View file

@ -0,0 +1,37 @@
from odoo import models, fields
class Network(models.Model):
_name = 'unifi.network'
_description = 'Unifi Network'
name = fields.Char(
string='Network Name',
required=True
)
cidr = fields.Char(
string='CIDR',
required=True,
help="CIDR notation for the network (e.g., 192.168.1.0/24)."
)
gateway = fields.Char(
string='Gateway',
help="Gateway IP address for the network."
)
vlan_id = fields.Integer(
string='VLAN ID',
help="VLAN ID for the network."
)
description = fields.Text(
string='Description'
)
ctrl_id = fields.Many2one(
'unifi.ctrl',
string='Controller',
required=True,
help="Controller where this rule is applied."
)

View file

@ -0,0 +1,73 @@
import requests
import urllib3
from odoo.exceptions import ValidationError
UNIFI_LOGIN_PATH = '/api/auth/login'
UNIFI_SITES_PATH = '/api/self/sites'
# Désactiver les avertissements SSL pour certificats auto-signés
urllib3.disable_warnings()
class Unifi:
def __init__(self, host, username, password):
"""Initialize Unifi client."""
self.host = host
self.username = username
self.password = password
self.session = requests.Session()
self.csrf = ""
def login(self):
"""Authenticate with the Unifi Controller."""
payload = {
"username": self.username,
"password": self.password,
}
try:
r = self.request(UNIFI_LOGIN_PATH, payload)
if r.ok:
return True
else:
raise ValidationError(f"Login failed: {r.text}")
except requests.RequestException as e:
raise ValidationError(f"Failed to connect to Unifi Controller: {e}")
def request(self, path, data=None, method='POST'):
"""Send a request to the Unifi API."""
if data is None:
data = {}
uri = f'https://{self.host}{path}'
headers = {
"Accept": "application/json",
"Content-Type": "application/json; charset=utf-8",
}
if self.csrf:
headers["X-CSRF-Token"] = self.csrf
try:
r = getattr(self.session, method.lower())(uri, json=data, verify=False, headers=headers)
if 'X-CSRF-Token' in r.headers:
self.csrf = r.headers['X-CSRF-Token']
return r
except requests.RequestException as e:
raise ValidationError(f"Request to Unifi Controller failed: {e}")
def get_sites(self):
"""Retrieve available sites."""
try:
r = self.request(UNIFI_SITES_PATH, method='GET')
if r.ok:
return r.json().get('data', [])
else:
raise ValidationError(f"Failed to retrieve sites: {r.text}")
except requests.RequestException as e:
raise ValidationError(f"Failed to retrieve sites: {e}")
def test_connection(self):
"""Test connection and fetch available sites."""
if not self.login():
raise ValidationError("Login failed. Check your credentials.")
sites = self.get_sites()
site_list = [site['desc'] for site in sites]
return f"Connection successful! Available sites: {', '.join(site_list)}"

View file

@ -0,0 +1,35 @@
from odoo import models, fields
class Wifi(models.Model):
_name = 'unifi.wifi'
_description = 'Unifi WiFi Network'
name = fields.Char(string='WiFi Name (SSID)', required=True)
security_mode = fields.Selection(
[('open', 'Open'), ('wpa', 'WPA/WPA2 Personal'), ('wpa3', 'WPA3')],
string='Security Mode',
required=True,
default='wpa'
)
password = fields.Char(
string='WiFi Password',
help="Password for the WiFi network (if applicable)."
)
vlan_id = fields.Many2one(
comodel_name='unifi.network',
string='VLAN',
help="VLAN associated with this WiFi network."
)
description = fields.Text(
string='Description'
)
ctrl_id = fields.Many2one(
'unifi.ctrl',
string='Controller',
required=True,
help="Controller where this rule is applied."
)

View file

@ -2,3 +2,6 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
odoo_unifi_manager.access_unifi_firewall_rule,access_unifi_firewall_rule,odoo_unifi_manager.model_unifi_firewall_rule,base.group_user,1,0,0,0
odoo_unifi_manager.access_unifi_firewall_rule_template,access_unifi_firewall_rule_template,odoo_unifi_manager.model_unifi_firewall_rule_template,base.group_user,1,0,0,0
odoo_unifi_manager.access_unifi_firewall_rule_wizard,access_unifi_firewall_rule_wizard,odoo_unifi_manager.model_unifi_firewall_rule_wizard,base.group_user,1,0,0,0
odoo_unifi_manager.access_unifi_network,access_unifi_network,odoo_unifi_manager.model_unifi_network,base.group_user,1,1,1,0
odoo_unifi_manager.access_unifi_wifi,access_unifi_wifi,odoo_unifi_manager.model_unifi_wifi,base.group_user,1,1,1,0
odoo_unifi_manager.access_unifi_ctrl,access_unifi_ctrl,odoo_unifi_manager.model_unifi_ctrl,base.group_system,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 odoo_unifi_manager.access_unifi_firewall_rule access_unifi_firewall_rule odoo_unifi_manager.model_unifi_firewall_rule base.group_user 1 0 0 0
3 odoo_unifi_manager.access_unifi_firewall_rule_template access_unifi_firewall_rule_template odoo_unifi_manager.model_unifi_firewall_rule_template base.group_user 1 0 0 0
4 odoo_unifi_manager.access_unifi_firewall_rule_wizard access_unifi_firewall_rule_wizard odoo_unifi_manager.model_unifi_firewall_rule_wizard base.group_user 1 0 0 0
5 odoo_unifi_manager.access_unifi_network access_unifi_network odoo_unifi_manager.model_unifi_network base.group_user 1 1 1 0
6 odoo_unifi_manager.access_unifi_wifi access_unifi_wifi odoo_unifi_manager.model_unifi_wifi base.group_user 1 1 1 0
7 odoo_unifi_manager.access_unifi_ctrl access_unifi_ctrl odoo_unifi_manager.model_unifi_ctrl base.group_system 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,46 @@
<odoo>
<!-- Action pour afficher les contrôleurs -->
<record id="action_unifi_ctrls_list" model="ir.actions.act_window">
<field name="name">Controllers</field>
<field name="res_model">unifi.ctrl</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Manage your Unifi Controllers here.
</p>
</field>
</record>
<!-- Vue Liste pour les contrôleurs -->
<record id="view_ctrl_tree" model="ir.ui.view">
<field name="name">unifi.ctrl.tree</field>
<field name="model">unifi.ctrl</field>
<field name="arch" type="xml">
<tree string="Controllers">
<field name="name"/>
<field name="ip_address"/>
<field name="api_port"/>
</tree>
</field>
</record>
<!-- Vue Formulaire pour les contrôleurs -->
<record id="view_ctrl_form" model="ir.ui.view">
<field name="name">unifi.ctrl.form</field>
<field name="model">unifi.ctrl</field>
<field name="arch" type="xml">
<form string="Controller">
<sheet>
<group>
<field name="name"/>
<field name="ip_address"/>
<field name="api_port"/>
<field name="username"/>
<field name="password" password="True"/>
<button name="action_test_connection" type="object" string="Test Connection" class="btn-primary"/>
</group>
</sheet>
</form>
</field>
</record>
</odoo>

View file

@ -0,0 +1,12 @@
<odoo>
<record id="action_firewall_rules_list" model="ir.actions.act_window">
<field name="name">Firewall Rules</field>
<field name="res_model">unifi.firewall.rule</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Configure and manage your firewall rules here.
</p>
</field>
</record>
</odoo>

View file

@ -1,4 +1,21 @@
<odoo>
<!-- Vue Liste pour les Templates -->
<record id="view_firewall_rule_template_tree" model="ir.ui.view">
<field name="name">firewall.rule.template.tree</field>
<field name="model">unifi.firewall.rule.template</field>
<field name="arch" type="xml">
<tree string="Firewall Rule Templates">
<field name="name"/>
<field name="action"/>
<field name="src_ip"/>
<field name="dst_ip"/>
<field name="protocol"/>
<field name="port"/>
</tree>
</field>
</record>
<!-- Vue Formulaire pour les Templates -->
<record id="view_firewall_rule_template_form" model="ir.ui.view">
<field name="name">firewall.rule.template.form</field>
<field name="model">unifi.firewall.rule.template</field>
@ -13,11 +30,19 @@
<field name="protocol"/>
<field name="port"/>
</group>
<footer>
<button name="%(action_open_firewall_rule_wizard)d" type="action" string="Create Rule" class="btn-primary"/>
</footer>
</sheet>
</form>
</field>
</record>
</odoo>
<record id="action_firewall_templates_list" model="ir.actions.act_window">
<field name="name">Firewall Rule Templates</field>
<field name="res_model">unifi.firewall.rule.template</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create and manage templates for your firewall rules here.
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,46 @@
<odoo>
<!-- Vue Liste pour les Réseaux -->
<record id="view_network_tree" model="ir.ui.view">
<field name="name">unifi.network.tree</field>
<field name="model">unifi.network</field>
<field name="arch" type="xml">
<tree string="Networks">
<field name="name"/>
<field name="cidr"/>
<field name="gateway"/>
<field name="vlan_id"/>
</tree>
</field>
</record>
<!-- Vue Formulaire pour les Réseaux -->
<record id="view_network_form" model="ir.ui.view">
<field name="name">unifi.network.form</field>
<field name="model">unifi.network</field>
<field name="arch" type="xml">
<form string="Network">
<sheet>
<group>
<field name="name"/>
<field name="cidr"/>
<field name="gateway"/>
<field name="vlan_id"/>
<field name="description"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_network_list" model="ir.actions.act_window">
<field name="name">Networks</field>
<field name="res_model">unifi.network</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create and manage your networks here.
</p>
</field>
</record>
</odoo>

View file

@ -1,5 +1,61 @@
<odoo>
<menuitem id="menu_unifi_root" name="Unifi" sequence="10" app="True" />
<menuitem id="menu_unifi_firewall_rules" name="Firewall Rules" parent="menu_unifi_root" action="action_firewall_rules" />
<menuitem id="menu_unifi_firewall_templates" name="Templates" parent="menu_unifi_root" action="action_firewall_templates" />
<!-- Menu Principal -->
<menuitem id="unifi_menu_root"
name="Unifi"
sequence="90"
web_icon="odoo_unifi_manager,static/description/icon.png"
groups="base.group_system"
>
<menuitem
id="menu_unifi_overvier"
name="Overview"
sequence="5"
/>
<menuitem
id="menu_unifi_administration"
name="Administration"
sequence="10"
>
<menuitem id="menu_unifi_firewall_rules"
name="Firewall Rules"
action="action_firewall_rules_list"
sequence="20"
/>
<menuitem id="menu_unifi_networks"
name="Networks"
action="action_network_list"
sequence="30"
/>
<menuitem id="menu_unifi_wifi"
name="Wifi Networks"
action="action_wifi_list"
sequence="40"
/>
</menuitem>
<menuitem
id="menu_unifi_configuration"
name="Configuration"
sequence="20"
>
<menuitem id="menu_unifi_firewall_templates"
name="Templates"
action="action_firewall_templates_list"
sequence="10"
/>
<menuitem id="menu_unifi_controller"
name="Controllers"
action="action_unifi_ctrls_list"
sequence="20"
/>
</menuitem>
</menuitem>
</odoo>

View file

@ -0,0 +1,45 @@
<odoo>
<!-- Vue Liste pour les WiFi -->
<record id="view_wifi_tree" model="ir.ui.view">
<field name="name">unifi.wifi.tree</field>
<field name="model">unifi.wifi</field>
<field name="arch" type="xml">
<tree string="WiFi Networks">
<field name="name"/>
<field name="security_mode"/>
<field name="vlan_id"/>
</tree>
</field>
</record>
<!-- Vue Formulaire pour les WiFi -->
<record id="view_wifi_form" model="ir.ui.view">
<field name="name">unifi.wifi.form</field>
<field name="model">unifi.wifi</field>
<field name="arch" type="xml">
<form string="WiFi Network">
<sheet>
<group>
<field name="name"/>
<field name="security_mode"/>
<field name="password"/>
<field name="vlan_id"/>
<field name="description"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_wifi_list" model="ir.actions.act_window">
<field name="name">WiFi Networks</field>
<field name="res_model">unifi.wifi</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create and manage your WiFi networks here.
</p>
</field>
</record>
</odoo>