View raw

1 #!/usr/bin/env bash 2 3 set -eEuo pipefail 4 5 readonly REPO_DIR="/opt/fapg/fapg-daq" 6 readonly RECORDER_BIN="${REPO_DIR}/roles/daq-recorder/bin/fapg-daq-mqtt-sqlite" 7 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 8 readonly SCRIPT_DIR 9 10 readonly SERVICE_NAME="fapg-daq-mqtt-sqlite.service" 11 readonly SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}" 12 13 readonly ENV_DIR="/etc/fapg-daq" 14 readonly ENV_FILE="${ENV_DIR}/mqtt-sqlite.env" 15 16 readonly STATE_DIR="/var/lib/fapg-daq" 17 readonly RUN_USER="fapg-daq" 18 readonly RUN_GROUP="fapg-daq" 19 20 readonly MQTT_HOST="10.77.0.2" 21 readonly MQTT_PORT="1883" 22 readonly MQTT_USERNAME="fapg_vps" 23 readonly MQTT_TOPIC="fapg/daq/#" 24 MQTT_PASSWORD="" 25 26 function die() { 27 echo "ERROR: $*" >&2 28 exit 1 29 } 30 31 function require_root() { 32 if [[ "$(id -u)" -ne 0 ]]; then 33 die "$0 requires superuser privileges." 34 fi 35 } 36 37 function install_os_dependencies() { 38 apt-get update 39 apt-get install -y \ 40 perl \ 41 sqlite3 \ 42 libdbi-perl \ 43 libdbd-sqlite3-perl \ 44 libnet-mqtt-simple-perl 45 } 46 47 function create_runtime_user() { 48 if ! getent group "${RUN_GROUP}" > /dev/null; then 49 addgroup --system "${RUN_GROUP}" 50 fi 51 52 if ! id "${RUN_USER}" > /dev/null 2>&1; then 53 adduser \ 54 --system \ 55 --ingroup "${RUN_GROUP}" \ 56 --home "${STATE_DIR}" \ 57 --no-create-home \ 58 --disabled-login \ 59 "${RUN_USER}" 60 fi 61 62 mkdir -p "${STATE_DIR}" 63 chown "${RUN_USER}:${RUN_GROUP}" "${STATE_DIR}" 64 } 65 66 function check_repo_layout() { 67 [[ -d "${REPO_DIR}" ]] || die "Repo not found at ${REPO_DIR}." 68 [[ -x "${RECORDER_BIN}" ]] || die "${RECORDER_BIN} does not exist or is not executable." 69 } 70 71 function write_env_file() { 72 mkdir -p "${ENV_DIR}" 73 74 if [[ -f "${ENV_FILE}" ]]; then 75 echo "${ENV_FILE} already exists; leaving it unchanged." 76 chown root:"${RUN_GROUP}" "${ENV_FILE}" 77 chmod 0640 "${ENV_FILE}" 78 return 79 fi 80 81 if [[ -z "${MQTT_PASSWORD:-}" ]]; then 82 read -rsp "MQTT password for user '${MQTT_USERNAME}': " MQTT_PASSWORD 83 echo 84 fi 85 86 [[ -n "${MQTT_PASSWORD:-}" ]] || die "MQTT_PASSWORD is required." 87 88 cat > "${ENV_FILE}" <<EOF 89 MQTT_SIMPLE_ALLOW_INSECURE_LOGIN=1 90 91 MQTT_HOST=${MQTT_HOST} 92 MQTT_PORT=${MQTT_PORT} 93 MQTT_USERNAME=${MQTT_USERNAME} 94 MQTT_PASSWORD=${MQTT_PASSWORD} 95 MQTT_TOPIC=${MQTT_TOPIC} 96 97 FAPG_DAQ_DB=${STATE_DIR}/readings.sqlite3 98 EOF 99 100 chown root:"${RUN_GROUP}" "${ENV_FILE}" 101 chmod 0640 "${ENV_FILE}" 102 } 103 104 function write_systemd_service() { 105 install -m 0644 -o root -g root \ 106 "${SCRIPT_DIR}/etc/systemd/system/fapg-daq-mqtt-sqlite.service" \ 107 "${SERVICE_FILE}" 108 } 109 110 function enable_service() { 111 systemctl daemon-reload 112 systemctl enable "${SERVICE_NAME}" 113 systemctl restart "${SERVICE_NAME}" 114 } 115 116 function show_status() { 117 cat <<"EOF" 118 Deployment complete. 119 Current service state: 120 EOF 121 systemctl --no-pager --full status "${SERVICE_NAME}" 122 } 123 124 function main() { 125 require_root 126 install_os_dependencies 127 create_runtime_user 128 check_repo_layout 129 write_env_file 130 write_systemd_service 131 enable_service 132 show_status 133 } 134 135 main "$@" 136