diff --git a/xCAT-server/share/xcat/scripts/xdcpmerge.sh b/xCAT-server/share/xcat/scripts/xdcpmerge.sh new file mode 100755 index 000000000..81f65b68e --- /dev/null +++ b/xCAT-server/share/xcat/scripts/xdcpmerge.sh @@ -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