#!/bin/bash

# This script is executed when a guest agent receives fsfreeze-freeze and
# fsfreeze-thaw command, if it is specified in --fsfreeze-hook (-F)
# option of qemu-ga or placed in default path (/etc/qemu/fsfreeze-hook).
# When the agent receives fsfreeze-freeze request, this script is issued with
# "freeze" argument before the filesystem is frozen. And for fsfreeze-thaw
# request, it is issued with "thaw" argument after filesystem is thawed.

LOGFILE=/var/log/qemu-ga/fsfreeze-hook.log

# Check whether file $1 is a backup or rpm-generated file and should be ignored
is_ignored_file() {
    case "$1" in
        *~ | *.bak | *.orig | *.rpmnew | *.rpmorig | *.rpmsave | *.sample)
            return 0 ;;
    esac
    return 1
}

shopt -s nullglob
RELPATH=qemu-ga/fsfreeze-hook.d

for DIR in lib etc run; do
  for FILE in /"$DIR/$RELPATH"/*; do
    if is_ignored_file "$FILE" || ! [ -x "$FILE" ]; then
      continue
    fi
    BNAME=$(basename -- "$FILE")
    if ( [ lib = "$DIR" ] && ( [ -e /etc/"$RELPATH/$BNAME" ] ||
                               [ -e /run/"$RELPATH/$BNAME" ] ) ) ||
       ( [ etc = "$DIR" ] && ( [ -e /run/"$RELPATH/$BNAME" ] ) ); then
      continue
    fi

    printf "$(date): execute $FILE $@\n" >>$LOGFILE
    "$FILE" "$@" >>$LOGFILE 2>&1
    STATUS=$?
    printf "$(date): $FILE finished with status=$STATUS\n" >>$LOGFILE
  done
done

exit 0
