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.
101 lines
3.4 KiB
101 lines
3.4 KiB
# © 2015-2016 Therp BV <http://therp.nl>
|
|
# © 2015 Grupo ESOC Ingeniería de Servicios, S.L.U. - Jairo Llopis
|
|
# © 2017 Avoin.Systems - Miku Laitinen
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
import json
|
|
import logging
|
|
import os
|
|
try:
|
|
import psutil
|
|
except ImportError: # pragma: no cover
|
|
psutil = None
|
|
import urllib
|
|
from odoo import api, models
|
|
from odoo.tools.config import config
|
|
|
|
SEND_TIMEOUT = 60
|
|
|
|
|
|
class DeadMansSwitchClient(models.AbstractModel):
|
|
_name = 'dead.mans.switch.client'
|
|
_register = True
|
|
|
|
@api.model
|
|
def _get_data(self):
|
|
ram = 0
|
|
cpu = 0
|
|
if psutil:
|
|
process = psutil.Process(os.getpid())
|
|
# psutil changed its api through versions
|
|
processes = [process]
|
|
if config.get('workers') and process.parent: # pragma: no cover
|
|
if hasattr(process.parent, '__call__'):
|
|
process = process.parent()
|
|
else:
|
|
process = process.parent
|
|
if hasattr(process, 'children'):
|
|
processes += process.children(True)
|
|
elif hasattr(process, 'get_children'):
|
|
processes += process.get_children(True)
|
|
for process in processes:
|
|
if hasattr(process, 'memory_percent'):
|
|
ram += process.memory_percent()
|
|
else: # pragma: no cover
|
|
ram = None
|
|
if hasattr(process, 'cpu_percent'):
|
|
cpu += process.cpu_percent()
|
|
else: # pragma: no cover
|
|
cpu = None
|
|
user_count = 0
|
|
if 'bus.presence' in self.env.registry:
|
|
user_count = self.env['bus.presence'].search_count([
|
|
('status', '=', 'online'),
|
|
])
|
|
return {
|
|
'database_uuid': self.env['ir.config_parameter'].get_param(
|
|
'database.uuid'),
|
|
'cpu': cpu,
|
|
'ram': ram,
|
|
'user_count': user_count,
|
|
}
|
|
|
|
@api.model
|
|
def alive(self):
|
|
url = self.env['ir.config_parameter'].get_param(
|
|
'dead_mans_switch_client.url')
|
|
logger = logging.getLogger(__name__)
|
|
if not url:
|
|
logger.error('No server configured!')
|
|
return
|
|
timeout = self.env['ir.config_parameter'].get_param(
|
|
'dead_mans_switch_client.send_timeout', SEND_TIMEOUT)
|
|
data = self._get_data()
|
|
logger.debug('sending %s', data)
|
|
urllib.request.urlopen(
|
|
urllib.request.Request(
|
|
url=url,
|
|
data=json.dumps({
|
|
'jsonrpc': '2.0',
|
|
'method': 'call',
|
|
'params': data,
|
|
}).encode('utf-8'),
|
|
headers={
|
|
'Content-Type': 'application/json',
|
|
}),
|
|
timeout=timeout)
|
|
|
|
@api.model
|
|
def _install_default_url(self):
|
|
"""Set up a default URL."""
|
|
conf = self.env["ir.config_parameter"]
|
|
name = "dead_mans_switch_client.url"
|
|
param = conf.get_param(name)
|
|
|
|
if not param:
|
|
url = "{}/dead_mans_switch/alive".format(
|
|
conf.get_param(
|
|
"report.url",
|
|
conf.get_param(
|
|
"web.base.url",
|
|
"http://localhost")))
|
|
conf.set_param(name, url)
|