From 51d0b817fe0e56a733cd1b445b81321831b0c4f3 Mon Sep 17 00:00:00 2001 From: Evilham Date: Fri, 18 Jun 2021 20:52:58 +0200 Subject: [PATCH] [__single_binary_service] Type to manage very simple services. --- explorer/explorer-version | 10 +++ manifest | 158 +++++++++++++++++++++++++++++++++ parameter/boolean | 1 + parameter/default/service-args | 0 parameter/default/state | 1 + parameter/default/user | 1 + parameter/optional | 8 ++ parameter/optional_multiple | 1 + parameter/required | 3 + 9 files changed, 183 insertions(+) create mode 100755 explorer/explorer-version create mode 100755 manifest create mode 100644 parameter/boolean create mode 100644 parameter/default/service-args create mode 100644 parameter/default/state create mode 100644 parameter/default/user create mode 100644 parameter/optional create mode 100644 parameter/optional_multiple create mode 100644 parameter/required diff --git a/explorer/explorer-version b/explorer/explorer-version new file mode 100755 index 0000000..690cc5f --- /dev/null +++ b/explorer/explorer-version @@ -0,0 +1,10 @@ +#!/bin/sh -e + +BIN_PREFIX="/usr/local/bin" +SERVICE_NAME="${__object_id}" + +VERSION_FILE="${BIN_PREFIX}/.${SERVICE_NAME}.cdist.version" + +if [ -f "${VERSION_FILE}" ]; then + cat "${VERSION_FILE}" +fi diff --git a/manifest b/manifest new file mode 100755 index 0000000..d5df410 --- /dev/null +++ b/manifest @@ -0,0 +1,158 @@ +#!/bin/sh -e + +BIN_DIR="/usr/local/bin" + +# Ensure the target bin dir exists +__directory "${BIN_DIR}" \ + --mode 0755 +export require="${require} __directory${BIN_DIR}" + +STATE="$(cat "${__object}/parameter/state")" +USER="$(cat "${__object}/parameter/user")" +GROUP="$(cat "${__object}/parameter/group" 2>/dev/null || true)" +if [ -z "${GROUP}" ]; then + GROUP="${USER}" +fi + +SERVICE_NAME="${__object_id}" + +BINARY="$(cat "${__object}/parameter/binary" 2>/dev/null || true)" +if [ -z "${BINARY}" ]; then + BINARY="${SERVICE_NAME}" +fi +EXTRA_BINARIES="$(cat "${__object}/parameter/extra-binary" 2>/dev/null || true)" +# This only makes sense for file archives +if [ -n "${EXTRA_BINARIES}" ] && [ -f "${__object}/parameter/unpack" ]; then + cat >> /dev/stderr <<-EOF + You cannot specify extra binaries without the --unpack argument. + Make sure that the --url argument points to a file archive. +EOF +fi + +SERVICE_EXEC="$(cat "${__object}/parameter/service-exec" 2>/dev/null || true)" +if [ -z "${SERVICE_EXEC}" ]; then + SERVICE_EXEC="${BIN_DIR}/${BINARY}" +fi +SERVICE_EXEC="${SERVICE_EXEC} $(cat "${__object}/parameter/service-args")" + +SERVICE_DESCRIPTION="$(cat "${__object}/parameter/service-description" \ + 2>/dev/null || true)" +if [ -z "${SERVICE_DESCRIPTION}" ]; then + SERVICE_DESCRIPTION="cdist-managed '${SERVICE_NAME}' service" +fi + +DOWNLOAD_URL="$(cat "${__object}/parameter/url")" +CHECKSUM="$(cat "${__object}/parameter/checksum")" +SHOULD_VERSION="$(cat "${__object}/parameter/version")" + +# Create a user for the service if it is not root +if [ "${USER}" != "root" ]; then + __user "${USER}" \ + --system \ + --state "${STATE}" \ + --home /nonexistent \ + --comment "cdist-managed ${SERVICE_NAME} user" + # Track dependencies + service_require="${service_require} __user/${USER}" +fi + +# TODO: Support non-systemd +__systemd_unit "${SERVICE_NAME}.service" \ + --source "-" \ + --state "${STATE}" \ + --enablement-state "enabled" </dev/null || true)" + # Download packed file + __download "${TMP_PATH}.tar.gz" \ + --url "${DOWNLOAD_URL}" \ + --download remote \ + --sum "${CHECKSUM}" + + # Unpack file and also perform service upgrade + # shellcheck disable=SC2086 + require="__download${TMP_PATH}.tar.gz" \ + __unpack "${TMP_PATH}.tar.gz" \ + ${UNPACK_ARGS} \ + --destination "${TMP_PATH}" \ + --onchange "$(cat <