#!/bin/bash

# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html

# Common script to make any one the xcat rpms.  To build locally, run in the top dir of local svn repository, for example:
#   ./makerpm xCAT-server
#   ./makerpm xCAT x86_64
# If you want verbose output:  export VERBOSE=1

# set -x

function xcat_probe_copy {
    # xCAT-probe uses some functions shipped with xCAT,  copying for the following reasons:
    #     1. make xCAT-probe code be self-contained
    #     2. do not maintain two files for each script
    #     3. symbolic link can't work during packaging
    RPMNAME=${1}
    if [ $RPMNAME = "xCAT-probe" ]; then
        mkdir -p ${RPMNAME}/lib/perl/xCAT/
        files=("NetworkUtils.pm" "GlobalDef.pm" "ServiceNodeUtils.pm")
        for f in "${files[@]}"; do
            cp perl-xCAT/xCAT/$f ${RPMNAME}/lib/perl/xCAT/
        done
   fi
}

function xcat_probe_cleanup { 
   RPMNAME=${1}
   if [ $RPMNAME = "xCAT-probe" ]; then
       rm -rf ${RPMNAME}/lib/perl/xCAT/
   fi
}

# Make the noarch rpms
function makenoarch {
	RPMNAME=$1
	if [ "$OSNAME" = "AIX" ]; then
		echo '.svn' > /tmp/xcat-excludes
		tar -X /tmp/xcat-excludes -cf $RPMROOT/SOURCES/$RPMNAME-$VER.tar $RPMNAME
		gzip -f $RPMROOT/SOURCES/$RPMNAME-$VER.tar
		rm -f $RPMROOT/SRPMS/$RPMNAME-$VER*rpm $RPMROOT/RPMS/ppc/$RPMNAME-$VER*rpm
		echo "Building $RPMROOT/RPMS/ppc/$RPMNAME-$VER-snap*.ppc.rpm $EMBEDTXT..."
		rpm $QUIET -ba $RPMNAME/$RPMNAME.spec
		RC=$?
	else	# linux
		echo "Building $RPMROOT/RPMS/noarch/$RPMNAME-$VER-snap*.noarch.rpm $EMBEDTXT..."
		# TODO: should fix this up, this is a hack for the new build machine
		if [ $RPMNAME = "xCAT-UI" ]; then 
			# Only if the old compiler.jar file does not exist.....
			if [ ! -e /xcat2/build/tools/compiler.jar ]; then 
				# look for the dynamic location of the compiler.jar file
				DIRNAME=`dirname $(readlink -f $0)`
				COMPILER_JAR=`echo "${DIRNAME%%linux_rpm/*}tools/compiler.jar"`
				if [ -f $COMPILER_JAR ]; then 
					sed -i "s#/xcat2/build/tools/compiler.jar#${COMPILER_JAR}#g" xCAT-UI/xCAT-UI.spec
				else 
					# In c910, if using the old buildxcat scripts...
					COMPILER_JAR=`echo "${DIRNAME%%old/*}xcat2/tools/compiler.jar"`
					if [ -f $COMPILER_JAR ]; then 
						sed -i "s#/xcat2/build/tools/compiler.jar#${COMPILER_JAR}#g" xCAT-UI/xCAT-UI.spec
					fi
				fi
			fi 
		fi

                xcat_probe_copy ${RPMNAME}

		tar --exclude .svn -czf $RPMROOT/SOURCES/$RPMNAME-$VER.tar.gz $RPMNAME
		rm -f $RPMROOT/SRPMS/$RPMNAME-$VER*rpm $RPMROOT/RPMS/noarch/$RPMNAME-$VER*rpm
		rpmbuild $QUIET -ta $RPMROOT/SOURCES/$RPMNAME-$VER.tar.gz --define "version $VER" $REL "$EASE"
		RC=$?

		if [ $RPMNAME = "xCAT-UI" ]; then
			# undo the modifications above to leave the sandbox prestine on the build machine
			git checkout xCAT-UI/xCAT-UI.spec
		fi

                xcat_probe_cleanup ${RPMNAME}

	fi
}



