From 5eeae30fd32c800586ac591e8c663524eb67d8c8 Mon Sep 17 00:00:00 2001
From: lejeune quentin
Date: Thu, 15 Jun 2023 09:41:35 +0000
Subject: [PATCH] [FIX] point_of_sale: Update raspberry pi os for iot use
With this update the version of python goes to 3.9.2
In addition, a unique password system has been put in place
closes odoo/odoo#127975
X-original-commit: a0feb285ff2ff4a9b82f87ff5abefb307847f25a
Signed-off-by: Quentin Lejeune (qle)
---
addons/hw_drivers/tools/helpers.py | 17 +++++++++++++++++
addons/hw_posbox_homepage/controllers/main.py | 5 +++++
.../views/remote_connect.html | 14 ++++++++++++++
.../tools/posbox/configuration/rename_iot.sh | 0
.../etc/init_posbox_image.sh | 15 +++++++++++----
.../tools/posbox/posbox_create_image.sh | 13 +++++++------
6 files changed, 54 insertions(+), 10 deletions(-)
mode change 100644 => 100755 addons/point_of_sale/tools/posbox/configuration/rename_iot.sh
diff --git a/addons/hw_drivers/tools/helpers.py b/addons/hw_drivers/tools/helpers.py
index ebfe3d7d50a..9b8b4600c76 100644
--- a/addons/hw_drivers/tools/helpers.py
+++ b/addons/hw_drivers/tools/helpers.py
@@ -19,6 +19,8 @@ from threading import Thread
import time
import contextlib
import requests
+import crypt
+import secrets
from odoo import _, http, service
from odoo.tools.func import lazy_property
@@ -188,6 +190,21 @@ def save_conf_server(url, token, db_uuid, enterprise_code):
write_file('odoo-db-uuid.conf', db_uuid or '')
write_file('odoo-enterprise-code.conf', enterprise_code or '')
+def generate_password():
+ """
+ Generate an unique code to secure raspberry pi
+ """
+ alphabet = 'abcdefghijkmnpqrstuvwxyz23456789'
+ password = ''.join(secrets.choice(alphabet) for i in range(12))
+ shadow_password = crypt.crypt(password, crypt.mksalt())
+ subprocess.call(('sudo', 'usermod', '-p', shadow_password, 'pi'))
+
+ with writable():
+ subprocess.call(('sudo', 'cp', '/etc/shadow', '/root_bypass_ramdisks/etc/shadow'))
+
+ return password
+
+
def get_certificate_status(is_first=True):
"""
Will get the HTTPS certificate details if present. Will load the certificate if missing.
diff --git a/addons/hw_posbox_homepage/controllers/main.py b/addons/hw_posbox_homepage/controllers/main.py
index 7ee8e5cee60..af9e79acd74 100644
--- a/addons/hw_posbox_homepage/controllers/main.py
+++ b/addons/hw_posbox_homepage/controllers/main.py
@@ -253,6 +253,11 @@ class IoTboxHomepage(Home):
'loading_message': 'Configure Domain Server'
})
+ # Get password
+ @http.route('/hw_posbox_homepage/password', type='json', auth='none', method=['POST'])
+ def view_password(self):
+ return helpers.generate_password()
+
@http.route('/remote_connect', type='http', auth='none', cors='*')
def remote_connect(self):
"""
diff --git a/addons/hw_posbox_homepage/views/remote_connect.html b/addons/hw_posbox_homepage/views/remote_connect.html
index ab9628ec36a..711b0c540c8 100644
--- a/addons/hw_posbox_homepage/views/remote_connect.html
+++ b/addons/hw_posbox_homepage/views/remote_connect.html
@@ -26,6 +26,18 @@
}
});
});
+ $(function() {
+ $('.view-password').click(function() {
+ $.ajax({
+ url:'/hw_posbox_homepage/password',
+ type: 'post',
+ contentType: 'application/json',
+ data: JSON.stringify({ params: {action: 'view'} }),
+ }).done(function(password) {
+ $('.password').val(password['result']);
+ });
+ });
+ });
{% endblock %}
{% block content %}
@@ -36,6 +48,8 @@
you trust.
diff --git a/addons/point_of_sale/tools/posbox/configuration/rename_iot.sh b/addons/point_of_sale/tools/posbox/configuration/rename_iot.sh
old mode 100644
new mode 100755
diff --git a/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init_posbox_image.sh b/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init_posbox_image.sh
index ba30833e798..ff3d89f444f 100755
--- a/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init_posbox_image.sh
+++ b/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init_posbox_image.sh
@@ -25,6 +25,11 @@ apt-get update && apt-get -y upgrade
# Do not be too fast to upgrade to more recent firmware and kernel than 4.38
# Firmware 4.44 seems to prevent the LED mechanism from working
+# At the first start it is necessary to configure a password
+# This will be modified by a unique password on the first start of Odoo
+password="$(openssl rand -base64 32)"
+echo "pi:${password}" | chpasswd
+
PKGS_TO_INSTALL="
console-data \
cups \
@@ -45,13 +50,15 @@ PKGS_TO_INSTALL="
nginx-full \
openbox \
printer-driver-all \
- python-cups \
python3 \
+ python3-cups \
python3-babel \
python3-dateutil \
+ python3-dbus \
python3-decorator \
python3-dev \
python3-docutils \
+ python3-geoip2 \
python3-jinja2 \
python3-ldap \
python3-libsass \
@@ -99,14 +106,15 @@ rm -rfv /usr/share/doc
# Even in stretch, we had an error with langid (but worked otherwise)
# We fixe the version of evdev to 1.2.0 because in 1.3.0 we have a RuntimeError in 'get_event_loop()'
PIP_TO_INSTALL="
- evdev==1.2.0 \
+ evdev==1.6.0 \
gatt \
polib \
pycups \
pyusb \
v4l2 \
pysmb==1.2.9.1 \
- cryptocode==0.1"
+ cryptocode==0.1 \
+ rjsmin==1.1.0"
pip3 install ${PIP_TO_INSTALL}
@@ -142,7 +150,6 @@ systemctl disable dphys-swapfile.service
systemctl enable ssh
systemctl set-default graphical.target
systemctl disable getty@tty1.service
-systemctl enable autologin@.service
systemctl disable systemd-timesyncd.service
systemctl unmask hostapd.service
systemctl disable hostapd.service
diff --git a/addons/point_of_sale/tools/posbox/posbox_create_image.sh b/addons/point_of_sale/tools/posbox/posbox_create_image.sh
index 2c4c746b4f2..b4337f9431c 100755
--- a/addons/point_of_sale/tools/posbox/posbox_create_image.sh
+++ b/addons/point_of_sale/tools/posbox/posbox_create_image.sh
@@ -29,12 +29,12 @@ MOUNT_POINT="${__dir}/root_mount"
OVERWRITE_FILES_BEFORE_INIT_DIR="${__dir}/overwrite_before_init"
OVERWRITE_FILES_AFTER_INIT_DIR="${__dir}/overwrite_after_init"
VERSION=16.0
-VERSION_IOTBOX=22.11
+VERSION_IOTBOX=23.07
REPO=https://github.com/odoo/odoo.git
if ! file_exists *raspios*.img ; then
- wget 'https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-lite.zip' -O raspios.img.zip
- unzip raspios.img.zip
+ wget 'https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2023-05-03/2023-05-03-raspios-bullseye-armhf-lite.img.xz' -O raspios.img.xz
+ unxz --verbose raspios.img.xz
fi
RASPIOS=$(echo *raspios*.img)
@@ -76,10 +76,9 @@ dd if=/dev/zero bs=1M count=2048 status=progress >> iotbox.img
echo "Fdisking"
SECTORS_BOOT_START=$(sudo fdisk -l iotbox.img | tail -n 2 | awk 'NR==1 {print $2}')
-SECTORS_BOOT_END=$((SECTORS_BOOT_START + 1048576)) # sectors to have a partition of ~512Mo
+SECTORS_BOOT_END=$((SECTORS_BOOT_START + 1056767)) # sectors to have a partition of ~512Mo
SECTORS_ROOT_START=$((SECTORS_BOOT_END + 1))
-START_OF_ROOT_PARTITION=$(fdisk -l iotbox.img | tail -n 1 | awk '{print $2}')
(echo 'p'; # print
echo 'd'; # delete
echo '2'; # number 2
@@ -103,12 +102,14 @@ LOOP_RASPIOS=$(kpartx -avs "${RASPIOS}")
LOOP_RASPIOS_ROOT=$(echo "${LOOP_RASPIOS}" | tail -n 1 | awk '{print $3}')
LOOP_RASPIOS_PATH="/dev/${LOOP_RASPIOS_ROOT::-2}"
LOOP_RASPIOS_ROOT="/dev/mapper/${LOOP_RASPIOS_ROOT}"
+LOOP_RASPIOS_BOOT=$(echo "${LOOP_RASPIOS}" | head -n 1 | awk '{print $3}')
+LOOP_RASPIOS_BOOT="/dev/mapper/${LOOP_RASPIOS_BOOT}"
LOOP_IOT=$(kpartx -avs iotbox.img)
LOOP_IOT_ROOT=$(echo "${LOOP_IOT}" | tail -n 1 | awk '{print $3}')
LOOP_IOT_PATH="/dev/${LOOP_IOT_ROOT::-2}"
LOOP_IOT_ROOT="/dev/mapper/${LOOP_IOT_ROOT}"
-LOOP_IOT_BOOT=$(echo "${LOOP_IOT}" | tail -n 2 | awk 'NR==1 {print $3}')
+LOOP_IOT_BOOT=$(echo "${LOOP_IOT}" | head -n 1 | awk 'NR==1 {print $3}')
LOOP_IOT_BOOT="/dev/mapper/${LOOP_IOT_BOOT}"
mkfs.ext4 -v "${LOOP_IOT_ROOT}"