diff --git a/module/composition.module.sh b/module/composition.module.sh index 007395e..9e0c2f1 100755 --- a/module/composition.module.sh +++ b/module/composition.module.sh @@ -33,6 +33,22 @@ function composition.printAllRunningOnThisHost() { done } +# composition.printRunningHost +# +# This function prints the name of the host the given composition is running on. +function composition.printRunningHost() { + local _COMPOSITION _RUNNINGHOST_FILE + _COMPOSITION="${1:?"composition.printRunningHost(): Missing first parameter COMPOSITION"}" + _RUNNINGHOST_FILE="${CIS[COMPOSITIONS]:?"composition.printRunningHost(): Missing CIS_COMPOSITIONS"}${_COMPOSITION}/running-host" + readonly _COMPOSITION _RUNNINGHOST_FILE + + [ -f "${_RUNNINGHOST_FILE}" ] \ + && head -n 1 -- "${_RUNNINGHOST_FILE}" \ + && return 0 + + return 1 +} + # composition.printAllSyncedByThisHost # # This function prints a list of all compositions which should be synced to this host, one per line. @@ -75,19 +91,19 @@ function composition.printZFS() { # - COMPOSITION mandatory: "uptime-kuma-prod" # # This function checks if the given composition runs or should run on this host. -# Therefore a file 'current-host' defines the the current host where the composition runs. +# Therefore a file 'running-host' defines the the current host where the composition runs. function composition.shouldRunOnThisHost() { - local _COMPOSITION _CURRENTHOST_FILE + local _COMPOSITION _RUNNINGHOST_FILE _COMPOSITION="${1:?"composition.shouldRunOnThisHost(): Missing first parameter COMPOSITION"}" - _CURRENTHOST_FILE="${CIS[COMPOSITIONS]:?"composition.shouldRunOnThisHost(): Missing CIS_COMPOSITIONS"}${_COMPOSITION}/current-host" - readonly _COMPOSITION _CURRENTHOST_FILE + _RUNNINGHOST_FILE="${CIS[COMPOSITIONS]:?"composition.shouldRunOnThisHost(): Missing CIS_COMPOSITIONS"}${_COMPOSITION}/running-host" + readonly _COMPOSITION _RUNNINGHOST_FILE - ! [ -f "${_CURRENTHOST_FILE}" ] \ - && print.failure "Missing file current-host for composition: '${_COMPOSITION}'" \ + ! [ -f "${_RUNNINGHOST_FILE}" ] \ + && print.failure "Missing file running-host for composition: '${_COMPOSITION}'" \ && return 1 [ -n "${CIS[HOST]}" ] \ - && head -n 1 -- "${_CURRENTHOST_FILE}" | grep -q -E -- "^${CIS[HOST]}" \ + && head -n 1 -- "${_RUNNINGHOST_FILE}" | grep -q -E -- "^${CIS[HOST]}" \ && return 0 return 1 @@ -101,18 +117,18 @@ function composition.shouldRunOnThisHost() { # Therefore a file 'composition-sync-hosts' defines a list of host, one per line, where the composition should be synced to. # The given host either runs the composition or syncs it. function composition.shouldBeSyncedByGivenHost() { - local _COMPOSITION _HOST _COMPOSITION_PATH _CURRENTHOST_FILE _SYNCHOSTS_FILE + local _COMPOSITION _HOST _COMPOSITION_PATH _RUNNINGHOST_FILE _SYNCHOSTS_FILE _COMPOSITION="${1:?"composition.shouldBeSyncedByGivenHost(): Missing first parameter COMPOSITION"}" _HOST="${2:?"composition.shouldBeSyncedByGivenHost(): Missing second parameter HOST"}" _COMPOSITION_PATH="${CIS[COMPOSITIONS]:?"composition.shouldBeSyncedByGivenHost(): Missing CIS_COMPOSITIONS"}${_COMPOSITION}/" - _CURRENTHOST_FILE="${_COMPOSITION_PATH}current-host" + _RUNNINGHOST_FILE="${_COMPOSITION_PATH}running-host" _SYNCHOSTS_FILE="${_COMPOSITION_PATH}composition-sync-hosts" - readonly _COMPOSITION _HOST _COMPOSITION_PATH _CURRENTHOST_FILE _SYNCHOSTS_FILE + readonly _COMPOSITION _HOST _COMPOSITION_PATH _RUNNINGHOST_FILE _SYNCHOSTS_FILE # This host either runs the composition or syncs it. - # If there is no CURRENTHOST_FILE than the definition is invalid and should not be synced. - [ -f "${_CURRENTHOST_FILE}" ] \ - && head -n 1 -- "${_CURRENTHOST_FILE}" | grep -q -v -E -- "^${_HOST}" \ + # If there is no _RUNNINGHOST_FILE than the definition is invalid and should not be synced. + [ -f "${_RUNNINGHOST_FILE}" ] \ + && head -n 1 -- "${_RUNNINGHOST_FILE}" | grep -q -v -E -- "^${_HOST}" \ && grep -q -E -- "^${_HOST}" "${_SYNCHOSTS_FILE}" \ && return 0 diff --git a/script/host/zfs/composition-sync/setupSyncHost.sh b/script/host/zfs/composition-sync/setupSyncHost.sh index f694238..8301b96 100755 --- a/script/host/zfs/composition-sync/setupSyncHost.sh +++ b/script/host/zfs/composition-sync/setupSyncHost.sh @@ -5,14 +5,14 @@ if [ $(id -u) -ne 0 ]; then fi source /cis/core/base.module.sh +base.loadModule composition function setup() { - local _COMPOSITION _COMPOSITIONS_FOLDER _CURRENT_HOST_FILE _SYNC_HOSTS_FILE + local _COMPOSITION _COMPOSITIONS_FOLDER _SYNC_HOSTS_FILE _COMPOSITION="${1}" _COMPOSITIONS_FOLDER="${CIS[DOMAINDEFINITIONS]}compositions/" - _CURRENT_HOST_FILE="${_COMPOSITIONS_FOLDER}${_COMPOSITION}/current-host" _SYNC_HOSTS_FILE="${_COMPOSITIONS_FOLDER}${_COMPOSITION}/composition-sync-hosts" readonly _COMPOSITION _COMPOSITIONS_FOLDER @@ -20,7 +20,7 @@ function setup() { echo echo "No folder for your defined composition settings found: ${_COMPOSITIONS_FOLDER}" echo "Please create it and add your custom composition settings in there, following this convention:" - echo " 1.) './NAME_OF_THE_COMPOSITION/current-host' containing one line with the FQDN of the host running the composition." + echo " 1.) './NAME_OF_THE_COMPOSITION/running-host' containing one line with the FQDN of the host running the composition." echo " 2.) './NAME_OF_THE_COMPOSITION/composition-sync-hosts' containing a list of hosts receiving the composition, one host with its FQDN per line." echo @@ -29,9 +29,8 @@ function setup() { && echo [ -n "${_COMPOSITION}" ] \ - && [ -f "${_CURRENT_HOST_FILE}" ] \ && echo "Current defined host to run composition '${_COMPOSITION}' is:" \ - && cat "${_CURRENT_HOST_FILE}" \ + && composition.printRunningHost "${_COMPOSITION}" \ && echo [ -n "${_COMPOSITION}" ] \ diff --git a/script/host/zfs/composition-sync/sync.sh b/script/host/zfs/composition-sync/sync.sh index a03b1c2..0c80c3e 100755 --- a/script/host/zfs/composition-sync/sync.sh +++ b/script/host/zfs/composition-sync/sync.sh @@ -92,8 +92,7 @@ function receive() { local _RECEIVERHOST _COMPOSITION _SOURCEHOST _SSH_PORT _SSH_COMMAND _SEND_SCRIPT _ZFS_BRANCH _ZFS _COMPOSITION="${1:?"receive(): Missing first parameter COMPOSITION"}" _RECEIVERHOST="${CIS[HOST]:?"Missing CIS_HOST"}" - _SOURCEHOST=$(head -n 1 "${CIS[DOMAINDEFINITIONS]:?"Missing CIS_DOMAINDEFINITIONS"}compositions/${_COMPOSITION}/current-host" 2> /dev/null) - base.set _SOURCEHOST "${_SOURCEHOST}" '^[a-zA-Z0-9][a-zA-Z0-9.-]*$' + base.set _SOURCEHOST "$(composition.printRunningHost "${_COMPOSITION}")" '^[a-zA-Z0-9][a-zA-Z0-9.-]*$' _SSH_PORT=$(head -n 1 "${CIS[DOMAINDEFINITIONS]:?"Missing CIS_DOMAINDEFINITIONS"}compositions/${_COMPOSITION}/ssh-port" 2> /dev/null) base.set _SSH_PORT "${_SSH_PORT:-22}" '^[1-9][0-9]{1,4}$' _SSH_COMMAND="ssh -p ${_SSH_PORT} -o ConnectTimeout=20 -o ServerAliveInterval=15 -C composition-sync@${_SOURCEHOST}" diff --git a/script/host/zfs/snapshot.sh b/script/host/zfs/snapshot.sh index 345aa31..f8d99f2 100755 --- a/script/host/zfs/snapshot.sh +++ b/script/host/zfs/snapshot.sh @@ -91,6 +91,11 @@ function snapshot() { if [ -n "${_ZFS}" ]; then ( flock -n 9 || return 1 + ! composition.shouldRunOnThisHost "${_COMPOSITION}" \ + && printf -- "ZFS will be skipped, because this host '%b' is not running the composition:\n" "${CIS[HOST]}" >&2 \ + && printf -- " - Composition : %b\n" "${_COMPOSITION}" >&2 \ + && printf -- " - Running host: %b\n" "$(composition.printRunningHost "${_COMPOSITION}")" >&2 \ + && continue case "${_MODE:?"Missing MODE"}" in MINUTELY) zfs snapshot "${_ZFS}@SNAPMINUTELY_${_MINUTE}" 2> /dev/null \