114 lines
3.6 KiB
Bash
Executable File
114 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -Eeuo pipefail
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
# shellcheck source=common.sh
|
|
source "$SCRIPT_DIR/common.sh"
|
|
cd "$PROJECT_ROOT"
|
|
|
|
RUN_TESTS=1
|
|
START_SERVICE=1
|
|
|
|
usage() {
|
|
cat <<'TXT'
|
|
Install GREE Controller as a systemd service in a Debian/Ubuntu LXC container.
|
|
|
|
Usage:
|
|
sudo ./scripts/install.sh
|
|
sudo ./scripts/install.sh --skip-tests
|
|
sudo ./scripts/install.sh --no-start
|
|
|
|
The installer preserves an existing /etc/gree-controller.env file and database.
|
|
Use scripts/update.sh for later releases.
|
|
TXT
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--skip-tests) RUN_TESTS=0; shift ;;
|
|
--no-start) START_SERVICE=0; shift ;;
|
|
-h|--help) usage; exit 0 ;;
|
|
*) echo "Unknown argument: $1" >&2; usage; exit 2 ;;
|
|
esac
|
|
done
|
|
|
|
require_root
|
|
require_systemd
|
|
if [[ -x "$INSTALL_BINARY" && -f "$SERVICE_FILE" ]]; then
|
|
fail "An existing installation was detected. Use sudo ./scripts/update.sh instead."
|
|
fi
|
|
install_build_dependencies
|
|
ensure_rust
|
|
build_web_assets_if_available
|
|
|
|
if command -v systemd-detect-virt >/dev/null 2>&1; then
|
|
virt="$(systemd-detect-virt --container 2>/dev/null || true)"
|
|
[[ -n "$virt" ]] || warn "No container runtime was detected. Installation can still continue on a regular systemd host."
|
|
fi
|
|
|
|
version="$(project_version)"
|
|
say "Installing GREE Controller ${version:-unknown}"
|
|
|
|
if [[ "$RUN_TESTS" -eq 1 ]]; then
|
|
say "Running Rust tests before installation"
|
|
cargo test --all-targets
|
|
fi
|
|
say "Building release binary"
|
|
cargo build --release
|
|
|
|
getent group "$SERVICE_GROUP" >/dev/null 2>&1 || groupadd --system "$SERVICE_GROUP"
|
|
id "$SERVICE_USER" >/dev/null 2>&1 || \
|
|
useradd --system --gid "$SERVICE_GROUP" --home "$DATA_DIR" --shell /usr/sbin/nologin "$SERVICE_USER"
|
|
install -d -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0750 "$DATA_DIR"
|
|
install -d -o root -g root -m 0755 "$INSTALL_DIR"
|
|
install -d -o root -g root -m 0700 "$BACKUP_ROOT"
|
|
install -o root -g root -m 0755 target/release/gree-controller "$INSTALL_BINARY"
|
|
install -o root -g root -m 0644 systemd/gree-controller.service "$SERVICE_FILE"
|
|
|
|
if [[ ! -f "$ENV_FILE" ]]; then
|
|
token="$(od -An -N24 -tx1 /dev/urandom | tr -d ' \n')"
|
|
cat > "$ENV_FILE" <<ENV
|
|
GREE_CONTROLLER_BIND=0.0.0.0:8787
|
|
GREE_CONTROLLER_DATABASE=$DATA_DIR/gree-controller.db
|
|
GREE_CONTROLLER_APP_TOKEN=$token
|
|
GREE_CONTROLLER_SIMULATE=false
|
|
GREE_CONTROLLER_AUTO_SEED=false
|
|
GREE_CONTROLLER_POLL_INTERVAL_SECONDS=15
|
|
GREE_CONTROLLER_ZONE_INTERVAL_SECONDS=5
|
|
GREE_CONTROLLER_DISCOVERY_TIMEOUT_MS=3000
|
|
GREE_CONTROLLER_DISCOVERY_BROADCAST=255.255.255.255:7000
|
|
GREE_CONTROLLER_GREE_INTERFACE=
|
|
GREE_CONTROLLER_ID=gree-controller
|
|
GREE_CONTROLLER_HOUSE_MODE=cool
|
|
GREE_CONTROLLER_OUTDOOR_ASSIST_ENABLED=true
|
|
RUST_LOG=info,tower_http=info
|
|
HA_URL=
|
|
HA_TOKEN=
|
|
HA_ENTITY_ID=
|
|
HA_OUTDOOR_ENTITY_ID=
|
|
HA_ALLOW_INVALID_TLS=false
|
|
ENV
|
|
chmod 0600 "$ENV_FILE"
|
|
say "Generated administrator token and saved it to $ENV_FILE"
|
|
printf 'Administrator token: %s\n' "$token"
|
|
else
|
|
say "Preserving existing $ENV_FILE"
|
|
fi
|
|
|
|
systemctl daemon-reload
|
|
systemctl enable "$SERVICE_NAME" >/dev/null
|
|
if [[ "$START_SERVICE" -eq 1 ]]; then
|
|
say "Starting GREE Controller"
|
|
systemctl restart "$SERVICE_NAME"
|
|
if ! wait_for_health 80; then
|
|
systemctl --no-pager --full status "$SERVICE_NAME" || true
|
|
journalctl -u "$SERVICE_NAME" -n 80 --no-pager || true
|
|
fail "Service did not pass the health check."
|
|
fi
|
|
say "Installation complete"
|
|
printf 'Panel: %s\n' "$(panel_url)"
|
|
printf 'Status: %s status\n' "$SCRIPT_DIR/service.sh"
|
|
printf 'Logs: %s logs\n' "$SCRIPT_DIR/service.sh"
|
|
else
|
|
say "Installation complete; service was not started (--no-start)."
|
|
fi
|