Update to support Raspberry Pi Bookworm and Node.js V20 (#36)

* Switch to Node.js V20

* Failsafe for updating using the wrong branch

* Update to Node.js v20 and support for RPi OS Bookworm

* Update to Node.js V20

* Update to Node.js V20

* Update install.sh

* Update install.sh

* Update install.sh

* Update install.sh

* Update package.json

* Update package-lock.json
This commit is contained in:
Jaap van Ekris 2024-02-06 16:05:59 +01:00 committed by GitHub
parent da281043d6
commit cf80aa77d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 6811 additions and 4214 deletions

View File

@ -19,7 +19,7 @@ jobs:
strategy: strategy:
matrix: matrix:
node-version: [14.x, 18.x] node-version: [20.x]
steps: steps:
- name: Checkout repository - name: Checkout repository

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# #
# Open Rowing Monitor, https://github.com/laberning/openrowingmonitor # Open Rowing Monitor, https://github.com/JaapvanEkris/openrowingmonitor
# #
# Update script for Open Rowing Monitor, use at your own risk! # Update script for Open Rowing Monitor, use at your own risk!
# #
@ -97,7 +97,7 @@ switch_branch() {
CURRENT_DIR=$(pwd) CURRENT_DIR=$(pwd)
SCRIPT_DIR="$( cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd )" SCRIPT_DIR="$( cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd )"
INSTALL_DIR="$(dirname "$SCRIPT_DIR")" INSTALL_DIR="$(dirname "$SCRIPT_DIR")"
GIT_REMOTE="https://github.com/laberning/openrowingmonitor.git" GIT_REMOTE="https://github.com/JaapvanEkris/openrowingmonitor.git"
cd $INSTALL_DIR cd $INSTALL_DIR
@ -117,6 +117,15 @@ if getopts "b:" arg; then
cancel "Branch \"$OPTARG\" does not exist in the repository, can not switch" cancel "Branch \"$OPTARG\" does not exist in the repository, can not switch"
fi fi
ARCHITECTURE=$(uname -m)
if [[ $ARCHITECTURE == "armv6l" ]] && [[ $OPTARG != "v1beta_updates_Pi_Zero_W" ]]; then
cancel "Branch \"$OPTARG\" doesn't work on a Pi Zero W, please use branch 'v1beta_updates_Pi_Zero_W'"
fi
if [[ $ARCHITECTURE != "armv6l" ]] && [[ $OPTARG == "v1beta_updates_Pi_Zero_W" ]]; then
cancel "Branch \"$OPTARG\" is a legacy version intended for the Pi Zero W, please use branch 'v1beta_updates' or similar"
fi
if ask "Do you want to switch from branch \"$CURRENT_BRANCH\" to branch \"$OPTARG\"?" Y; then if ask "Do you want to switch from branch \"$CURRENT_BRANCH\" to branch \"$OPTARG\"?" Y; then
print "Switching to branch \"$OPTARG\"..." print "Switching to branch \"$OPTARG\"..."
CURRENT_BRANCH=$OPTARG CURRENT_BRANCH=$OPTARG
@ -124,10 +133,16 @@ if getopts "b:" arg; then
else else
cancel "Stopping update - please run without -b parameter to do a regular update" cancel "Stopping update - please run without -b parameter to do a regular update"
fi fi
else else
print "Checking for new version..." print "Checking for new version..."
REMOTE_VERSION=$(git ls-remote $GIT_REMOTE refs/heads/$CURRENT_BRANCH | awk '{print $1;}') REMOTE_VERSION=$(git ls-remote $GIT_REMOTE refs/heads/$CURRENT_BRANCH | awk '{print $1;}')
ARCHITECTURE=$(uname -m)
if [[ $ARCHITECTURE == "armv6l" ]] && [[ $CURRENT_BRANCH != "v1beta_updates_Pi_Zero_W" ]]; then
cancel "Branch \"$OPTARG\" doesn't work on a Pi Zero W, please use branch 'v1beta_updates_Pi_Zero_W'"
fi
if [ "$LOCAL_VERSION" = "$REMOTE_VERSION" ]; then if [ "$LOCAL_VERSION" = "$REMOTE_VERSION" ]; then
print "You are using the latest version of Open Rowing Monitor from branch \"$CURRENT_BRANCH\"." print "You are using the latest version of Open Rowing Monitor from branch \"$CURRENT_BRANCH\"."
else else

View File

@ -51,16 +51,28 @@ ask() {
CURRENT_DIR=$(pwd) CURRENT_DIR=$(pwd)
INSTALL_DIR="/opt/openrowingmonitor" INSTALL_DIR="/opt/openrowingmonitor"
GIT_REMOTE="https://github.com/JaapvanEkris/openrowingmonitor.git" GIT_REMOTE="https://github.com/JaapvanEkris/openrowingmonitor.git"
BRANCH="v1beta_updates"
print "This script will set up Open Rowing Monitor on one of the following devices" print "This script will set up Open Rowing Monitor on one of the following devices"
print " Raspberry Pi Zero W or WH"
print " Raspberry Pi Zero 2 W or WH" print " Raspberry Pi Zero 2 W or WH"
print " Raspberry Pi 3 Model A+, B or B+" print " Raspberry Pi 3 Model A+, B or B+"
print " Raspberry Pi 4 Model B" print " Raspberry Pi 4 Model B"
print " Raspberry Pi 5"
print print
print "You should only run this script on a SD Card that contains Raspberry Pi OS (Lite)" print "You should only run this script on a SD Card that contains Raspberry Pi OS (Lite)"
print "and does not contain any important data." print "and does not contain any important data."
ARCHITECTURE=$(uname -m)
if [[ $ARCHITECTURE == "armv6l" ]];
then
print
print "You are running a system with ARM v6 architecture (Raspberry Pi Zero W)."
print "Support for this hardware configuration has been discontinued due to package conflicts beyond our control."
print "Your cheapest alternative for the current active branch is the Raspberry Pi Zero 2W"
print "A separate legacy branch can be found at https://github.com/JaapvanEkris/openrowingmonitor/tree/v1beta__Pi_Zero_W"
exit 1
fi
if [[ -f "/proc/device-tree/model" ]]; then if [[ -f "/proc/device-tree/model" ]]; then
MODEL=$(tr -d '\0' < /proc/device-tree/model) MODEL=$(tr -d '\0' < /proc/device-tree/model)
else else
@ -70,19 +82,13 @@ fi
if [[ $MODEL != Raspberry* ]]; then if [[ $MODEL != Raspberry* ]]; then
print print
cancel "This script currently only works on Raspberry Pi OS, you will have to do a manual installation." cancel "This script currently only works on Raspberry Pi OS, you will have to do a manual installation."
fi
VERSION=$(grep -oP '(?<=^VERSION=).+' /etc/os-release | tr -d '"')
if [[ $VERSION == "12 (bookworm)" ]]; then
print
print "Error: So far this install script is not capable of installing on Raspberry Pi OS 12 (bookworm)."
print "Please use Raspberry Pi 11 (bullseye), which can be installed via the Raspberry Manager via the 'Raspberry Pi OS (other)' option, under the Legacy versions"
exit 1 exit 1
fi fi
if [[ $VERSION != "10 (buster)" ]] && [[ $VERSION != "11 (bullseye)" ]]; then VERSION=$(grep -oP '(?<=^VERSION=).+' /etc/os-release | tr -d '"')
if [[ $VERSION != "10 (buster)" ]] && [[ $VERSION != "11 (bullseye)" ]] && [[ $VERSION != "12 (bookworm)" ]]; then
print print
print "Warning: So far this install script has only been tested with Raspberry Pi OS 10 (buster), 11 (bullseye)" print "Warning: So far this install script has only been tested with Raspberry Pi OS 10 (buster), 11 (bullseye) and 12 (bookworm)"
if ! ask "You are running Raspberry Pi OS $VERSION, are you sure that you want to continue?" N; then if ! ask "You are running Raspberry Pi OS $VERSION, are you sure that you want to continue?" N; then
exit 1 exit 1
fi fi
@ -127,37 +133,12 @@ sudo apt-get -y install pigpio
sudo systemctl mask pigpiod.service sudo systemctl mask pigpiod.service
print print
ARCHITECTURE=$(uname -m)
if [[ $ARCHITECTURE == "armv6l" ]];
then
print "You are running a system with ARM v6 architecture. Official support for Node.js has been discontinued"
print "for ARM v6."
print "Due to package conflicts, support for this version of OpenRowingMonitor will cease in April 2025"
print
print "Installing experimental unofficial build of Node.js..."
# we stick to node 14 as there are problem with WebAssembly on node 16 on the armv6l architecture
NODEJS_VERSION=v14.18.3
sudo rm -rf /opt/nodejs
sudo mkdir -p /opt/nodejs
sudo curl https://unofficial-builds.nodejs.org/download/release/$NODEJS_VERSION/node-$NODEJS_VERSION-linux-armv6l.tar.gz | sudo tar -xz --strip 1 -C /opt/nodejs/
sudo ln -sfn /opt/nodejs/bin/node /usr/bin/node
sudo ln -sfn /opt/nodejs/bin/node /usr/sbin/node
sudo ln -sfn /opt/nodejs/bin/node /sbin/node
sudo ln -sfn /opt/nodejs/bin/node /usr/local/bin/node
sudo ln -sfn /opt/nodejs/bin/npm /usr/bin/npm
sudo ln -sfn /opt/nodejs/bin/npm /usr/sbin/npm
sudo ln -sfn /opt/nodejs/bin/npm /sbin/npm
sudo ln -sfn /opt/nodejs/bin/npm /usr/local/bin/npm
else
print "Installing Node.js..." print "Installing Node.js..."
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs sudo apt-get install -y nodejs
fi
print print
print "Installing Open Rowing Monitor..." print "Installing Open Rowing Monitor, branch $BRANCH..."
if ! [[ -d "${INSTALL_DIR}" ]]; then if ! [[ -d "${INSTALL_DIR}" ]]; then
sudo mkdir -p $INSTALL_DIR sudo mkdir -p $INSTALL_DIR
@ -168,24 +149,18 @@ cd $INSTALL_DIR
# get project code from repository # get project code from repository
sudo git init -q sudo git init -q
# older versions of git would use 'master' instead of 'main' for the default branch # older versions of git would use 'master' instead of 'main' for the default branch
sudo git checkout -q -b v1beta_updates sudo git checkout -q -b $BRANCH
sudo git config remote.origin.url $GIT_REMOTE sudo git config remote.origin.url $GIT_REMOTE
sudo git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/* sudo git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
# prevent altering line endings # prevent altering line endings
sudo git config core.autocrlf false sudo git config core.autocrlf false
sudo git fetch --force origin sudo git fetch --force origin
sudo git fetch --force --tags origin sudo git fetch --force --tags origin
sudo git reset --hard origin/v1beta_updates sudo git reset --hard origin/$BRANCH
# add bin directory to the system path # add bin directory to the system path
echo "export PATH=\"\$PATH:$INSTALL_DIR/bin\"" >> ~/.bashrc echo "export PATH=\"\$PATH:$INSTALL_DIR/bin\"" >> ~/.bashrc
# otherwise node-gyp would fail while building the system dependencies
# On newer nodejs versions (> Node 16) we solve this via the .npmrc file
if [[ $ARCHITECTURE == "armv6l" ]]; then
sudo npm config set user 0
fi
print print
print "Downloading and compiling Runtime dependencies..." print "Downloading and compiling Runtime dependencies..."
sudo npm ci sudo npm ci
@ -223,6 +198,7 @@ fi
if $INIT_GUI; then if $INIT_GUI; then
print print
print "Installing Graphical User Interface..." print "Installing Graphical User Interface..."
if [[ $VERSION == "10 (buster)" ]] || [[ $VERSION == "11 (bullseye)" ]]; then
sudo apt-get -y install --no-install-recommends xserver-xorg xserver-xorg-legacy x11-xserver-utils xinit openbox chromium-browser sudo apt-get -y install --no-install-recommends xserver-xorg xserver-xorg-legacy x11-xserver-utils xinit openbox chromium-browser
sudo gpasswd -a pi tty sudo gpasswd -a pi tty
sudo sed -i 's/allowed_users=console/allowed_users=anybody\nneeds_root_rights=yes/' /etc/X11/Xwrapper.config sudo sed -i 's/allowed_users=console/allowed_users=anybody\nneeds_root_rights=yes/' /etc/X11/Xwrapper.config
@ -231,20 +207,33 @@ if $INIT_GUI; then
sudo systemctl enable webbrowserkiosk sudo systemctl enable webbrowserkiosk
sudo systemctl restart webbrowserkiosk sudo systemctl restart webbrowserkiosk
print "sudo systemctl status webbrowserkiosk" print "sudo systemctl status webbrowserkiosk"
sudo systemctl status webbrowserkiosk sudo systemctl status webbrowserkiosk --no-pager
else
# This currently is a copy of the bullseye install, as Bookworm's Wayland install is twice as big as it still includes the X11 server
# When we can install Wayland in a normal way, this will change as Wayland has a better kiosk mode
sudo apt-get -y install --no-install-recommends xserver-xorg xserver-xorg-legacy x11-xserver-utils xinit openbox chromium-browser
sudo gpasswd -a pi tty
sudo sed -i 's/allowed_users=console/allowed_users=anybody\nneeds_root_rights=yes/' /etc/X11/Xwrapper.config
sudo cp install/webbrowserkiosk.service /lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable webbrowserkiosk
sudo systemctl restart webbrowserkiosk
print "sudo systemctl status webbrowserkiosk"
sudo systemctl status webbrowserkiosk --no-pager
fi
print print
print "Installation of Graphical User Interface finished." print "Installation of Graphical User Interface finished."
print "If the screen resolution or the screen borders are not correct, run 'sudo raspi-config' and modify the display options." print "If the screen resolution or the screen borders are not correct, run 'sudo raspi-config' and modify the display options."
fi fi
cd $CURRENT_DIR
print print
print "sudo systemctl status openrowingmonitor" print "sudo systemctl status openrowingmonitor"
sudo systemctl status openrowingmonitor sudo systemctl status openrowingmonitor --no-pager
print print
print "Installation of Open Rowing Monitor finished." print "Installation of Open Rowing Monitor finished."
print "Open Rowing Monitor should now be up and running." print "Open Rowing Monitor should now be up and running."
print "You can now adjust the configuration in $INSTALL_DIR/config/config.js either via ssh or via the network share" print "You can now adjust the configuration in $INSTALL_DIR/config/config.js either via ssh or via the network share"
print print
print "Please reboot the device for all features and settings to take effect." print "Please reboot the device for all features and settings to take effect."
cd $CURRENT_DIR

10792
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,7 @@
}, },
"type": "module", "type": "module",
"engines": { "engines": {
"node": ">=14" "node": ">=18"
}, },
"files": [ "files": [
"*", "*",
@ -30,9 +30,12 @@
"simple-git-hooks": { "simple-git-hooks": {
"pre-commit": "npm run lint && npm test" "pre-commit": "npm run lint && npm test"
}, },
"//fix1Comment": "We install lit@2.8.0 as lit@3.0.0 breaks the webpage displaying metrics",
"//fix2Comment": "We hold back bleno, bluetooth-hci-socket and noble, as upgrading destroys HRM compatibility",
"dependencies": { "dependencies": {
"@abandonware/bleno": "^0.6.1", "@abandonware/bleno": "^0.5.1-4",
"@abandonware/noble": "^1.9.2-23", "@abandonware/bluetooth-hci-socket": "^0.5.3-7",
"@abandonware/noble": "^1.9.2-15",
"chart.js": "^4.4.1", "chart.js": "^4.4.1",
"chartjs-plugin-datalabels": "^2.2.0", "chartjs-plugin-datalabels": "^2.2.0",
"finalhandler": "^1.2.0", "finalhandler": "^1.2.0",
@ -46,38 +49,32 @@
"ws": "^8.16.0", "ws": "^8.16.0",
"xml2js": "^0.6.2" "xml2js": "^0.6.2"
}, },
"optionalDependencies": { "//fix3Comment": "We list node-gyp@10.0.1 as an explicit dev dependency as omitting it results in node-gyp@7.1.2 being installed, which breaks the build on Node.js v20",
"@abandonware/bluetooth-hci-socket": "^0.5.3-10" "//fix4Comment": "We stick with rollup@2.79.1 and rollup-plugin-summary@1.4.3 as rollup@3.0.0 and rollup-plugin-summary@2.0.0 break the install process",
},
"//fix2Comment": "a hacky fix to not install the optional dependency xpc-connect which has a security issue",
"overrides": {
"@abandonware/bleno": {
"xpc-connect@": "npm:debug"
}
},
"devDependencies": { "devDependencies": {
"@babel/eslint-parser": "7.17.0", "@babel/eslint-parser": "^7.23.10",
"@babel/plugin-proposal-decorators": "7.17.2", "@babel/plugin-proposal-decorators": "^7.23.9",
"@babel/preset-env": "7.16.11", "@babel/preset-env": "^7.23.9",
"@rollup/plugin-babel": "5.3.0", "@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-commonjs": "21.0.1", "@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-node-resolve": "13.1.3", "@rollup/plugin-node-resolve": "^15.2.3",
"@snowpack/plugin-babel": "2.1.7", "@snowpack/plugin-babel": "2.1.7",
"@web/rollup-plugin-html": "1.10.1", "@web/rollup-plugin-html": "^2.1.2",
"axios": "0.25.0", "axios": "^1.6.7",
"eslint": "8.9.0", "eslint": "^8.56.0",
"eslint-config-standard": "17.0.0-0", "eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "2.25.4", "eslint-plugin-import": "^2.29.1",
"eslint-plugin-lit": "1.6.1", "eslint-plugin-lit": "^1.11.0",
"eslint-plugin-n": "14.0.0", "eslint-plugin-n": "^16.6.2",
"eslint-plugin-promise": "6.0.0", "eslint-plugin-promise": "^6.1.1",
"eslint-plugin-wc": "1.3.2", "eslint-plugin-wc": "^2.0.4",
"http2-proxy": "5.0.53", "http2-proxy": "5.0.53",
"markdownlint-cli2": "0.4.0", "markdownlint-cli2": "^0.12.1",
"node-gyp": "^10.0.1",
"nodemon": "^3.0.3", "nodemon": "^3.0.3",
"npm-run-all": "4.1.5", "npm-run-all": "4.1.5",
"rollup": "2.67.2", "rollup": "^2.79.1",
"rollup-plugin-summary": "1.3.0", "rollup-plugin-summary": "^1.4.3",
"rollup-plugin-terser": "7.0.2", "rollup-plugin-terser": "7.0.2",
"simple-git-hooks": "^2.9.0", "simple-git-hooks": "^2.9.0",
"snowpack": "3.8.8", "snowpack": "3.8.8",