gridengine/flex-grid/scripts/GridEngine-git-config

222 lines
5.4 KiB
Bash
Executable File

#!/bin/sh
#
# Snapshot of the current GridEngine configuration using git for the
# backend storage and tracking mechanism.
#
# Should normally be called via a cronjob.
#
# Following Edward Dale's idea:
# http://scompt.com/blog/archives/2009/10/13/versioned-grid-engine-configuration
# but using git for the backend
#
# initialize:
#
# git --git-dir=$GIT_DIR init --bare --shared=world
#
# Note: we use Perl for inplace editing since some versions of sed have
# problems with this task.
################################################################################
################################################################################
# CUSTOMIZE THESE SETTINGS TO MATCH YOUR REQUIREMENTS:
SGE_ROOT=/opt/grid
SGE_CELL=default
GIT_DIR=/data/cfd/share/git-repo/gridengine-config.git
#
# END OF CUSTOMIZE SETTINGS
################################################################################
################################################################################
Script=${0##.*/}
saveScript="$SGE_ROOT/util/upgrade_modules/save_sge_config.sh"
export SGE_ROOT SGE_CELL GIT_DIR
for i in git perl
do
type $i >/dev/null 2>&1 || {
echo "Error: $Script - no '$i' found"
exit 1
}
done
#------------------------------------------------------------------------------
usage() {
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
cat<<USAGE
usage: ${0##*/} [OPTION | GIT_COMMAND]
options:
-help display this usage
init initialize git repo in $GIT_DIR
pass-through git commands:
log ls-files
show whatchanged
Snapshot of the current GridEngine configuration using git for the
backend storage and tracking mechanism.
* git repository stored here:
$GIT_DIR
copyright (c) 2009-10 <Mark.Olesen@faurecia.com>
USAGE
exit 1
}
#------------------------------------------------------------------------------
# parse options
while [ "$#" -gt 0 ]
do
case "$1" in
( help | -h | -help )
usage
;;
( init )
shift
if [ -d "$GIT_DIR" ]
then
echo "Error: $Script - $GIT_DIR already exists"
exit 1
else
git --git-dir=$GIT_DIR init --bare --shared=world $@
rc=$?
# add a description for gitweb
i="$GIT_DIR/description"
if [ -f "$i" -a -w "$i" ]
then
echo "snapshot of the current GridEngine configuration" > $i
fi
fi
exit $rc
;;
( log | ls-files | show | whatchanged )
git --git-dir=$GIT_DIR $@
exit $?
;;
(*)
usage "unknown option/argument: '$*'"
;;
esac
done
[ -d "$GIT_DIR" ] || {
echo "git repo: $GIT_DIR does not exist"
exit 1
}
i="$SGE_ROOT/$SGE_CELL/common/settings.sh"
if [ -f "$i" -a -r "$i" ]
then
. "$i"
else
echo "cannot read $i"
exit 1
fi
[ -f "$saveScript" -a -r "$saveScript" ] || {
echo "cannot read $i"
exit 1
}
# Create a fresh empty directory
# cannot use --tmpdir on older systems
tmpDir=$(mktemp -d "/tmp/sgeSaveConfig.XXXXXXXXXX")
trap "rm -rf $tmpDir 2>/dev/null; exit 0" EXIT TERM INT
[ -d "$tmpDir" ] || {
echo "Error: temp dir '$tmpDir' does not exist"
exit 1
}
$saveScript $tmpDir
#------------------------------------------------------------------------------
# cleanup
#
(
cd $tmpDir || exit 1
# all operations are now in the current directory
GIT_WORK_TREE=.
export GIT_WORK_TREE
# minor error checking that the save script worked
if [ -f backup_date -a -r backup_date ]
then
msg=$(cat backup_date)
else
echo "cannot read backup_date - $saveScript might have failed"
exit 1
fi
# ignore accounting (too big)
rm -f cell/accounting
# ignore current users
rm -f users/*
# ignore current load_values for exec hosts
perl -i -ne '/^load_values/ or print' execution/*
# assign (consumable) complex_values to zero - otherwise we indirectly
# track the external license usage when qlicserver is being used
# also sort the complexes to avoid spurious changes
perl -i -p -e 'if (/^complex_values/) { chomp; ' \
-e 's/=\d+/=0/g; s/^(complex\S+\s+)//; ' \
-e '$_ = $1 . join("," => sort split /,/) . "\n" }' \
execution/global
#
# determine if the configuration changed
#
# this is fairly roundabout until we find a better way
needsCommit=false
if [ -n "$(git ls-files -d)" ] # files deleted?
then
needsCommit=true
elif [ -n "$(git ls-files -o)" ] # files added?
then
needsCommit=true
else
# files modified?
# do it the long way to ensure we also get staged modifications
set -- $(git status | perl -ne 's/^#\s+modified:// and print')
# changes in backup_date, jobseqnum etc alone are not enough
# to warrant a commit
while [ "$#" -ge 1 ]
do
case $1 in
( arseqnum | backup_date | jobseqnum )
shift
;;
(*)
needsCommit=true
break
;;
esac
done
fi
if [ "$needsCommit" = true ]
then
# register all new files
git add .
# commit everything
git commit -a -m "$msg"
else
echo "no changes to be committed $msg"
fi
)
exit 0
#------------------------------------------------------------------------------