mirror of
https://github.com/bringout/oca-ocb-hw.git
synced 2026-04-19 07:42:01 +02:00
Initial commit: Hw packages
This commit is contained in:
commit
a9d00500da
161 changed files with 10506 additions and 0 deletions
148
odoo-bringout-oca-ocb-hw_drivers/hw_drivers/main.py
Normal file
148
odoo-bringout-oca-ocb-hw_drivers/hw_drivers/main.py
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
# -*- 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
|
||||
import subprocess
|
||||
from threading import Thread
|
||||
import time
|
||||
import urllib3
|
||||
|
||||
from odoo.addons.hw_drivers.tools import helpers
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
try:
|
||||
import schedule
|
||||
except ImportError:
|
||||
schedule = None
|
||||
_logger.warning('Could not import library schedule')
|
||||
|
||||
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(detailed_version=True),
|
||||
}
|
||||
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:
|
||||
_logger.exception('Could not reach configured server to send all IoT devices')
|
||||
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' and not helpers.get_odoo_server_url():
|
||||
self.migrate_config()
|
||||
|
||||
_logger.info("IoT Box Image version: %s", helpers.get_version(detailed_version=True))
|
||||
if platform.system() == 'Linux' and helpers.get_odoo_server_url():
|
||||
helpers.check_git_branch()
|
||||
helpers.generate_password()
|
||||
is_certificate_ok, certificate_details = helpers.get_certificate_status()
|
||||
if not is_certificate_ok:
|
||||
_logger.warning("An error happened when trying to get the HTTPS certificate: %s",
|
||||
certificate_details)
|
||||
|
||||
# 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():
|
||||
try:
|
||||
i = interface()
|
||||
i.daemon = True
|
||||
i.start()
|
||||
except Exception:
|
||||
_logger.exception("Interface %s could not be started", str(interface))
|
||||
|
||||
# Set scheduled actions
|
||||
schedule and schedule.every().day.at("00:00").do(helpers.get_certificate_status)
|
||||
|
||||
# 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)
|
||||
schedule and schedule.run_pending()
|
||||
except Exception:
|
||||
# No matter what goes wrong, the Manager loop needs to keep running
|
||||
_logger.exception("Manager loop unexpected error")
|
||||
|
||||
def migrate_config(self):
|
||||
"""
|
||||
This is a workaround for new IoT box images (>=24.10) not working correctly after
|
||||
checking out a v16 database. It transforms the new odoo.conf settings into their
|
||||
equivalent config files.
|
||||
"""
|
||||
with helpers.writable():
|
||||
subprocess.run(
|
||||
['/home/pi/odoo/addons/point_of_sale/tools/posbox/configuration/migrate_config.sh'], check=True
|
||||
)
|
||||
|
||||
# Must be started from main thread
|
||||
if DBusGMainLoop:
|
||||
DBusGMainLoop(set_as_default=True)
|
||||
|
||||
manager = Manager()
|
||||
manager.daemon = True
|
||||
manager.start()
|
||||
Loading…
Add table
Add a link
Reference in a new issue