Currently it is only possible to run the modules for the IoT Box on Raspios. The modifications brought by this commit brings the possibility that the various hw_* modules can be executed whatever the OS of the hardware (Linux or Windows). If the modules should be versioned according to the OS, the file will be renamed so that the end of the file includes *_L (for linux) or *_W (for windows) closes odoo/odoo#107350 X-original-commit: b7b8809ea8b7fe4ac8b24f43fe3f3a5e38a66696 Related: odoo/enterprise#34713 Signed-off-by: Quentin Lejeune (qle) <qle@odoo.com>
117 lines
3.9 KiB
Python
117 lines
3.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from traceback import format_exc
|
|
import json
|
|
import platform
|
|
import logging
|
|
import socket
|
|
from threading import Thread
|
|
import time
|
|
import urllib3
|
|
|
|
from odoo.addons.hw_drivers.tools import helpers
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
try:
|
|
from dbus.mainloop.glib import DBusGMainLoop
|
|
except ImportError:
|
|
DBusGMainLoop = None
|
|
_logger.error('Could not import library dbus')
|
|
|
|
drivers = []
|
|
interfaces = {}
|
|
iot_devices = {}
|
|
|
|
|
|
class Manager(Thread):
|
|
def send_alldevices(self):
|
|
"""
|
|
This method send IoT Box and devices informations to Odoo database
|
|
"""
|
|
server = helpers.get_odoo_server_url()
|
|
if server:
|
|
subject = helpers.read_file_first_line('odoo-subject.conf')
|
|
if subject:
|
|
domain = helpers.get_ip().replace('.', '-') + subject.strip('*')
|
|
else:
|
|
domain = helpers.get_ip()
|
|
iot_box = {
|
|
'name': socket.gethostname(),
|
|
'identifier': helpers.get_mac_address(),
|
|
'ip': domain,
|
|
'token': helpers.get_token(),
|
|
'version': helpers.get_version(),
|
|
}
|
|
devices_list = {}
|
|
for device in iot_devices:
|
|
identifier = iot_devices[device].device_identifier
|
|
devices_list[identifier] = {
|
|
'name': iot_devices[device].device_name,
|
|
'type': iot_devices[device].device_type,
|
|
'manufacturer': iot_devices[device].device_manufacturer,
|
|
'connection': iot_devices[device].device_connection,
|
|
}
|
|
data = {'params': {'iot_box': iot_box, 'devices': devices_list,}}
|
|
# disable certifiacte verification
|
|
urllib3.disable_warnings()
|
|
http = urllib3.PoolManager(cert_reqs='CERT_NONE')
|
|
try:
|
|
http.request(
|
|
'POST',
|
|
server + "/iot/setup",
|
|
body=json.dumps(data).encode('utf8'),
|
|
headers={
|
|
'Content-type': 'application/json',
|
|
'Accept': 'text/plain',
|
|
},
|
|
)
|
|
except Exception as e:
|
|
_logger.error('Could not reach configured server')
|
|
_logger.error('A error encountered : %s ' % e)
|
|
else:
|
|
_logger.warning('Odoo server not set')
|
|
|
|
def run(self):
|
|
"""
|
|
Thread that will load interfaces and drivers and contact the odoo server with the updates
|
|
"""
|
|
|
|
helpers.start_nginx_server()
|
|
if platform.system() == 'Linux':
|
|
helpers.check_git_branch()
|
|
helpers.check_certificate()
|
|
|
|
# We first add the IoT Box to the connected DB because IoT handlers cannot be downloaded if
|
|
# the identifier of the Box is not found in the DB. So add the Box to the DB.
|
|
self.send_alldevices()
|
|
helpers.download_iot_handlers()
|
|
helpers.load_iot_handlers()
|
|
|
|
# Start the interfaces
|
|
for interface in interfaces.values():
|
|
i = interface()
|
|
i.daemon = True
|
|
i.start()
|
|
|
|
# Check every 3 secondes if the list of connected devices has changed and send the updated
|
|
# list to the connected DB.
|
|
self.previous_iot_devices = []
|
|
while 1:
|
|
try:
|
|
if iot_devices != self.previous_iot_devices:
|
|
self.previous_iot_devices = iot_devices.copy()
|
|
self.send_alldevices()
|
|
time.sleep(3)
|
|
except Exception:
|
|
# No matter what goes wrong, the Manager loop needs to keep running
|
|
_logger.error(format_exc())
|
|
|
|
# Must be started from main thread
|
|
if DBusGMainLoop:
|
|
DBusGMainLoop(set_as_default=True)
|
|
|
|
manager = Manager()
|
|
manager.daemon = True
|
|
manager.start()
|