94 lines
2.8 KiB
Bash
Executable File
94 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
if (( EUID != 0 )); then
|
|
echo "Run this installer with sudo." >&2
|
|
exit 1
|
|
fi
|
|
|
|
project_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
service_name="noctalia-drive-health"
|
|
target_user="${SUDO_USER:-}"
|
|
if [[ -z "$target_user" && "${PKEXEC_UID:-}" =~ ^[0-9]+$ ]]; then
|
|
target_user="$(id -un "$PKEXEC_UID" 2>/dev/null || true)"
|
|
fi
|
|
interval_minutes=15
|
|
|
|
while (($# > 0)); do
|
|
case "$1" in
|
|
--interval-minutes)
|
|
if (($# < 2)); then
|
|
echo "--interval-minutes requires a value." >&2
|
|
exit 2
|
|
fi
|
|
interval_minutes="$2"
|
|
shift 2
|
|
;;
|
|
--help)
|
|
echo "usage: $0 [--interval-minutes 1-1440] [desktop-user]"
|
|
exit 0
|
|
;;
|
|
*)
|
|
if [[ -n "$target_user" ]]; then
|
|
echo "Unexpected argument: $1" >&2
|
|
exit 2
|
|
fi
|
|
target_user="$1"
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if ! [[ "$interval_minutes" =~ ^[0-9]+$ ]] || ((10#$interval_minutes < 1 || 10#$interval_minutes > 1440)); then
|
|
echo "Interval must be a whole number of minutes from 1 to 1440." >&2
|
|
exit 2
|
|
fi
|
|
|
|
if [[ -z "$target_user" || "$target_user" == root ]] || ! id "$target_user" >/dev/null 2>&1; then
|
|
echo "Unable to determine the desktop user. Run with sudo, or pass the username explicitly." >&2
|
|
exit 1
|
|
fi
|
|
target_gid="$(id -g "$target_user")"
|
|
|
|
for dependency in sh smartctl lsblk systemctl install sed mktemp id; do
|
|
if ! command -v "$dependency" >/dev/null 2>&1; then
|
|
echo "Missing required command: $dependency" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
rendered_service="$(mktemp)"
|
|
trap 'rm -f -- "$rendered_service"' EXIT
|
|
sed "s/@TARGET_GID@/$target_gid/g" \
|
|
"$project_dir/packaging/$service_name.service.in" >"$rendered_service"
|
|
|
|
install -Dm0755 \
|
|
"$project_dir/scripts/collect_raw.sh" \
|
|
"/usr/local/libexec/$service_name/collect_raw.sh"
|
|
install -Dm0755 \
|
|
"$project_dir/packaging/smart-action.sh" \
|
|
"/usr/local/libexec/$service_name/smart-action.sh"
|
|
install -Dm0755 \
|
|
"$project_dir/packaging/set-collector-interval.sh" \
|
|
"/usr/local/libexec/$service_name/set-collector-interval.sh"
|
|
install -Dm0755 \
|
|
"$project_dir/packaging/manage-collector.sh" \
|
|
"/usr/local/libexec/$service_name/manage-collector.sh"
|
|
install -Dm0755 \
|
|
"$project_dir/packaging/uninstall-system-collector.sh" \
|
|
"/usr/local/libexec/$service_name/uninstall-collector.sh"
|
|
install -Dm0644 \
|
|
"$rendered_service" \
|
|
"/etc/systemd/system/$service_name.service"
|
|
install -Dm0644 \
|
|
"$project_dir/packaging/$service_name.timer" \
|
|
"/etc/systemd/system/$service_name.timer"
|
|
|
|
systemctl daemon-reload
|
|
systemctl enable --now "$service_name.timer"
|
|
systemctl start "$service_name.service"
|
|
/usr/local/libexec/$service_name/set-collector-interval.sh "$interval_minutes"
|
|
|
|
echo "Installed the read-only SMART collector."
|
|
echo "Cache: /run/$service_name/raw.json"
|