# Make one of the following rpms: xCAT, xCATsn, xCAT-buildkit, xCAT-OpenStack
function makexcat {
	if [ "$OSNAME" != "AIX" -a "$1" != "xCAT-buildkit" -a -z "$2" ]; then
		echo 'Usage: makerpm <RPMname> <arch> [<embedded-system>]'
		exit 1
	fi

	RPMNAME="$1"

	if [ "$OSNAME" = "AIX" ]; then
		source=/opt/freeware/src/packages
		cd `dirname $0`/$RPMNAME
		echo '.svn' > /tmp/xcat-excludes
		echo 'upflag' >> /tmp/xcat-excludes

		if [ "$RPMNAME" = "xCAT" ]; then
			tar -X /tmp/xcat-excludes -cf $RPMROOT/SOURCES/postscripts.tar  postscripts LICENSE.html
			gzip -f $RPMROOT/SOURCES/postscripts.tar
			tar -X /tmp/xcat-excludes -cf $RPMROOT/SOURCES/templates.tar templates
			gzip -f $RPMROOT/SOURCES/templates.tar
			cp xcat.conf $RPMROOT/SOURCES
			cp xcat.conf.apach24 $RPMROOT/SOURCES
			cp xCATMN $RPMROOT/SOURCES
		else	# xCATsn
			tar -X /tmp/xcat-excludes -cf $RPMROOT/SOURCES/license.tar LICENSE.html
			gzip -f $RPMROOT/SOURCES/license.tar
			cp xCATSN $RPMROOT/SOURCES
		fi

		rm -f $RPMROOT/SRPMS/$RPMNAME-$VER*rpm $RPMROOT/RPMS/ppc/$RPMNAME-$VER*rpm
		cd - >/dev/null

		echo "Building $RPMROOT/RPMS/ppc/$RPMNAME-$VER-snap*.ppc.rpm $EMBEDTXT..."
		rpm $QUIET -ba $RPMNAME/$RPMNAME.spec
		RC=$?
	else	# linux
		ARCH="$2"
		TARGET="--target $ARCH"

		if [ "$RPMNAME" = "xCAT" ]; then
			cd `dirname $0`/
			# shipping bmcsetup and getipmi scripts as part of postscripts
			files=("bmcsetup" "getipmi")
			for f in "${files[@]}"; do
				cp "xCAT-genesis-scripts/bin/"$f ${RPMNAME}/postscripts/$f
				sed -i  "s/xcat.genesis.$f/$f/g" ${RPMNAME}/postscripts/$f
			done
			cd `dirname $0`/$RPMNAME
			tar --exclude .svn --exclude upflag -czf $RPMROOT/SOURCES/postscripts.tar.gz  postscripts LICENSE.html
			tar --exclude .svn -czf $RPMROOT/SOURCES/prescripts.tar.gz  prescripts
			tar --exclude .svn -czf $RPMROOT/SOURCES/templates.tar.gz templates
			tar --exclude .svn -czf $RPMROOT/SOURCES/winpostscripts.tar.gz winpostscripts
			tar --exclude .svn -czf $RPMROOT/SOURCES/etc.tar.gz etc
			cp xcat.conf $RPMROOT/SOURCES
			cp xcat.conf.apach24 $RPMROOT/SOURCES
			cp xCATMN $RPMROOT/SOURCES
			cd - >/dev/null
		elif [ "$RPMNAME" = "xCATsn" ]; then
			cd `dirname $0`/$RPMNAME
			tar --exclude .svn -czf $RPMROOT/SOURCES/license.tar.gz LICENSE.html
			cp xcat.conf $RPMROOT/SOURCES
			cp xcat.conf.apach24 $RPMROOT/SOURCES
			cp xCATSN $RPMROOT/SOURCES
                        cp -a ../xCAT/etc/rsyslog.d $RPMROOT/
                        cp -a ../xCAT/etc/logrotate.d $RPMROOT/ 
			cd - >/dev/null
		elif [ "$RPMNAME" = "xCAT-buildkit" ]; then
			ARCH="noarch"
			TARGET=""
			tar --exclude .svn --exclude xCAT-buildkit.spec -czf $RPMROOT/SOURCES/$RPMNAME-$VER.tar.gz $RPMNAME
		elif [ "$RPMNAME" = "xCAT-OpenStack" ]; then
			tar --exclude .svn --exclude xCAT-OpenStack.spec -czf $RPMROOT/SOURCES/$RPMNAME-$VER.tar.gz $RPMNAME
		else	# do not recognize rpm
			echo "Unrecognized rpm: $RPMNAME"
			exit 2
		fi

		rm -f $RPMROOT/SRPMS/$RPMNAME-$VER*rpm $RPMROOT/RPMS/$ARCH/$RPMNAME-$VER*rpm
		echo "Building $RPMROOT/RPMS/$ARCH/$RPMNAME-$VER-snap*.$ARCH.rpm $EMBEDTXT..."
		rpmbuild $QUIET -ba $RPMNAME/$RPMNAME.spec $TARGET --define "version $VER" $REL "$EASE"
		RC=$?
		if [ "$RPMNAME" = "xCAT" ]; then
			files=("bmcsetup" "getipmi")
			for f in "${files[@]}"; do
				rm -f `dirname $0`/${RPMNAME}/postscripts/$f
			done
		fi
	fi
}

