From 77b1d888302bffb7aa18923a1f4cb78ef3f554b7 Mon Sep 17 00:00:00 2001 From: tslai Date: Thu, 5 Nov 2020 17:04:59 +0800 Subject: [PATCH 1/6] [ADD] base_remote_server_management --- base_remote_server_management/__init__.py | 1 + base_remote_server_management/__manifest__.py | 19 ++++ .../models/__init__.py | 5 + .../models/base_remote_database.py | 12 ++ .../models/base_remote_server.py | 23 ++++ .../models/base_remote_url.py | 26 +++++ .../models/server_command_properties.py | 28 +++++ .../models/server_static_properties.py | 12 ++ .../security/ir.model.access.csv | 6 + .../views/base_remote_server_views.xml | 104 ++++++++++++++++++ 10 files changed, 236 insertions(+) create mode 100644 base_remote_server_management/__init__.py create mode 100644 base_remote_server_management/__manifest__.py create mode 100644 base_remote_server_management/models/__init__.py create mode 100644 base_remote_server_management/models/base_remote_database.py create mode 100644 base_remote_server_management/models/base_remote_server.py create mode 100644 base_remote_server_management/models/base_remote_url.py create mode 100644 base_remote_server_management/models/server_command_properties.py create mode 100644 base_remote_server_management/models/server_static_properties.py create mode 100644 base_remote_server_management/security/ir.model.access.csv create mode 100644 base_remote_server_management/views/base_remote_server_views.xml diff --git a/base_remote_server_management/__init__.py b/base_remote_server_management/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/base_remote_server_management/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/base_remote_server_management/__manifest__.py b/base_remote_server_management/__manifest__.py new file mode 100644 index 0000000..ee097e4 --- /dev/null +++ b/base_remote_server_management/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2020 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +{ + "name": "Remote Servers Management", + "summary": "Remote Servers Management", + "version": "12.0.1.0.0", + "category": "Others", + "author": "Quartile Limited", + "website": "https://www.quartile.co", + "license": "LGPL-3", + "depends": [ + "base", + ], + "data": [ + "views/base_remote_server_views.xml", + "security/ir.model.access.csv", + ], + "installable": True, +} diff --git a/base_remote_server_management/models/__init__.py b/base_remote_server_management/models/__init__.py new file mode 100644 index 0000000..5aa7ca3 --- /dev/null +++ b/base_remote_server_management/models/__init__.py @@ -0,0 +1,5 @@ +from . import base_remote_database +from . import base_remote_server +from . import base_remote_url +from . import server_command_properties +from . import server_static_properties diff --git a/base_remote_server_management/models/base_remote_database.py b/base_remote_server_management/models/base_remote_database.py new file mode 100644 index 0000000..f57463e --- /dev/null +++ b/base_remote_server_management/models/base_remote_database.py @@ -0,0 +1,12 @@ +# Copyright 2020 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import models, fields + + +class BaseRemoteDatabase(models.Model): + _name = 'base.remote.database' + + name = fields.Char("Database Name", required=True) + base_remote_server_id = fields.Many2one('base.remote.server', 'Server') + server_url_ids = fields.One2many('base.remote.url', 'base_remote_database_id', string='URL(s)') diff --git a/base_remote_server_management/models/base_remote_server.py b/base_remote_server_management/models/base_remote_server.py new file mode 100644 index 0000000..a974dd8 --- /dev/null +++ b/base_remote_server_management/models/base_remote_server.py @@ -0,0 +1,23 @@ +# Copyright 2020 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import models, fields + + +class BaseRemoteServer(models.Model): + _name = 'base.remote.server' + + name = fields.Char("Description/Usage", required=True) + server_ip = fields.Char("IP", required=True) + ssh_user = fields.Char("SSH User") + ssh_port = fields.Integer("SSH Port Number") + private_key_path = fields.Char("Private Key Path", required=True) + active = fields.Boolean("Active", default=True) + server_command_properties_ids = fields.One2many('server.command.properties', 'base_remote_server_id', string='Command Properties') + server_static_properties_ids = fields.One2many('server.static.properties', 'base_remote_server_id', string='Static Properties') + server_url_ids = fields.One2many('base.remote.url', 'base_remote_server_id', string='Access URL(s)') + database_ids = fields.One2many('base.remote.database', 'base_remote_server_id', string='Odoo Database(s)') + + def sync_custom_properties(self): + for prop in self.server_command_properties_ids: + prop._compute_property_value() diff --git a/base_remote_server_management/models/base_remote_url.py b/base_remote_server_management/models/base_remote_url.py new file mode 100644 index 0000000..3ad5abb --- /dev/null +++ b/base_remote_server_management/models/base_remote_url.py @@ -0,0 +1,26 @@ +# Copyright 2020 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import urllib + +from odoo import api, models, fields + + +class BaseRemoteUrl(models.Model): + _name = 'base.remote.url' + + name = fields.Char("Domain", required=True) + base_remote_server_id = fields.Many2one('base.remote.server', 'Server') + base_remote_database_id = fields.Many2one('base.remote.database', 'Database') + valid = fields.Boolean('URL Valid', compute='_compute_valid') + + @api.multi + def _compute_valid(self): + for url in self: + url.valid = False + try: + code = urllib.request.urlopen("http://%s" % url.name).getcode() + if code == 200: + url.valid = True + except Exception: + pass diff --git a/base_remote_server_management/models/server_command_properties.py b/base_remote_server_management/models/server_command_properties.py new file mode 100644 index 0000000..b8b46fe --- /dev/null +++ b/base_remote_server_management/models/server_command_properties.py @@ -0,0 +1,28 @@ +# Copyright 2020 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import paramiko + +from odoo import api, models, fields + + +class ServerCommandProperties(models.Model): + _name = 'server.command.properties' + + name = fields.Char("Property", required=True) + base_remote_server_id = fields.Many2one('base.remote.server', 'Server') + command = fields.Char('Command', required=True) + property_value = fields.Text('Value', compute='_compute_property_value', store=True) + + @api.multi + @api.depends('command') + def _compute_property_value(self): + for prop in self: + if prop.command: + ssh = paramiko.SSHClient() + key = paramiko.RSAKey.from_private_key_file(prop.base_remote_server_id.private_key_path) + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(prop.base_remote_server_id.server_ip, port=prop.base_remote_server_id.ssh_port, username=prop.base_remote_server_id.ssh_user, pkey=key) + _stdin, stdout, _stderr = ssh.exec_command(prop.command) + prop.property_value = stdout.read().decode('ascii').strip("\n") + ssh.close() diff --git a/base_remote_server_management/models/server_static_properties.py b/base_remote_server_management/models/server_static_properties.py new file mode 100644 index 0000000..5cba6ba --- /dev/null +++ b/base_remote_server_management/models/server_static_properties.py @@ -0,0 +1,12 @@ +# Copyright 2020 Quartile Limited +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import models, fields + + +class ServerStaticProperties(models.Model): + _name = 'server.static.properties' + + name = fields.Char("Property", required=True) + base_remote_server_id = fields.Many2one('base.remote.server', 'Server') + property_value = fields.Text('Value', required=True) diff --git a/base_remote_server_management/security/ir.model.access.csv b/base_remote_server_management/security/ir.model.access.csv new file mode 100644 index 0000000..72b065c --- /dev/null +++ b/base_remote_server_management/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_base_remote_database,access_base_remote_database,model_base_remote_database,base.group_user,1,1,1,1 +access_base_remote_server,access_base_remote_server,model_base_remote_server,base.group_user,1,1,1,1 +access_base_remote_url,access_base_remote_url,model_base_remote_url,base.group_user,1,1,1,1 +access_server_command_properties,access_server_command_properties,model_server_command_properties,base.group_user,1,1,1,1 +access_server_static_properties,access_server_static_properties,model_server_static_properties,base.group_user,1,1,1,1 diff --git a/base_remote_server_management/views/base_remote_server_views.xml b/base_remote_server_management/views/base_remote_server_views.xml new file mode 100644 index 0000000..2c53709 --- /dev/null +++ b/base_remote_server_management/views/base_remote_server_views.xml @@ -0,0 +1,104 @@ + + + + + + + + base.remote.server.tree + base.remote.server + + + + + + + + + + + + base.remote.server.form + base.remote.server + +
+
+
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + Remote Server Information + base.remote.server + form + tree,form + {} + + + + +
From 7044a6607da897f9c86e240d906a7140704e4d82 Mon Sep 17 00:00:00 2001 From: Aungkokolin1997 Date: Thu, 2 Nov 2023 15:12:48 +0630 Subject: [PATCH 2/6] [IMP] base_remote_server_managment: pre-commit stuff --- .../models/base_remote_database.py | 10 +- .../models/base_remote_server.py | 22 ++-- .../models/base_remote_url.py | 10 +- .../models/server_command_properties.py | 25 +++-- .../models/server_static_properties.py | 8 +- .../views/base_remote_server_views.xml | 102 ++++++++++++------ .../odoo/addons/base_remote_server_management | 1 + setup/base_remote_server_management/setup.py | 6 ++ 8 files changed, 124 insertions(+), 60 deletions(-) create mode 120000 setup/base_remote_server_management/odoo/addons/base_remote_server_management create mode 100644 setup/base_remote_server_management/setup.py diff --git a/base_remote_server_management/models/base_remote_database.py b/base_remote_server_management/models/base_remote_database.py index f57463e..bc77045 100644 --- a/base_remote_server_management/models/base_remote_database.py +++ b/base_remote_server_management/models/base_remote_database.py @@ -1,12 +1,14 @@ # Copyright 2020 Quartile Limited # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -from odoo import models, fields +from odoo import fields, models class BaseRemoteDatabase(models.Model): - _name = 'base.remote.database' + _name = "base.remote.database" name = fields.Char("Database Name", required=True) - base_remote_server_id = fields.Many2one('base.remote.server', 'Server') - server_url_ids = fields.One2many('base.remote.url', 'base_remote_database_id', string='URL(s)') + base_remote_server_id = fields.Many2one("base.remote.server", "Server") + server_url_ids = fields.One2many( + "base.remote.url", "base_remote_database_id", string="URL(s)" + ) diff --git a/base_remote_server_management/models/base_remote_server.py b/base_remote_server_management/models/base_remote_server.py index a974dd8..556b7ad 100644 --- a/base_remote_server_management/models/base_remote_server.py +++ b/base_remote_server_management/models/base_remote_server.py @@ -1,11 +1,11 @@ # Copyright 2020 Quartile Limited # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -from odoo import models, fields +from odoo import fields, models class BaseRemoteServer(models.Model): - _name = 'base.remote.server' + _name = "base.remote.server" name = fields.Char("Description/Usage", required=True) server_ip = fields.Char("IP", required=True) @@ -13,10 +13,20 @@ class BaseRemoteServer(models.Model): ssh_port = fields.Integer("SSH Port Number") private_key_path = fields.Char("Private Key Path", required=True) active = fields.Boolean("Active", default=True) - server_command_properties_ids = fields.One2many('server.command.properties', 'base_remote_server_id', string='Command Properties') - server_static_properties_ids = fields.One2many('server.static.properties', 'base_remote_server_id', string='Static Properties') - server_url_ids = fields.One2many('base.remote.url', 'base_remote_server_id', string='Access URL(s)') - database_ids = fields.One2many('base.remote.database', 'base_remote_server_id', string='Odoo Database(s)') + server_command_properties_ids = fields.One2many( + "server.command.properties", + "base_remote_server_id", + string="Command Properties", + ) + server_static_properties_ids = fields.One2many( + "server.static.properties", "base_remote_server_id", string="Static Properties" + ) + server_url_ids = fields.One2many( + "base.remote.url", "base_remote_server_id", string="Access URL(s)" + ) + database_ids = fields.One2many( + "base.remote.database", "base_remote_server_id", string="Odoo Database(s)" + ) def sync_custom_properties(self): for prop in self.server_command_properties_ids: diff --git a/base_remote_server_management/models/base_remote_url.py b/base_remote_server_management/models/base_remote_url.py index 3ad5abb..5a2ed25 100644 --- a/base_remote_server_management/models/base_remote_url.py +++ b/base_remote_server_management/models/base_remote_url.py @@ -3,16 +3,16 @@ import urllib -from odoo import api, models, fields +from odoo import api, fields, models class BaseRemoteUrl(models.Model): - _name = 'base.remote.url' + _name = "base.remote.url" name = fields.Char("Domain", required=True) - base_remote_server_id = fields.Many2one('base.remote.server', 'Server') - base_remote_database_id = fields.Many2one('base.remote.database', 'Database') - valid = fields.Boolean('URL Valid', compute='_compute_valid') + base_remote_server_id = fields.Many2one("base.remote.server", "Server") + base_remote_database_id = fields.Many2one("base.remote.database", "Database") + valid = fields.Boolean("URL Valid", compute="_compute_valid") @api.multi def _compute_valid(self): diff --git a/base_remote_server_management/models/server_command_properties.py b/base_remote_server_management/models/server_command_properties.py index b8b46fe..bdc1384 100644 --- a/base_remote_server_management/models/server_command_properties.py +++ b/base_remote_server_management/models/server_command_properties.py @@ -3,26 +3,33 @@ import paramiko -from odoo import api, models, fields +from odoo import api, fields, models class ServerCommandProperties(models.Model): - _name = 'server.command.properties' + _name = "server.command.properties" name = fields.Char("Property", required=True) - base_remote_server_id = fields.Many2one('base.remote.server', 'Server') - command = fields.Char('Command', required=True) - property_value = fields.Text('Value', compute='_compute_property_value', store=True) + base_remote_server_id = fields.Many2one("base.remote.server", "Server") + command = fields.Char("Command", required=True) + property_value = fields.Text("Value", compute="_compute_property_value", store=True) @api.multi - @api.depends('command') + @api.depends("command") def _compute_property_value(self): for prop in self: if prop.command: ssh = paramiko.SSHClient() - key = paramiko.RSAKey.from_private_key_file(prop.base_remote_server_id.private_key_path) + key = paramiko.RSAKey.from_private_key_file( + prop.base_remote_server_id.private_key_path + ) ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - ssh.connect(prop.base_remote_server_id.server_ip, port=prop.base_remote_server_id.ssh_port, username=prop.base_remote_server_id.ssh_user, pkey=key) + ssh.connect( + prop.base_remote_server_id.server_ip, + port=prop.base_remote_server_id.ssh_port, + username=prop.base_remote_server_id.ssh_user, + pkey=key, + ) _stdin, stdout, _stderr = ssh.exec_command(prop.command) - prop.property_value = stdout.read().decode('ascii').strip("\n") + prop.property_value = stdout.read().decode("ascii").strip("\n") ssh.close() diff --git a/base_remote_server_management/models/server_static_properties.py b/base_remote_server_management/models/server_static_properties.py index 5cba6ba..52d8640 100644 --- a/base_remote_server_management/models/server_static_properties.py +++ b/base_remote_server_management/models/server_static_properties.py @@ -1,12 +1,12 @@ # Copyright 2020 Quartile Limited # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -from odoo import models, fields +from odoo import fields, models class ServerStaticProperties(models.Model): - _name = 'server.static.properties' + _name = "server.static.properties" name = fields.Char("Property", required=True) - base_remote_server_id = fields.Many2one('base.remote.server', 'Server') - property_value = fields.Text('Value', required=True) + base_remote_server_id = fields.Many2one("base.remote.server", "Server") + property_value = fields.Text("Value", required=True) diff --git a/base_remote_server_management/views/base_remote_server_views.xml b/base_remote_server_management/views/base_remote_server_views.xml index 2c53709..2c6ed29 100644 --- a/base_remote_server_management/views/base_remote_server_views.xml +++ b/base_remote_server_management/views/base_remote_server_views.xml @@ -1,18 +1,23 @@ - + - - + + base.remote.server.tree base.remote.server - - - - + + + + @@ -23,24 +28,29 @@
-
- +
-
- - - - + + + + @@ -48,40 +58,62 @@ - + - + - - + + - + - + -