196610da2STomoki Sekiyama#!/bin/sh 296610da2STomoki Sekiyama 396610da2STomoki Sekiyama# This script is executed when a guest agent receives fsfreeze-freeze and 496610da2STomoki Sekiyama# fsfreeze-thaw command, if it is specified in --fsfreeze-hook (-F) 596610da2STomoki Sekiyama# option of qemu-ga or placed in default path (/etc/qemu/fsfreeze-hook). 696610da2STomoki Sekiyama# When the agent receives fsfreeze-freeze request, this script is issued with 796610da2STomoki Sekiyama# "freeze" argument before the filesystem is frozen. And for fsfreeze-thaw 896610da2STomoki Sekiyama# request, it is issued with "thaw" argument after filesystem is thawed. 996610da2STomoki Sekiyama 1096610da2STomoki SekiyamaLOGFILE=/var/log/qga-fsfreeze-hook.log 1196610da2STomoki SekiyamaFSFREEZE_D=$(dirname -- "$0")/fsfreeze-hook.d 1296610da2STomoki Sekiyama 1396610da2STomoki Sekiyama# Check whether file $1 is a backup or rpm-generated file and should be ignored 1496610da2STomoki Sekiyamais_ignored_file() { 1596610da2STomoki Sekiyama case "$1" in 167294e600SChristian Ehrhardt *~ | *.bak | *.orig | *.rpmnew | *.rpmorig | *.rpmsave | *.sample | *.dpkg-old | *.dpkg-new | *.dpkg-tmp | *.dpkg-dist | *.dpkg-bak | *.dpkg-backup | *.dpkg-remove) 1796610da2STomoki Sekiyama return 0 ;; 1896610da2STomoki Sekiyama esac 1996610da2STomoki Sekiyama return 1 2096610da2STomoki Sekiyama} 2196610da2STomoki Sekiyama 22*85978dfbSDehan MengUSE_SYSLOG=0 23*85978dfbSDehan Meng# if log file is not writable, fallback to syslog 24*85978dfbSDehan Meng[ ! -w "$LOGFILE" ] && USE_SYSLOG=1 25*85978dfbSDehan Meng# try to update log file and fallback to syslog if it fails 26*85978dfbSDehan Mengtouch "$LOGFILE" &>/dev/null || USE_SYSLOG=1 27*85978dfbSDehan Meng 28*85978dfbSDehan Meng# Ensure the log file is writable, fallback to syslog if not 29*85978dfbSDehan Menglog_message() { 30*85978dfbSDehan Meng local message="$1" 31*85978dfbSDehan Meng if [ "$USE_SYSLOG" -eq 0 ]; then 32*85978dfbSDehan Meng printf "%s: %s\n" "$(date)" "$message" >>"$LOGFILE" 33*85978dfbSDehan Meng else 34*85978dfbSDehan Meng logger -t qemu-ga-freeze-hook "$message" 35*85978dfbSDehan Meng fi 36*85978dfbSDehan Meng} 37*85978dfbSDehan Meng 3896610da2STomoki Sekiyama# Iterate executables in directory "fsfreeze-hook.d" with the specified args 3996610da2STomoki Sekiyama[ ! -d "$FSFREEZE_D" ] && exit 0 40*85978dfbSDehan Meng 4196610da2STomoki Sekiyamafor file in "$FSFREEZE_D"/* ; do 4296610da2STomoki Sekiyama is_ignored_file "$file" && continue 4396610da2STomoki Sekiyama [ -x "$file" ] || continue 44*85978dfbSDehan Meng 45*85978dfbSDehan Meng log_message "Executing $file $@" 46*85978dfbSDehan Meng if [ "$USE_SYSLOG" -eq 0 ]; then 47*85978dfbSDehan Meng "$file" "$@" >>"$LOGFILE" 2>&1 4896610da2STomoki Sekiyama STATUS=$? 49*85978dfbSDehan Meng else 50*85978dfbSDehan Meng "$file" "$@" 2>&1 | logger -t qemu-ga-freeze-hook 51*85978dfbSDehan Meng STATUS=${PIPESTATUS[0]} 52*85978dfbSDehan Meng fi 53*85978dfbSDehan Meng 54*85978dfbSDehan Meng if [ $STATUS -ne 0 ]; then 55*85978dfbSDehan Meng log_message "Error: $file finished with status=$STATUS" 56*85978dfbSDehan Meng else 57*85978dfbSDehan Meng log_message "$file finished successfully" 58*85978dfbSDehan Meng fi 5996610da2STomoki Sekiyamadone 6096610da2STomoki Sekiyama 6196610da2STomoki Sekiyamaexit 0 62