# make ironic rpm for ironic baremetal driver
function makeironic {
	RPMNAME="$1"
	ARCH="$2"
	cd `dirname $0`/$RPMNAME    
	cp -rf ironic_baremetal /tmp/
	cd /tmp/ironic_baremetal
	git init
	git add *
	git commit -a -m "generate rpm"
	python setup.py bdist_rpm
	rm -rf $RPMROOT/RPMS/$ARCH/
	mkdir -p $RPMROOT/RPMS/$ARCH/
	cp -rf dist/*.rpm $RPMROOT/RPMS/$ARCH/
	rm -rf /tmp/ironic_baremetal
}	
	
# Make the xCAT-genesis rpm
function makegenesis {
	DIR="xCAT-genesis-builder"
	SPEC_FILE="xCAT-genesis-base.spec"
	RPMNAME="$1"
	cd `dirname $0`/$DIR
	sed -i s/%%REPLACE_CURRENT_VERSION%%/${VER}/g ${SPEC_FILE}
	tar --exclude .svn -cjf $RPMROOT/SOURCES/$RPMNAME.tar.bz2 .
	# undo the changes from the SED command above so it's not tracked by Git
        git checkout ${SPEC_FILE}
	cp LICENSE.html $RPMROOT/BUILD
	cp $RPMNAME.spec $RPMROOT/SOURCES
	cd - >/dev/null
	rm -f $RPMROOT/SRPMS/$RPMNAME-$VER*rpm $RPMROOT/RPMS/noarch/$RPMNAME-$VER*rpm
	echo "Building $RPMROOT/RPMS/noarch/$RPMNAME-$VER-snap*.noarch.rpm $EMBEDTXT..."
	rpmbuild $QUIET -ba $DIR/$RPMNAME.spec --define "version $VER" $REL "$EASE"
}

function makegenesisscripts {
	DIR="xCAT-genesis-scripts"
	if [ -z "$2" ]; then
		echo 'Usage: makerpm xCAT-genesis-scripts <arch> [<embedded-system>]'
		exit 1
	fi

	RPMNAME="$1"
	ARCH="$2"
	TARGET="--target $ARCH"
	cd `dirname $0`/
	tar --exclude .svn -cjf $RPMROOT/SOURCES/$RPMNAME.tar.bz2 $DIR
	cp $DIR/LICENSE.html $RPMROOT/BUILD
	cp $DIR/$RPMNAME.spec $RPMROOT/SOURCES
	cd - >/dev/null
	rm -f $RPMROOT/SRPMS/$RPMNAME-$ARCH-$VER*rpm $RPMROOT/RPMS/noarch/$RPMNAME-$ARCH-$VER*rpm
	echo "Building $RPMROOT/RPMS/noarch/$RPMNAME-$ARCH-$VER-snap*.noarch.rpm $EMBEDTXT..."
	rpmbuild $QUIET -ba $DIR/$RPMNAME.spec $TARGET --define "version $VER" $REL "$EASE"
}


# Export the name of the embedded system we are building for
function exportEmbed {
	if [ -n "$1" ]; then
		export "$1=1"
		EMBEDTXT="for $1 "
	else
		EMBEDTXT=""
	fi
}


# Main code....

if [ -z "$1" ]; then
	echo 'Usage: makerpm <RPMname> [<arch>] [<embedded-system>]'
	exit 1
fi

OSNAME=$(uname)
if [ -z "$XCATVER" ] ; then
	VER=`cat Version`
        REL="--define"
        EASE='usedate 1'
else
	VER=$XCATVER
        REL="--define"
	EASE='release 1'
fi
if [ "$VERBOSE" = "1" -o "$VERBOSE" = "yes" ];then
	QUIET=""
else
	QUIET="--quiet"
fi

if [ "$OSNAME" = "AIX" ]; then
	RPMROOT=/opt/freeware/src/packages
else	# linux
	rpmbuild --version > /dev/null
	if [ $? -gt 0 ]; then
		echo "Error: rpmbuild does not appear to be installed or working."
		exit 2
	fi
	RPMROOT=`rpmbuild --eval '%_topdir' xCATsn/xCATsn.spec`
	if [ $? -gt 0 ]; then
		echo "Error: Could not determine rpmbuild's root directory."
		exit 2
	fi
fi

if [ "$1" = "xCAT" -o "$1" = "xCATsn" -o "$1" = "xCAT-buildkit" -o "$1" = "xCAT-OpenStack" ]; then
	exportEmbed $3
	makexcat $1 $2
elif [ "$1" = "xCAT-genesis-builder" ]; then
	exportEmbed $2
	makegenesis $1
elif [ "$1" = "xCAT-genesis-scripts" ]; then
	exportEmbed $3
	makegenesisscripts $1 $2
elif [ "$1" = "xCAT-OpenStack-ironic" ]; then
	makeironic $1 $2    
else	# must be one of the noarch rpms
	exportEmbed $2
	makenoarch $1
fi

exit $RC
