#!/usr/bin/env bash # # Hook for updating local configuration on each pull. This will automatically put files in their # right places, but will not enable or start any services automatically; this is left to the user. # # Move this to '.git/hooks/post-merge' to have to run automatically after every 'git pull' operation. # The script assumes write access to host directories, and a CoreOS host. Don't run on other systems! set -euo pipefail shopt -s globstar # Global configuration variables. TEMP_CONFIG_PATH="$(git -C "$(dirname "$0")" rev-parse --show-toplevel)" HOST_CONFIG_PATH="/etc/coreos-home-server" SYSTEMD_CONFIG_PATH="/etc/systemd/system" # Synchronize CoreOS home-server configuration for specific path. function sync-coreos-config() { local path="$1" # Search for configuration in any of the local configuration sub-directories. for dir in "$TEMP_CONFIG_PATH"/config/*/"$(basename "$path")"; do if test ! -d "$dir"; then echo "configuration not found, skipping." return fi # Remove files that only exist in local configuration. for f in $(comm -23 <(cd "$path"; find . | sort) <(cd "$dir"; find . | sort)); do # Don't delete environment files, as these are required for active services. if test "$(basename --suffix=.env "$f")" != "$(basename "$f")"; then continue fi rm --verbose --recursive --force "$(realpath --quiet "$path/$f")" done # Update timestamp for temporary file to match last commit time, in order to ensure # correct partial updates. for f in "$dir/"**; do touch --date="$(git -C "$TEMP_CONFIG_PATH" log -n 1 --pretty=format:%cd --date=iso --date-order -- "$f")" -- "$f" done # Copy files from temporary directory to host configuration directory. cp --verbose --recursive --update --target-directory "$path" "$dir"/* echo "done." done } # Synchronize systemd service files from CoreOS home-server configuration. function sync-systemd-services() { local result=1 local dest # Copy service files if newer than destination. for src in "$HOST_CONFIG_PATH"/*/systemd/*; do dest="$SYSTEMD_CONFIG_PATH/$(basename "$src")" if test "$src" -nt "$dest"; then cp --verbose --recursive "$src" "$dest" result=0 fi done echo "done." return $result } # Synchronize all existing CoreOS home-server configuration. for dir in "$HOST_CONFIG_PATH"/*; do if test ! -d "$dir"; then continue fi echo -n "Synchronizing host configuration for '$dir'... " sync-coreos-config "$dir" done # Synchronize systemd services from local CoreOS home-server configuration. echo -n "Synchronizing systemd service files... " if sync-systemd-services; then echo "Reloading systemd daemon after service updates." systemctl daemon-reload fi