Adds an experimental power-cap mode using the undocumented RM ioctl interface (based on panchovix's LACT PR #1205) to set power limits below the VBIOS minimum (down to 30 W). - hal/rm_power.py: RM ioctl power-cap read/write/reset + runtime probe - limits.py: power_cap_mode (nvml/ioctl) with support detection - config.py: persist power_cap_mode per GPU - profiles: record/apply power_cap_mode - server.py: POST /api/limits validates ioctl support (409 on failure) - cli.py: profile save falls back to persisted mode - client.py: power_cap_mode in Limits - frontend: toggle + warning with panchovix attribution (LACT #1205) - tests: test_rm_power.py (unit) + integration coverage - Makefile: add test_rm_power.py to make test Also includes automated linter reformatting (prettier, ruff, shellcheck, isort, markdownlint) that the linter would apply anyway.
63 lines
2.0 KiB
Bash
Executable File
63 lines
2.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# NVCurve single-command installer.
|
|
#
|
|
# curl -fsSL https://gitea.zephyre.one/Pakobbix/nvcurve/raw/branch/main/install.sh | bash
|
|
#
|
|
# or from a local clone:
|
|
#
|
|
# git clone https://gitea.zephyre.one/Pakobbix/nvcurve.git && cd nvcurve && ./install.sh
|
|
#
|
|
# The React frontend is compiled automatically during the Python build
|
|
# (see hatch_build.py), so Node.js 18+ and npm must be available.
|
|
#
|
|
# Environment:
|
|
# NVCURVE_BRANCH branch to install (default: main)
|
|
|
|
set -euo pipefail
|
|
|
|
REPO_URL="https://gitea.zephyre.one/Pakobbix/nvcurve.git"
|
|
BRANCH="${NVCURVE_BRANCH:-main}"
|
|
|
|
fail() {
|
|
echo "error: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
# --- prerequisites -----------------------------------------------------------
|
|
command -v git >/dev/null 2>&1 ||
|
|
fail "git is required. Install it first."
|
|
command -v node >/dev/null 2>&1 ||
|
|
fail "Node.js 18+ is required (e.g. 'sudo pacman -S nodejs npm' or 'sudo apt install nodejs npm')."
|
|
command -v npm >/dev/null 2>&1 ||
|
|
fail "npm is required (usually installed together with Node.js)."
|
|
|
|
if ! command -v uv >/dev/null 2>&1; then
|
|
echo "uv not found — installing it from https://astral.sh/uv ..."
|
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
export PATH="$HOME/.local/bin:$PATH"
|
|
command -v uv >/dev/null 2>&1 ||
|
|
fail "uv installation failed. Install uv manually: https://docs.astral.sh/uv/"
|
|
fi
|
|
|
|
# --- locate the source tree ---------------------------------------------------
|
|
if [ -f pyproject.toml ] && [ -d frontend ]; then
|
|
src="$(pwd)"
|
|
echo "Installing from current directory: $src"
|
|
else
|
|
tmp="$(mktemp -d)"
|
|
trap 'rm -rf "$tmp"' EXIT
|
|
echo "Cloning $REPO_URL (branch: $BRANCH) ..."
|
|
git clone --quiet --depth 1 --branch "$BRANCH" "$REPO_URL" "$tmp/nvcurve"
|
|
src="$tmp/nvcurve"
|
|
fi
|
|
|
|
# --- install -------------------------------------------------------------------
|
|
# The frontend is built automatically by the build hook (hatch_build.py).
|
|
uv tool install --force "$src"
|
|
|
|
echo
|
|
echo "NVCurve installed."
|
|
echo " Verify your GPU: nvcurve setup"
|
|
echo " Start the web UI: nvcurve"
|