#!/bin/bash # $HeadURL$ $LastChangedRevision$ set -e PROGNAME=$(basename $0) # Load support functions . $(pcms-config PCMS_SHARE_PREFIX)/scripts/support.sh main() { local REAL_FUNCTION PRESENT BEFORE AFTER TEXT FILE REPLACE STATE # Defaults for options VERBOSELEVEL=2 LOGIC=true PRESENT=unset BEFORE=unset AFTER=unset REPLACE=unset TEXT=unset FILE=unset # Process options while [ $# -ge 1 ]; do case $1 in --present=*) PRESENT="${1#*=}" ;; --before=*) BEFORE="${1#*=}" ;; --after=*) AFTER="${1#*=}" ;; --replace=*) REPLACE="${1#*=}" ;; --text=*) TEXT="${1#*=}" ;; --file=*) FILE=${1#*=} ;; -d) VERBOSELEVEL=$2; shift ;; --debug=*) VERBOSELEVEL=${1#*=} ;; -v|--verbose) VERBOSELEVEL=3 ;; --) shift; break ;; -*) error "main: $1: bad option" ;; *) break ;; esac shift done ## Sanity checks and derivations check_not_unset TEXT FILE check_all_but_one_unset AFTER BEFORE REPLACE if [[ $PRESENT = unset ]]; then PRESENT=$TEXT PRESENT="${PRESENT//./\\.}" PRESENT="${PRESENT//\*/\\*}" PRESENT="${PRESENT//\+/\\+}" PRESENT="${PRESENT//\(/\\\(}" PRESENT="${PRESENT//\)/\\\)}" PRESENT="^$PRESENT\$" debug 4 "main: PRESENT not defined; converted [$TEXT] safe regexp [$PRESENT]" fi if [ "X$BEFORE" = XSOF ]; then warning "please use 'BOF' instead of 'SOF'" BEFORE=BOF fi # Get state if [ ! -f $FILE -o ! -r $FILE ]; then STATE=unconfigured elif perlgrep "$PRESENT" $FILE; then STATE=configured else STATE=unconfigured fi debug 4 "main: STATE=$STATE" # If already in desired state, do nothing if $LOGIC && [ $STATE = configured ]; then return 0 elif ! $LOGIC && [ $STATE = unconfigured ]; then return 0 # Make changes elif ! $LOGIC && [ $STATE = configured ]; then internal "not implemented" elif $LOGIC && [ $STATE = unconfigured ]; then mkdir -p $(dirname $FILE) touch $FILE if [[ $AFTER =~ ^EOF$ ]]; then echo "$TEXT" >> $FILE elif [[ $BEFORE =~ ^BOF$ ]]; then TMP_FILE=$(mktemp) { echo "$TEXT"; cat $FILE; } > $TMP_FILE cat $TMP_FILE > $FILE rm -f $TMP_FILE elif [[ $AFTER != unset ]] && perlgrep "$AFTER" $FILE; then perl -pi -e 'BEGIN { sub r { ($s)=@_; $s =~ s/\\\\/\\/g; $s =~ s/\\n/\n/g; $s =~ s/\\t/\t/g; return $s; } $desired_after = &r(shift); $desired_text = &r(shift); } s/($desired_after)/$1\n$desired_text/;' "$AFTER" "$TEXT" $FILE elif [[ $AFTER != unset ]]; then error "$FILE: $AFTER: not found in file (1)" elif [[ $BEFORE != unset ]] && perlgrep "$BEFORE" $FILE; then perl -pi -e 'BEGIN { sub r { ($s)=@_; $s =~ s/\\\\/\\/g; $s =~ s/\\n/\n/g; $s =~ s/\\t/\t/g; return $s; } $desired_before = &r(shift); $desired_text = &r(shift); } s/($desired_before)/$desired_text\n$1/;' "$BEFORE" "$TEXT" $FILE elif [[ $BEFORE != unset ]]; then error "$FILE: $BEFORE: not found in file (2)" elif [[ $BEFORE != unset ]] && perlgrep "$BEFORE" $FILE; then perl -pi -e 'BEGIN { sub r { ($s)=@_; $s =~ s/\\\\/\\/g; $s =~ s/\\n/\n/g; $s =~ s/\\t/\t/g; return $s; } $desired_before = &r(shift); $desired_text = &r(shift); } s/($desired_before)/$desired_text\n$1/;' "$BEFORE" "$TEXT" $FILE elif [[ $BEFORE != unset ]]; then error "$FILE: $BEFORE: not found in file (3)" elif [[ $REPLACE != unset ]] && perlgrep "$REPLACE" $FILE; then perl -pi -e 'BEGIN { sub r { ($s)=@_; $s =~ s/\\\\/\\/g; $s =~ s/\\n/\n/g; $s =~ s/\\t/\t/g; return $s; } $desired_replace = &r(shift); $desired_text = &r(shift); } s/$desired_replace/$desired_text/;' "$REPLACE" "$TEXT" $FILE elif [[ $REPLACE != unset ]]; then error "$FILE: $REPLACE: not found in file (4)" else internal "this should not happen" fi fi } perlgrep() { local PATTERN FILE RC PATTERN="$1" FILE="$2" RC=0 perl -ne 'BEGIN { sub r { ($s)=@_; $s =~ s/\\\\/\\/g; $s =~ s/\\n/\n/g; $s =~ s/\\t/\t/g; return $s; } $rc = 1; $pattern = &r(shift); } END { exit $rc; } if (/$pattern/) { $rc=0; last; }' "$PATTERN" "$FILE" || RC=$? return $RC } main "$@"