merge script to be run by xdcp to support the MERGE function, more testing needed
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@13344 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
parent
5dea590474
commit
68736e5789
105
xCAT-server/share/xcat/scripts/xdcpmerge.sh
Executable file
105
xCAT-server/share/xcat/scripts/xdcpmerge.sh
Executable file
@ -0,0 +1,105 @@
|
||||
#!/bin/sh
|
||||
# This script is used by the xdcp MERGE: function to perform the
|
||||
# merge operation on the nodes for the /etc/passwd, /etc/shadow and
|
||||
# and /etc/group files. These are the only supported files for merge.
|
||||
# The MERGE function is also only supported on Linux.
|
||||
#First parameter is nodesyncfiledir
|
||||
#The next parameter is the MERGE clause put in the following format
|
||||
#mergefile1:currfile1 mergefile2:currfile2.....
|
||||
#For example:
|
||||
#/tmp/myusers:/etc/passwd /tmp/mypasswds:/etc/shadow /tmp/mygrps:/etc/group
|
||||
#
|
||||
#this is the base path to the merge directory
|
||||
logger -t xCAT "xdcp merge started"
|
||||
nodesyncfiledir=$1
|
||||
#this is the backup copy of the original current file
|
||||
nodesyncfiledirorg="$nodesyncfiledir/org"
|
||||
#this is the path to merge working files
|
||||
nodesyncfiledirmerge="$nodesyncfiledir/merge"
|
||||
#this is the path to the files containing the merge data
|
||||
nodesynfiledirmergefiles="$nodesyncfiledir/merge/mergefiles"
|
||||
skip=0
|
||||
# for each input parameter
|
||||
for i in $*; do
|
||||
# skip first parm
|
||||
if [ $skip -eq 0 ]; then
|
||||
skip=1
|
||||
continue
|
||||
fi
|
||||
# get the merge file path and name, for example /tmp/myusers
|
||||
mergefilename=`echo "$i"|cut -d ':' -f 1`
|
||||
# get location on the node
|
||||
mergefile="$nodesynfiledirmergefiles$mergefilename"
|
||||
# get the file path and name to merge into, for example /etc/passwd
|
||||
curfile=`echo "$i"|cut -d ':' -f 2`
|
||||
|
||||
# if curfile not /etc/passwd or /etc/shadow or /etc/group
|
||||
# exit error
|
||||
#if [ "$curfile" != "/etc/passwd" ] && [ "$curfile" != "/etc/shadow" ] && [ "$curfile" != "/etc/group" ]; then
|
||||
# `logger -t xCAT -p local4.err "Merge: $curfile is not /etc/passwd or /etc/shadow or /etc/group. It cannot be processes." `
|
||||
# exit 1
|
||||
#fi
|
||||
# get the directory to backup the original file
|
||||
curfiledir=`dirname $curfile`
|
||||
curfilename=`basename $curfile`
|
||||
filebackupdir="$nodesyncfiledirorg$curfiledir"
|
||||
# name of the path to the backup of original file
|
||||
filebackup="$nodesyncfiledirorg$curfile"
|
||||
# now do the work
|
||||
# make the necessary directories
|
||||
mkdir -p $filebackupdir
|
||||
# copy current to backup
|
||||
cp -p $curfile $filebackup
|
||||
|
||||
# Go though the backup copy and remove duplicate lines that are
|
||||
# in the merge file and create a new backup
|
||||
# first get a list of duplicate lines to remove
|
||||
# based on only username: the first field in the file
|
||||
cut -d: -f1 $filebackup > $filebackup.userlist
|
||||
cut -d: -f1 $mergefile > $mergefile.userlist
|
||||
comm -12 <(sort $filebackup.userlist | uniq) <(sort $mergefile.userlist | uniq) > $filebackup.remove
|
||||
|
||||
# now if there is a remove file, use it to remove the dup lines in backup
|
||||
# Need to buit a command like the following with all users
|
||||
#grep -v -E ^(root|bin|...) $filebackup > $filebackup.nodups
|
||||
if [ -s "$filebackup.remove" ]; then
|
||||
grepcmd="grep -v -E "
|
||||
removeusers=`cat $filebackup.remove`
|
||||
startlist="'^("
|
||||
userlist=$startlist
|
||||
delim="|"
|
||||
for u in $removeusers
|
||||
do
|
||||
userlist=$userlist$u$delim
|
||||
done
|
||||
# remove the last delimiter
|
||||
userlisttmp="${userlist%?}"
|
||||
listend=")'"
|
||||
userlist=$userlisttmp$listend
|
||||
grepcmd=$grepcmd$userlist
|
||||
#set -x
|
||||
grepcmd="$grepcmd $filebackup > $filebackup.nodups"
|
||||
#echo "grepcmd=$grepcmd"
|
||||
# now run it
|
||||
eval $grepcmd
|
||||
# if no dups file created
|
||||
if [ -s "$filebackup.nodups" ]; then
|
||||
cp -p $filebackup.nodups $filebackup
|
||||
#echo "cp -p $filebackup.nodups $filebackup"
|
||||
rm $filebackup.nodups
|
||||
fi
|
||||
fi
|
||||
# Now update the currentfile
|
||||
cat $filebackup $mergefile > $curfile
|
||||
#echo "cat $filebackup $mergefile > $curfile"
|
||||
# now cleanup
|
||||
rm $filebackup.userlist
|
||||
# echo "rm $filebackup.userlist"
|
||||
rm $filebackup.remove
|
||||
# echo "rm $filebackup.remove"
|
||||
rm $mergefile.userlist
|
||||
# echo "rm $mergefile.userlist"
|
||||
|
||||
done
|
||||
logger -t xCAT "xdcp merge complete"
|
||||
exit 0
|
Loading…
Reference in New Issue
Block a user