#!/usr/bin/env bash set -eEuo pipefail readonly REPO_DIR="/opt/fapg/fapg-daq" readonly RECORDER_BIN="${REPO_DIR}/roles/daq-recorder/bin/fapg-daq-mqtt-sqlite" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly SCRIPT_DIR readonly SERVICE_NAME="fapg-daq-mqtt-sqlite.service" readonly SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}" readonly ENV_DIR="/etc/fapg-daq" readonly ENV_FILE="${ENV_DIR}/mqtt-sqlite.env" readonly STATE_DIR="/var/lib/fapg-daq" readonly RUN_USER="fapg-daq" readonly RUN_GROUP="fapg-daq" readonly MQTT_HOST="10.77.0.2" readonly MQTT_PORT="1883" readonly MQTT_USERNAME="fapg_vps" readonly MQTT_TOPIC="fapg/daq/#" MQTT_PASSWORD="" function die() { echo "ERROR: $*" >&2 exit 1 } function require_root() { if [[ "$(id -u)" -ne 0 ]]; then die "$0 requires superuser privileges." fi } function install_os_dependencies() { apt-get update apt-get install -y \ perl \ sqlite3 \ libdbi-perl \ libdbd-sqlite3-perl \ libnet-mqtt-simple-perl } function create_runtime_user() { if ! getent group "${RUN_GROUP}" > /dev/null; then addgroup --system "${RUN_GROUP}" fi if ! id "${RUN_USER}" > /dev/null 2>&1; then adduser \ --system \ --ingroup "${RUN_GROUP}" \ --home "${STATE_DIR}" \ --no-create-home \ --disabled-login \ "${RUN_USER}" fi mkdir -p "${STATE_DIR}" chown "${RUN_USER}:${RUN_GROUP}" "${STATE_DIR}" } function check_repo_layout() { [[ -d "${REPO_DIR}" ]] || die "Repo not found at ${REPO_DIR}." [[ -x "${RECORDER_BIN}" ]] || die "${RECORDER_BIN} does not exist or is not executable." } function write_env_file() { mkdir -p "${ENV_DIR}" if [[ -f "${ENV_FILE}" ]]; then echo "${ENV_FILE} already exists; leaving it unchanged." chown root:"${RUN_GROUP}" "${ENV_FILE}" chmod 0640 "${ENV_FILE}" return fi if [[ -z "${MQTT_PASSWORD:-}" ]]; then read -rsp "MQTT password for user '${MQTT_USERNAME}': " MQTT_PASSWORD echo fi [[ -n "${MQTT_PASSWORD:-}" ]] || die "MQTT_PASSWORD is required." cat > "${ENV_FILE}" <