more on that
This commit is contained in:
parent
7783b04e73
commit
fb057ada9a
18 changed files with 466 additions and 10 deletions
BIN
odoo_unifi_manager.zip
Normal file
BIN
odoo_unifi_manager.zip
Normal file
Binary file not shown.
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
57
odoo_unifi_manager/models/ctrl.py
Normal file
57
odoo_unifi_manager/models/ctrl.py
Normal 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}")
|
||||
|
|
@ -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'),
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
|
|
|
|||
37
odoo_unifi_manager/models/network.py
Normal file
37
odoo_unifi_manager/models/network.py
Normal 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."
|
||||
)
|
||||
73
odoo_unifi_manager/models/unifi_client.py
Normal file
73
odoo_unifi_manager/models/unifi_client.py
Normal 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)}"
|
||||
35
odoo_unifi_manager/models/wifi.py
Normal file
35
odoo_unifi_manager/models/wifi.py
Normal 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."
|
||||
)
|
||||
|
|
@ -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
|
||||
|
BIN
odoo_unifi_manager/static/description/icon.png
Normal file
BIN
odoo_unifi_manager/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
46
odoo_unifi_manager/views/controller_views.xml
Normal file
46
odoo_unifi_manager/views/controller_views.xml
Normal 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>
|
||||
12
odoo_unifi_manager/views/firewall_rule_action.xml
Normal file
12
odoo_unifi_manager/views/firewall_rule_action.xml
Normal 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>
|
||||
|
|
@ -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>
|
||||
46
odoo_unifi_manager/views/network_views.xml
Normal file
46
odoo_unifi_manager/views/network_views.xml
Normal 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>
|
||||
|
|
@ -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>
|
||||
45
odoo_unifi_manager/views/wifi_views.xml
Normal file
45
odoo_unifi_manager/views/wifi_views.xml
Normal 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>
|
||||
Loading…
Reference in a new issue