From 6949c7aae798981dffe2e165a4943f6e5b9cc59d Mon Sep 17 00:00:00 2001 From: NuklearRabbit <145918611+NuklearRabbit@users.noreply.github.com> Date: Thu, 3 Sep 2026 02:51:33 +0200 Subject: [PATCH] fix: normalize public shell scripts --- .gitattributes | 1 + PUBLIC-SOURCE-MANIFEST.sha256 | 15 ++-- docker/entrypoint.sh | 38 ++++----- scripts/export-public-source.sh | 134 +++++++++++++++--------------- scripts/git-get-branch.sh | 6 +- scripts/openrgb-udev-install.sh | 34 ++++---- scripts/openrgb-upstream-guard.sh | 134 +++++++++++++++--------------- scripts/redeploy-lumaops.sh | 30 +++---- scripts/unraid-hardware-setup.sh | 132 ++++++++++++++--------------- 9 files changed, 263 insertions(+), 261 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfdb8b7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sh text eol=lf diff --git a/PUBLIC-SOURCE-MANIFEST.sha256 b/PUBLIC-SOURCE-MANIFEST.sha256 index e8503fc..8b63c8b 100644 --- a/PUBLIC-SOURCE-MANIFEST.sha256 +++ b/PUBLIC-SOURCE-MANIFEST.sha256 @@ -1,6 +1,7 @@ 004f81f60cd94f40a4190a251207046c49947a18665acd9d286d4ed37262000c .dockerignore d60541998d51c1858da15f04afb54b28db56c21b86217c3cb7fc3d7ddb15c406 .editorconfig b31877c3a1005f270a5814a32e1d3ea3e6ae88eb7857ba578dd0931d6d8517c5 .env.example +1df84947e0d933c53fe759123bcf4074fcb674edacd7d3d6de0958311c1e7d4b .gitattributes c72d7473cb0746b3eb542ec0fbbf6ef3cf1fc9ca764d703e6209a8949a2ab890 .gitea/workflows/managed-validation.yml 37071ae4aaa1cbeacdf6560459e0c2302b620d998500c42012c87c16574018a8 .github/FUNDING.yml 2c1e738d39017495aabd2daf47b0cab54c5442362c51f1c08cd460297a9308c0 .github/workflows/issue_opened.yml @@ -2011,7 +2012,7 @@ dade8ee341b4e9606a42e8d6067d5d036417bbf11cf255ab5ecd2b005d72289d dependencies/m d50c2aca25ac6cd7810d4b9a3ab14dfec6a6a1b7272d20ac62e3b2598c6cb102 docker-compose.yml 15eb33e89457f1311f7696028c40a0651fec6d962447efddb8ed1cebe47cfd7a docker/compose.diagnostic.yml 10cc4740f26b4ad86791c24c5497588aa01f93d5fa03e269442f0f4e85819e54 docker/compose.host-network.yml -b562469ac260ca2cb171719888ca902dd55f41cf4730ae4951d2c3fca053a0b5 docker/entrypoint.sh +508b32aa25cf21e45a6cafa277655adf7d738e418a1a26189f4eec04dfab068b docker/entrypoint.sh 91f35a0cce1e4e1a46d8dbb938fb33d824a06b0afa786c20c065f794cb1b0c61 docker/healthcheck.py 8e9cd6946aa75eb1a3b6c79fe97d8086f367d5ec782063f454ca6524533e3373 docker/supervisor.py 92a2237e9cdc6d9414a36423bcacc6f98d7d38212d8c469f224859aae25ef06c docker/unraid-lumaops.xml @@ -2331,16 +2332,16 @@ f0081784a7f1275b3b5c433742682ea75a92379968a589bc606d5422332d638d qt/swatches.h d367db3868ac46b452ebe8ae758a75363b24024478f7d53574ca11c46e190bc7 scripts/License.rtf 1ab208010b911add52a755403abb5cb59749073375e700d7c835cce212cff4d1 scripts/banner.bmp 3bab3fb8f36306bb30bf773fe83ff588bdc951a1052934b3431a0ef9b0962cfb scripts/dialog_background.bmp -4991639804743e2960eeda9ea91323885d17d2763c8c26ce10a05a2ed4a088cd scripts/export-public-source.sh +b1a46fbfc38afbc153cac1add0257e712c2c0df4c7eced7f4824582089fbf8e0 scripts/export-public-source.sh 398862bef5e421bee7e200fce86244aba614cbea02b73b3420be1b19a582cc6d scripts/git-get-branch.ps1 -8ea8d87553b95b73d5fe1cc8c84d955f5091cf2572914364f549461a424bd25b scripts/git-get-branch.sh -172c4f52c197f427c79446134e0d810011ba2ce5ba89e03db156c3675608c8d1 scripts/openrgb-udev-install.sh +1af0951cb1e71b3d743eb499342443f9d8709554348682c17371cec1300c445e scripts/git-get-branch.sh +44e4587bfe3432409cd6aa897e534a22d9c52d4350933df262b5af6a07bd6286 scripts/openrgb-udev-install.sh f527c95d094238b3a5cee99390bcd58704c1a17432f39d48ffc89ebafa80a7ba scripts/openrgb-upstream-guard.ps1 -da805501744cfb3726f1c36bc91d1a42ee5c1d9cc32cbb9834336c579216734e scripts/openrgb-upstream-guard.sh +0826cbd1ce03115bf39ad007e03f070c3ee1142efcd398303d13817d937a6bf3 scripts/openrgb-upstream-guard.sh aeedc69310db069e52bd770f2882046e6aa2f93c063218c6eac23e422f49113a scripts/prepare-artifacts.py 7ec8f32a79030ba625c2b7f444f3b22d70a94a983ab66189890b22b0a8cff6ea scripts/redeploy-lumaops.ps1 -dd3e9e8f73b0c504c55a399ba5a5bccc9db6e9a1a596e4cc214a3762484a0058 scripts/redeploy-lumaops.sh -3ba2c0867fe8beb5f939db6b593373e159b405d29017e7de9de8ac5d8ab66403 scripts/unraid-hardware-setup.sh +ff106eeb44d8f28c7777bb2bc3574680cac0bcd49f4e72d9d653e111df4e53e7 scripts/redeploy-lumaops.sh +af977ca1af0702d75bf37cc95412ebea7b01d61afa75467e9bcd58ea9d97ca9c scripts/unraid-hardware-setup.sh 30941516a9ff1daad643f8bf9691b81c4585147baa4c67a5ff9c6eb36a99bb95 scsiapi/scsiapi.h b7e077a01db9db5e0030d15951c95634866b907ce1516d517f72735462437b78 scsiapi/scsiapi_linux.c b8986606495af1fa1db2596a5105b99958a7d63e66cc1c524441dda68cd974bc scsiapi/scsiapi_macos.c diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 4ad49f5..4b23e09 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -1,19 +1,19 @@ -#!/bin/sh -set -eu - -PUID="${PUID:-99}" -PGID="${PGID:-100}" - -case "$PUID:$PGID" in - *[!0-9:]*|:|*:) echo "PUID en PGID moeten numeriek zijn" >&2; exit 64 ;; -esac - -groupmod --gid "$PGID" lumaops 2>/dev/null || true -usermod --uid "$PUID" --gid "$PGID" lumaops 2>/dev/null || true - -mkdir -p /config/openrgb /config/lumaops /data /logs /run/lumaops -chown -R "$PUID:$PGID" /config/lumaops /data /logs /run/lumaops -chown -R "$PUID:$PGID" /config/openrgb -gosu "$PUID:$PGID" mkdir -p /data/backups - -exec gosu "$PUID:$PGID" /usr/bin/tini -- /opt/venv/bin/python /opt/lumaops/supervisor.py +#!/bin/sh +set -eu + +PUID="${PUID:-99}" +PGID="${PGID:-100}" + +case "$PUID:$PGID" in + *[!0-9:]*|:|*:) echo "PUID en PGID moeten numeriek zijn" >&2; exit 64 ;; +esac + +groupmod --gid "$PGID" lumaops 2>/dev/null || true +usermod --uid "$PUID" --gid "$PGID" lumaops 2>/dev/null || true + +mkdir -p /config/openrgb /config/lumaops /data /logs /run/lumaops +chown -R "$PUID:$PGID" /config/lumaops /data /logs /run/lumaops +chown -R "$PUID:$PGID" /config/openrgb +gosu "$PUID:$PGID" mkdir -p /data/backups + +exec gosu "$PUID:$PGID" /usr/bin/tini -- /opt/venv/bin/python /opt/lumaops/supervisor.py diff --git a/scripts/export-public-source.sh b/scripts/export-public-source.sh index 74545e8..c191934 100644 --- a/scripts/export-public-source.sh +++ b/scripts/export-public-source.sh @@ -1,67 +1,67 @@ -#!/usr/bin/env bash - -set -euo pipefail - -if [ "$#" -ne 1 ]; then - echo "Usage: $0 OUTPUT_DIRECTORY" >&2 - exit 2 -fi - -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -OUTPUT_DIR="$1" - -if [ -e "$OUTPUT_DIR" ]; then - echo "Output path already exists: $OUTPUT_DIR" >&2 - exit 1 -fi -# Ignore checkout-only executable-bit and CRLF differences so the same guard works -# from Windows Git and WSL. Content changes still fail the export. -if ! git -C "$ROOT_DIR" -c core.fileMode=false diff --ignore-space-at-eol --quiet \ - || ! git -C "$ROOT_DIR" -c core.fileMode=false diff --cached --quiet; then - echo "Commit or stash repository changes before creating a public export." >&2 - exit 1 -fi - -mkdir -p "$OUTPUT_DIR" -git -C "$ROOT_DIR" archive --format=tar HEAD | tar -xf - -C "$OUTPUT_DIR" - -# Production deployment dispatch belongs to the private operations repository. -rm -f "$OUTPUT_DIR/.gitea/workflows/unraid-deploy.yml" - -for forbidden in \ - '.env' '*.pem' '*.key' '*.p12' '*.pfx' '*.db' '*.sqlite' '*.sqlite3' \ - 'secret.key' 'id_rsa' 'id_ed25519'; do - if find "$OUTPUT_DIR" -type f -name "$forbidden" -print -quit | grep -q .; then - echo "Forbidden file found in public export: $forbidden" >&2 - exit 1 - fi -done - -if grep -RIlE --exclude='export-public-source.sh' \ - '192\.168\.10\.150|NuklearRabbit' "$OUTPUT_DIR" >/dev/null; then - echo "Private deployment marker found in public export." >&2 - exit 1 -fi -if find "$OUTPUT_DIR" -type f -size +10M -print -quit | grep -q .; then - echo "Unexpected file larger than 10 MiB found in public export." >&2 - exit 1 -fi - -git -C "$OUTPUT_DIR" init -q -git -C "$OUTPUT_DIR" add . -git -C "$OUTPUT_DIR" -c user.name='LumaOps release export' \ - -c user.email='release-export@invalid.example' \ - commit -q -m "Publish LumaOps source" - -( - cd "$OUTPUT_DIR" - git ls-files -z | sort -z | xargs -0 sha256sum > PUBLIC-SOURCE-MANIFEST.sha256 -) -git -C "$OUTPUT_DIR" add PUBLIC-SOURCE-MANIFEST.sha256 -git -C "$OUTPUT_DIR" -c user.name='LumaOps release export' \ - -c user.email='release-export@invalid.example' \ - commit -q --amend --no-edit -git -C "$OUTPUT_DIR" tag public-release-baseline - -echo "Public source export created at $OUTPUT_DIR" -echo "Commit: $(git -C "$OUTPUT_DIR" rev-parse HEAD)" +#!/usr/bin/env bash + +set -euo pipefail + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 OUTPUT_DIRECTORY" >&2 + exit 2 +fi + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +OUTPUT_DIR="$1" + +if [ -e "$OUTPUT_DIR" ]; then + echo "Output path already exists: $OUTPUT_DIR" >&2 + exit 1 +fi +# Ignore checkout-only executable-bit and CRLF differences so the same guard works +# from Windows Git and WSL. Content changes still fail the export. +if ! git -C "$ROOT_DIR" -c core.fileMode=false diff --ignore-space-at-eol --quiet \ + || ! git -C "$ROOT_DIR" -c core.fileMode=false diff --cached --quiet; then + echo "Commit or stash repository changes before creating a public export." >&2 + exit 1 +fi + +mkdir -p "$OUTPUT_DIR" +git -C "$ROOT_DIR" archive --format=tar HEAD | tar -xf - -C "$OUTPUT_DIR" + +# Production deployment dispatch belongs to the private operations repository. +rm -f "$OUTPUT_DIR/.gitea/workflows/unraid-deploy.yml" + +for forbidden in \ + '.env' '*.pem' '*.key' '*.p12' '*.pfx' '*.db' '*.sqlite' '*.sqlite3' \ + 'secret.key' 'id_rsa' 'id_ed25519'; do + if find "$OUTPUT_DIR" -type f -name "$forbidden" -print -quit | grep -q .; then + echo "Forbidden file found in public export: $forbidden" >&2 + exit 1 + fi +done + +if grep -RIlE --exclude='export-public-source.sh' \ + '192\.168\.10\.150|NuklearRabbit' "$OUTPUT_DIR" >/dev/null; then + echo "Private deployment marker found in public export." >&2 + exit 1 +fi +if find "$OUTPUT_DIR" -type f -size +10M -print -quit | grep -q .; then + echo "Unexpected file larger than 10 MiB found in public export." >&2 + exit 1 +fi + +git -C "$OUTPUT_DIR" init -q +git -C "$OUTPUT_DIR" add . +git -C "$OUTPUT_DIR" -c user.name='LumaOps release export' \ + -c user.email='release-export@invalid.example' \ + commit -q -m "Publish LumaOps source" + +( + cd "$OUTPUT_DIR" + git ls-files -z | sort -z | xargs -0 sha256sum > PUBLIC-SOURCE-MANIFEST.sha256 +) +git -C "$OUTPUT_DIR" add PUBLIC-SOURCE-MANIFEST.sha256 +git -C "$OUTPUT_DIR" -c user.name='LumaOps release export' \ + -c user.email='release-export@invalid.example' \ + commit -q --amend --no-edit +git -C "$OUTPUT_DIR" tag public-release-baseline + +echo "Public source export created at $OUTPUT_DIR" +echo "Commit: $(git -C "$OUTPUT_DIR" rev-parse HEAD)" diff --git a/scripts/git-get-branch.sh b/scripts/git-get-branch.sh index 987b151..fbbf597 100644 --- a/scripts/git-get-branch.sh +++ b/scripts/git-get-branch.sh @@ -1,3 +1,3 @@ -#! /bin/bash - -git show-ref | grep $(git log --pretty=%h -1) | sed 's|.*/\(.*\)|\1|' | sort -u | grep -v HEAD +#! /bin/bash + +git show-ref | grep $(git log --pretty=%h -1) | sed 's|.*/\(.*\)|\1|' | sort -u | grep -v HEAD diff --git a/scripts/openrgb-udev-install.sh b/scripts/openrgb-udev-install.sh index cfb68a9..e96661d 100644 --- a/scripts/openrgb-udev-install.sh +++ b/scripts/openrgb-udev-install.sh @@ -1,17 +1,17 @@ -#! /bin/bash - -# Download udev rules file -wget https://openrgb.org/releases/release_0.9/60-openrgb.rules - -# If we don't have write permissions then we're running on an immutable distro -if sudo test -w /usr/lib/udev/rules.d; -then - # Move udev rules file to udev rules directory - sudo mv 60-openrgb.rules /usr/lib/udev/rules.d -else - sudo mv 60-openrgb.rules /etc/udev/rules.d -fi - -# Reload the rules -sudo udevadm control --reload-rules -sudo udevadm trigger +#! /bin/bash + +# Download udev rules file +wget https://openrgb.org/releases/release_0.9/60-openrgb.rules + +# If we don't have write permissions then we're running on an immutable distro +if sudo test -w /usr/lib/udev/rules.d; +then + # Move udev rules file to udev rules directory + sudo mv 60-openrgb.rules /usr/lib/udev/rules.d +else + sudo mv 60-openrgb.rules /etc/udev/rules.d +fi + +# Reload the rules +sudo udevadm control --reload-rules +sudo udevadm trigger diff --git a/scripts/openrgb-upstream-guard.sh b/scripts/openrgb-upstream-guard.sh index c32a021..9abbb50 100644 --- a/scripts/openrgb-upstream-guard.sh +++ b/scripts/openrgb-upstream-guard.sh @@ -1,67 +1,67 @@ -#!/usr/bin/env bash - -set -euo pipefail - -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -cd "$ROOT_DIR" - -BASELINE_TAG="${OPENRGB_BASELINE_TAG:-upstream-openrgb-1.0rc3}" -UPSTREAM_REMOTE="${OPENRGB_UPSTREAM_REMOTE:-upstream}" -PUBLIC_BASELINE_TAG="public-release-baseline" - -if [ "${OPENRGB_FETCH_UPSTREAM:-0}" = "1" ]; then - echo "[INFO] Fetch upstream remote '$UPSTREAM_REMOTE'..." - git fetch "$UPSTREAM_REMOTE" --tags --prune -fi - -if ! git rev-parse --verify --quiet "${BASELINE_TAG}^{commit}" >/dev/null 2>&1; then - if git rev-parse --verify --quiet "${PUBLIC_BASELINE_TAG}^{commit}" >/dev/null 2>&1; then - BASELINE_TAG="$PUBLIC_BASELINE_TAG" - echo "[INFO] Publieke releasebaseline wordt gebruikt." - else - echo "[ERROR] Geen upstream- of publieke baseline-tag gevonden." - exit 1 - fi -fi - -if [ "$BASELINE_TAG" != "$PUBLIC_BASELINE_TAG" ] && ! git remote | grep -Fxq "$UPSTREAM_REMOTE"; then - echo "[ERROR] Remote '${UPSTREAM_REMOTE}' ontbreekt. Voeg upstream eerst toe of zet OPENRGB_UPSTREAM_REMOTE." - exit 1 -fi - -mapfile -t CHANGED_FILES < <(git diff --name-only "${BASELINE_TAG}..HEAD") - -if [ ${#CHANGED_FILES[@]} -eq 0 ]; then - echo "[INFO] Geen verschillen t.o.v. baseline '${BASELINE_TAG}'." - exit 0 -fi - -declare -a UNEXPECTED_FILES=() - -for file in "${CHANGED_FILES[@]}"; do - allowed=0 - case "$file" in - .dockerignore|.env.example|.gitleaks.toml|.gitignore|Dockerfile|README.md|SECURITY.md|docker-compose*.yml|docker-compose*.yaml|startup/main_FreeBSD_Linux_MacOS.cpp|ResourceManager.cpp|ResourceManager.h|.github/*|.gitea/*) - allowed=1 - ;; - docs/*|lumaops/*|docker/*|scripts/*) - allowed=1 - ;; - esac - - if [ "$allowed" -eq 0 ]; then - UNEXPECTED_FILES+=("$file") - fi -done - -if [ ${#UNEXPECTED_FILES[@]} -gt 0 ]; then - echo "[ERROR] Verandering gevonden buiten de beoogde fork-patchset:" - for file in "${UNEXPECTED_FILES[@]}"; do - echo " - $file" - done - echo "[HINT] Voeg tijdelijke kernaanpassingen alleen toe met expliciete uitzonderingen in deze script/handleiding." - exit 1 -fi - -echo "[OK] Alleen geautoriseerde wijzigingen t.o.v. baseline '${BASELINE_TAG}'." -echo "[OK] Upstream-patchgrens blijft schoon." +#!/usr/bin/env bash + +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT_DIR" + +BASELINE_TAG="${OPENRGB_BASELINE_TAG:-upstream-openrgb-1.0rc3}" +UPSTREAM_REMOTE="${OPENRGB_UPSTREAM_REMOTE:-upstream}" +PUBLIC_BASELINE_TAG="public-release-baseline" + +if [ "${OPENRGB_FETCH_UPSTREAM:-0}" = "1" ]; then + echo "[INFO] Fetch upstream remote '$UPSTREAM_REMOTE'..." + git fetch "$UPSTREAM_REMOTE" --tags --prune +fi + +if ! git rev-parse --verify --quiet "${BASELINE_TAG}^{commit}" >/dev/null 2>&1; then + if git rev-parse --verify --quiet "${PUBLIC_BASELINE_TAG}^{commit}" >/dev/null 2>&1; then + BASELINE_TAG="$PUBLIC_BASELINE_TAG" + echo "[INFO] Publieke releasebaseline wordt gebruikt." + else + echo "[ERROR] Geen upstream- of publieke baseline-tag gevonden." + exit 1 + fi +fi + +if [ "$BASELINE_TAG" != "$PUBLIC_BASELINE_TAG" ] && ! git remote | grep -Fxq "$UPSTREAM_REMOTE"; then + echo "[ERROR] Remote '${UPSTREAM_REMOTE}' ontbreekt. Voeg upstream eerst toe of zet OPENRGB_UPSTREAM_REMOTE." + exit 1 +fi + +mapfile -t CHANGED_FILES < <(git diff --name-only "${BASELINE_TAG}..HEAD") + +if [ ${#CHANGED_FILES[@]} -eq 0 ]; then + echo "[INFO] Geen verschillen t.o.v. baseline '${BASELINE_TAG}'." + exit 0 +fi + +declare -a UNEXPECTED_FILES=() + +for file in "${CHANGED_FILES[@]}"; do + allowed=0 + case "$file" in + .dockerignore|.env.example|.gitleaks.toml|.gitignore|Dockerfile|README.md|SECURITY.md|docker-compose*.yml|docker-compose*.yaml|startup/main_FreeBSD_Linux_MacOS.cpp|ResourceManager.cpp|ResourceManager.h|.github/*|.gitea/*) + allowed=1 + ;; + docs/*|lumaops/*|docker/*|scripts/*) + allowed=1 + ;; + esac + + if [ "$allowed" -eq 0 ]; then + UNEXPECTED_FILES+=("$file") + fi +done + +if [ ${#UNEXPECTED_FILES[@]} -gt 0 ]; then + echo "[ERROR] Verandering gevonden buiten de beoogde fork-patchset:" + for file in "${UNEXPECTED_FILES[@]}"; do + echo " - $file" + done + echo "[HINT] Voeg tijdelijke kernaanpassingen alleen toe met expliciete uitzonderingen in deze script/handleiding." + exit 1 +fi + +echo "[OK] Alleen geautoriseerde wijzigingen t.o.v. baseline '${BASELINE_TAG}'." +echo "[OK] Upstream-patchgrens blijft schoon." diff --git a/scripts/redeploy-lumaops.sh b/scripts/redeploy-lumaops.sh index 14af02a..1ff536d 100644 --- a/scripts/redeploy-lumaops.sh +++ b/scripts/redeploy-lumaops.sh @@ -1,15 +1,15 @@ -#!/usr/bin/env bash - -set -euo pipefail - -if ! command -v docker >/dev/null 2>&1; then - echo "[ERROR] docker command not found in PATH." - echo "[HINT] Run this on een host met Docker geïnstalleerd en beschikbaar." - exit 1 -fi - -echo "[INFO] Pull latest compose image/build context and recreate service" -docker compose down -docker compose build --pull --no-cache -docker compose up -d --force-recreate --remove-orphans -docker compose ps +#!/usr/bin/env bash + +set -euo pipefail + +if ! command -v docker >/dev/null 2>&1; then + echo "[ERROR] docker command not found in PATH." + echo "[HINT] Run this on een host met Docker geïnstalleerd en beschikbaar." + exit 1 +fi + +echo "[INFO] Pull latest compose image/build context and recreate service" +docker compose down +docker compose build --pull --no-cache +docker compose up -d --force-recreate --remove-orphans +docker compose ps diff --git a/scripts/unraid-hardware-setup.sh b/scripts/unraid-hardware-setup.sh index 8baccf0..d248074 100644 --- a/scripts/unraid-hardware-setup.sh +++ b/scripts/unraid-hardware-setup.sh @@ -1,66 +1,66 @@ -#!/usr/bin/env bash -set -Eeuo pipefail - -readonly PERSIST_DIR="/boot/config/plugins/lumaops" -readonly PERSIST_SCRIPT="${PERSIST_DIR}/hardware-setup.sh" -readonly LIVE_RULES="/etc/udev/rules.d/60-lumaops-openrgb.rules" -readonly BOOT_HOOK='bash /boot/config/plugins/lumaops/hardware-setup.sh --boot' - -if [[ "${EUID}" -ne 0 ]]; then - echo "Dit script moet als root op de Unraid-host worden uitgevoerd." >&2 - exit 77 -fi - -install -d -m 0755 "${PERSIST_DIR}" /etc/udev/rules.d - -if [[ "${1:-}" != "--boot" ]]; then - install -m 0755 "$0" "${PERSIST_SCRIPT}" - if ! grep -Fqx "${BOOT_HOOK}" /boot/config/go; then - printf '\n# LumaOps OpenRGB hardware access\n%s\n' "${BOOT_HOOK}" >> /boot/config/go - fi -fi - -modprobe i2c-dev -modprobe i2c-i801 - -rules_tmp="$(mktemp)" -trap 'rm -f "${rules_tmp}"' EXIT -cat > "${rules_tmp}" <<'RULES' -# LumaOps: minimum access for the detected ASUS Aura and Intel SMBus devices. -ACTION=="add|change", SUBSYSTEM=="usb", ATTR{idVendor}=="0b05", ATTR{idProduct}=="18f3", MODE:="0660", GROUP:="users" -ACTION=="add|change", SUBSYSTEM=="hidraw", KERNEL=="hidraw*", ATTRS{idVendor}=="0b05", ATTRS{idProduct}=="18f3", MODE:="0660", GROUP:="users" -ACTION=="add|change", SUBSYSTEM=="i2c-dev", KERNEL=="i2c-0", MODE:="0660", GROUP:="users" -RULES -install -m 0644 "${rules_tmp}" "${LIVE_RULES}" - -udevadm control --reload-rules -udevadm trigger --action=change --subsystem-match=usb --attr-match=idVendor=0b05 --attr-match=idProduct=18f3 -udevadm trigger --action=change --subsystem-match=hidraw -udevadm trigger --action=change --subsystem-match=i2c-dev --sysname-match=i2c-0 -udevadm settle - -for node in /dev/hidraw0 /dev/i2c-0; do - if [[ -e "${node}" ]]; then - chgrp users "${node}" - chmod g+rw "${node}" - fi -done - -for sysdev in /sys/bus/usb/devices/*; do - [[ -f "${sysdev}/idVendor" && -f "${sysdev}/idProduct" ]] || continue - [[ "$(<"${sysdev}/idVendor")" == "0b05" && "$(<"${sysdev}/idProduct")" == "18f3" ]] || continue - busnum="$(printf '%03d' "$((10#$(<"${sysdev}/busnum")))")" - devnum="$(printf '%03d' "$((10#$(<"${sysdev}/devnum")))")" - usb_node="/dev/bus/usb/${busnum}/${devnum}" - chgrp users "${usb_node}" - chmod g+rw "${usb_node}" -done - -for required in /dev/hidraw0 /dev/i2c-0; do - if [[ ! -r "${required}" || ! -w "${required}" ]]; then - echo "Hardware-node is niet lees- en schrijfbaar: ${required}" >&2 - exit 69 - fi -done - -stat -c '%n %a %U:%G' /dev/hidraw0 /dev/i2c-0 +#!/usr/bin/env bash +set -Eeuo pipefail + +readonly PERSIST_DIR="/boot/config/plugins/lumaops" +readonly PERSIST_SCRIPT="${PERSIST_DIR}/hardware-setup.sh" +readonly LIVE_RULES="/etc/udev/rules.d/60-lumaops-openrgb.rules" +readonly BOOT_HOOK='bash /boot/config/plugins/lumaops/hardware-setup.sh --boot' + +if [[ "${EUID}" -ne 0 ]]; then + echo "Dit script moet als root op de Unraid-host worden uitgevoerd." >&2 + exit 77 +fi + +install -d -m 0755 "${PERSIST_DIR}" /etc/udev/rules.d + +if [[ "${1:-}" != "--boot" ]]; then + install -m 0755 "$0" "${PERSIST_SCRIPT}" + if ! grep -Fqx "${BOOT_HOOK}" /boot/config/go; then + printf '\n# LumaOps OpenRGB hardware access\n%s\n' "${BOOT_HOOK}" >> /boot/config/go + fi +fi + +modprobe i2c-dev +modprobe i2c-i801 + +rules_tmp="$(mktemp)" +trap 'rm -f "${rules_tmp}"' EXIT +cat > "${rules_tmp}" <<'RULES' +# LumaOps: minimum access for the detected ASUS Aura and Intel SMBus devices. +ACTION=="add|change", SUBSYSTEM=="usb", ATTR{idVendor}=="0b05", ATTR{idProduct}=="18f3", MODE:="0660", GROUP:="users" +ACTION=="add|change", SUBSYSTEM=="hidraw", KERNEL=="hidraw*", ATTRS{idVendor}=="0b05", ATTRS{idProduct}=="18f3", MODE:="0660", GROUP:="users" +ACTION=="add|change", SUBSYSTEM=="i2c-dev", KERNEL=="i2c-0", MODE:="0660", GROUP:="users" +RULES +install -m 0644 "${rules_tmp}" "${LIVE_RULES}" + +udevadm control --reload-rules +udevadm trigger --action=change --subsystem-match=usb --attr-match=idVendor=0b05 --attr-match=idProduct=18f3 +udevadm trigger --action=change --subsystem-match=hidraw +udevadm trigger --action=change --subsystem-match=i2c-dev --sysname-match=i2c-0 +udevadm settle + +for node in /dev/hidraw0 /dev/i2c-0; do + if [[ -e "${node}" ]]; then + chgrp users "${node}" + chmod g+rw "${node}" + fi +done + +for sysdev in /sys/bus/usb/devices/*; do + [[ -f "${sysdev}/idVendor" && -f "${sysdev}/idProduct" ]] || continue + [[ "$(<"${sysdev}/idVendor")" == "0b05" && "$(<"${sysdev}/idProduct")" == "18f3" ]] || continue + busnum="$(printf '%03d' "$((10#$(<"${sysdev}/busnum")))")" + devnum="$(printf '%03d' "$((10#$(<"${sysdev}/devnum")))")" + usb_node="/dev/bus/usb/${busnum}/${devnum}" + chgrp users "${usb_node}" + chmod g+rw "${usb_node}" +done + +for required in /dev/hidraw0 /dev/i2c-0; do + if [[ ! -r "${required}" || ! -w "${required}" ]]; then + echo "Hardware-node is niet lees- en schrijfbaar: ${required}" >&2 + exit 69 + fi +done + +stat -c '%n %a %U:%G' /dev/hidraw0 /dev/i2c-0