222 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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
 | |
| #------------------------------------------------------------------------------
 |