mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 11:22:27 +00:00 
			
		
		
		
	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:
		
							
								
								
									
										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 | ||||
		Reference in New Issue
	
	Block a user