#!/bin/bash # $HeadURL$ $LastChangedRevision$ # Modules . $(miniade) || { echo "${0##*/}: ERROR: miniade failed (hint: run 'miniade' to see error)" >&2; exit 1; } . <(pcms-config --format=shell) # Configurable stuff # Other globals main() { local MY_ARGS # Defaults for options OPT_OWNER=root OPT_GROUP=root OPT_PERMS=644 OPT_BACKUP_FLAG=true OPT_COMMENT_FLAG=true # Process options special_opts_handler() { case $1 in --owner=*) OPT_OWNER=${1#*=} ;; --group=*) OPT_GROUP=${1#*=} ;; --perms=*) OPT_PERMS=${1#*=} ;; --backup) OPT_BACKUP_FLAG=true ;; --no-backup) OPT_BACKUP_FLAG=false ;; --comment) OPT_COMMENT_FLAG=true ;; --no-comment) OPT_COMMENT_FLAG=false ;; *) return 1 ;; esac } miniade_process_options --help-handler=help --special-opts-handler=special_opts_handler MY_ARGS "$@" && set -- "${MY_ARGS[@]}" # Process arguments [ $# = 1 ] || miniade_bad_usage eval "GENERATOR_ABSFILE=\"\$(realpath \"\$$#\")\"" # Sanity checks and derivations TARGET="$PCMS_STATE_PREFIX/generated-files/${GENERATOR_ABSFILE#*/generators/}" miniade_debug 5 "main: TARGET=$TARGET" TMP_TARGET=/tmp/$PROGNAME.$$ COMMENT="# This file was generated by $PROGNAME on $(date) for host $HOSTNAME. Manual edits will be lost!" COMMENT_REGEXP="^${COMMENT/on * for/on .* for}\$" miniade_debug 5 "main: COMMENT_REGEXP=[$COMMENT_REGEXP]" # Guts miniade_debug 5 "main: $TARGET: generating ..." mkdir -p "${TARGET%/*}" { ! $OPT_BACKUP_FLAG; } || [ ! -f "$TARGET" ] || cp "$TARGET" "$TARGET.bak" { { ! $OPT_COMMENT_FLAG; } || echo "$COMMENT" RC=0 bash "$1" || RC=$? } > "$TMP_TARGET" if [ $RC != 0 ]; then rm -f "$TMP_TARGET" miniade_error "failed to generate (hint: see messages above)" fi chown "$OPT_OWNER" "$TMP_TARGET" chgrp "$OPT_GROUP" "$TMP_TARGET" chmod "$OPT_PERMS" "$TMP_TARGET" if [ ! -f "$TARGET" ]; then miniade_debug 5 "main: $TARGET: does not exist" MOVE_FLAG=true elif ! diff -I "$COMMENT_REGEXP" "$TMP_TARGET" "$TARGET" > /dev/null; then miniade_debug 5 "main: $TARGET: exists but differs" MOVE_FLAG=true elif [ $(stat -c %U "$TARGET") != $OPT_OWNER -o $(stat -c %G "$TARGET") != $OPT_GROUP -o $(stat -c %a "$TARGET") != $OPT_PERMS ]; then miniade_debug 5 "main: $TARGET: exists, doesn't differ but has wrong owner/group/perms" MOVE_FLAG=true else miniade_debug 5 "main: $TARGET: identical" MOVE_FLAG=false fi if $MOVE_FLAG; then mv "$TMP_TARGET" "$TARGET" else rm -f "$TMP_TARGET" fi } help() { local PROGNAME miniade_get_progname PROGNAME echo "Usage: $PROGNAME [ ] [ --owner= ] [ --group= ] [ --perms= ]