You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.4 KiB
49 lines
1.4 KiB
# Copyright 2018 Creu Blanca
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
|
from odoo import api, models, fields
|
|
import socket
|
|
import logging
|
|
|
|
|
|
class ResRemote(models.Model):
|
|
_name = 'res.remote'
|
|
_description = 'Remotes'
|
|
|
|
name = fields.Char(
|
|
required=True,
|
|
string='Hostname',
|
|
index=True,
|
|
readonly=True
|
|
)
|
|
ip = fields.Char(required=True)
|
|
in_network = fields.Boolean(
|
|
required=True,
|
|
help='Shows if the remote can be found through the socket'
|
|
)
|
|
|
|
_sql_constraints = [
|
|
('name_unique', 'unique(name)', 'Hostname must be unique')
|
|
]
|
|
|
|
@api.model
|
|
def _create_vals(self, addr, hostname):
|
|
return {
|
|
'name': hostname or addr,
|
|
'ip': addr,
|
|
'in_network': bool(hostname),
|
|
}
|
|
|
|
@api.model
|
|
def _get_remote(self, addr):
|
|
try:
|
|
hostname, alias, ips = socket.gethostbyaddr(addr)
|
|
except socket.herror:
|
|
logging.warning('Remote with ip %s could not be found' % addr)
|
|
hostname = False
|
|
remote = self.search([('name', '=ilike', hostname or addr)])
|
|
if not remote:
|
|
remote = self.create(self._create_vals(addr, hostname))
|
|
if remote.ip != addr:
|
|
# IPs can change through time, but hostname should not change
|
|
remote.write({'ip': addr})
|
|
return remote
|