## ## Obtain various platform information ## OS=`uname` if [ "${OS}" != "Linux" ] ; then printf "'$0' is ONLY available on '${OS}'!\n" exit 255 fi if [ -f "/etc/redhat-release" ] ; then DISTRIBUTION=`cat /etc/redhat-release | cut -c1-7` DIST_VERSION=`cat /etc/redhat-release | tr -d [:alpha:][:blank:][\(\)]` if [ "${DISTRIBUTION}" = "Fedora " ] ; then MESSAGE="[built for Fedora ${DIST_VERSION}]" elif [ "${DISTRIBUTION}" = "Red Hat" ] ; then MESSAGE="[built for Red Hat ${DIST_VERSION}]" else printf "'$0' is ONLY available on 'Fedora' or 'Red Hat' " printf "distributions!\n" exit 255 fi else printf "'$0' is ONLY available on 'Fedora' or 'Red Hat' distributions!\n" exit 255 fi ## ## Establish various shared variables ## PKI_DIR="pki" export PKI_DIR PKI_BASE_DIR="${PKI_DIR}/base" export PKI_BASE_DIR PKI_DOGTAG_DIR="${PKI_DIR}/dogtag" export PKI_DOGTAG_DIR PKI_REDHAT_DIR="${PKI_DIR}/redhat" export PKI_REDHAT_DIR PKI_FILE_LIST="CMakeLists.txt COPYING CPackConfig.cmake ConfigureChecks.cmake DefineOptions.cmake README cmake_uninstall.cmake.in config.h.cmake pylint-build-scan.py dogtag.pylintrc tox.ini" export PKI_FILE_LIST PKI_CMAKE_DIR="cmake" export PKI_CMAKE_DIR PKI_BASE_MANIFEST="CMakeLists.txt" export PKI_BASE_MANIFEST PKI_DOGTAG_MANIFEST="CMakeLists.txt" export PKI_DOGTAG_MANIFEST PKI_REDHAT_MANIFEST="CMakeLists.txt" export PKI_REDHAT_MANIFEST RHEL="/rhel/" ## ## Usage statement ## Usage() { printf "\n" printf "Usage: $0 [options] \n\n" printf " where is one of the following:\n\n" printf " srpm - copies a spec file from local source,\n" printf " generates a tarball from local source,\n" printf " copies any relevant patches from the\n" printf " local 'patches' directory, and\n" printf " produces an SRPM\n" printf " [suitable for use by 'mock']\n\n" printf " rpms - copies a spec file from local source,\n" printf " generates a tarball from local source,\n" printf " copies any relevant patches from the\n" printf " local 'patches' directory, and\n" printf " produces an SRPM and one or more RPMS\n" printf " ${MESSAGE}\n\n" printf " hybrid_srpm - copies a spec file from local source,\n" printf " generates a tarball from local source,\n" printf " fetches any relevant patches from the\n" printf " spec's URL, and\n" printf " produces an SRPM\n" printf " [suitable for use by 'mock']\n\n" printf " hybrid_rpms - copies a spec file from local source,\n" printf " generates a tarball from local source,\n" printf " fetches any relevant patches from the\n" printf " spec's URL, and\n" printf " produces an SRPM and one or more RPMS\n" printf " ${MESSAGE}\n\n" printf " patched_srpm - copies a spec file from local source,\n" printf " fetches a non-RHEL tarball from the spec's URL,\n" printf " fetches any relevant patches from the\n" printf " spec's URL, and\n" printf " produces an SRPM\n" printf " [suitable for use by 'mock']\n\n" printf " patched_rpms - copies a spec file from local source,\n" printf " fetches a non-RHEL tarball from the spec's URL,\n" printf " fetches any relevant patches from the\n" printf " spec's URL, and\n" printf " produces an SRPM and one or more RPMS\n" printf " ${MESSAGE}\n\n" printf " patched_rhel_srpm - copies a spec file from local source,\n" printf " fetches a RHEL tarball from the spec's URL,\n" printf " fetches any relevant patches from the\n" printf " spec's URL, and\n" printf " produces an SRPM\n" printf " [suitable for use by 'mock']\n\n" printf " patched_rhel_rpms - copies a spec file from local source,\n" printf " fetches a RHEL tarball from the spec's URL,\n" printf " fetches any relevant patches from the\n" printf " spec's URL, and\n" printf " produces an SRPM and one or more RPMS\n" printf " ${MESSAGE}\n\n" printf "Options:\n" printf " --without-javadoc do not build Javadoc RPMS\n\n" printf " --without-server do not build server RPMS\n\n" printf " --createrepo= create a \n" printf " repository with the rpms built." printf " Provide the configuration file with the details. \n\n" } ## ## Copy Specified Patches to SOURCES ## Fetch_Patch_Files() { if [ $# -ne 2 ] ; then Usage exit 255 fi SPECFILE=$1 TARGET_DIR=$2 if [ ! -f ${SPECFILE} ] ; then printf "ERROR: '${SPECFILE}' is missing!\n\n" Usage exit 255 elif [ ! -d ${TARGET_DIR} ] ; then printf "ERROR: '${TARGET_DIR}' does NOT exist!\n\n" Usage exit 255 fi component_name_marker="Name" component_version_marker="Version" component_release_marker="Release" component_source_marker="Source" component_patch_marker="Patch" component_name="" component_version="" component_release="" component_source="" component_url="" component_patch="" exec < ${SPECFILE} while read line; do entry=`echo $line | cut -d: -f 1` if [ "${entry:0:4}" = "${component_name_marker}" ] ; then component_name=`echo $line | cut -d' ' -f 2` elif [ "${entry:0:7}" = "${component_version_marker}" ] ; then component_version=`echo $line | cut -d' ' -f 2` elif [ "${entry:0:7}" = "${component_release_marker}" ] ; then data=`echo $line | cut -d'%' -f 1` component_release=`echo $data | cut -d' ' -f 2` elif [ "${entry:0:6}" = "${component_source_marker}" ] ; then value=`echo $line | cut -d' ' -f 2` component_source=`echo $value | sed -e "s/\%{name}/${component_name}/g" -e "s/\%{version}/${component_version}/g" -e "s/\%{release}/${component_release}/g" -e "s/\%{?prerel}//g"` if [[ "$component_source" =~ "$RHEL" ]] ; then if [ ${FETCH_RHEL_PATCH_FILES} -ne 1 ] ; then # non-RHEL Source patch files are desired continue; fi else if [ ${FETCH_RHEL_PATCH_FILES} -eq 1 ] ; then # RHEL Source patch files are desired continue; fi fi component_url=`dirname ${component_source}` elif [ "${entry:0:5}" = "${component_patch_marker}" ] ; then if [ ${component_url} != "" ] ; then value=`echo $line | cut -d' ' -f 2` component_patch=${component_url}"/"`echo $value | sed -e "s/\%{name}/${component_name}/g" -e "s/\%{version}/${component_version}/g"` wget -q -O ${TARGET_DIR}/`basename ${component_patch}` ${component_patch} if [ $? -ne 0 ] ; then printf "ERROR: Failed to download '${component_patch}'!\n\n" Usage exit 255 elif [ ! -f ${TARGET_DIR}/`basename ${component_patch}` ] ; then printf "ERROR: Failed to save '${TARGET_DIR}/`basename ${component_patch}`'!\n\n" Usage exit 255 fi else printf "ERROR: '${component_source_marker}' MUST be specified PRIOR to '${component_patch_marker}'!\n\n" Usage exit 255 fi fi done } ## ## Copy Specified Source Tarball to SOURCES ## Fetch_Source_Tarball() { if [ $# -ne 2 ] ; then Usage exit 255 fi SPECFILE=$1 TARGET_DIR=$2 if [ ! -f ${SPECFILE} ] ; then printf "ERROR: '${SPECFILE}' is missing!\n\n" Usage exit 255 elif [ ! -d ${TARGET_DIR} ] ; then printf "ERROR: '${TARGET_DIR}' does NOT exist!\n\n" Usage exit 255 fi component_name_marker="Name" component_version_marker="Version" component_release_marker="Release" component_tarball_marker="Source" component_name="" component_version="" component_release="" component_tarball="" exec < ${SPECFILE} while read line; do entry=`echo $line | cut -d: -f 1` if [ "${entry:0:4}" = "${component_name_marker}" ] ; then component_name=`echo $line | cut -d' ' -f 2` elif [ "${entry:0:7}" = "${component_version_marker}" ] ; then component_version=`echo $line | cut -d' ' -f 2` elif [ "${entry:0:7}" = "${component_release_marker}" ] ; then data=`echo $line | cut -d'%' -f 1` component_release=`echo $data | cut -d' ' -f 2` elif [ "${entry:0:6}" = "${component_tarball_marker}" ] ; then value=`echo $line | cut -d' ' -f 2` component_tarball=`echo $value | sed -e "s/\%{name}/${component_name}/g" -e "s/\%{version}/${component_version}/g" -e "s/\%{release}/${component_release}/g" -e "s/\%{?prerel}//g"` if [[ "${component_tarball}" =~ "$RHEL" ]] ; then if [ ${FETCH_RHEL_SOURCE_TARBALL} -ne 1 ] ; then # non-RHEL Source URL is desired continue; fi else if [ ${FETCH_RHEL_SOURCE_TARBALL} -eq 1 ] ; then # RHEL Source URL is desired continue; fi fi wget -q -O ${TARGET_DIR}/`basename ${component_tarball}` ${component_tarball} if [ $? -ne 0 ] ; then printf "ERROR: Failed to download '${component_tarball}'!\n\n" Usage exit 255 elif [ ! -f ${TARGET_DIR}/`basename ${component_tarball}` ] ; then printf "ERROR: Failed to save '${TARGET_DIR}/`basename ${component_tarball}`'!\n\n" Usage exit 255 fi fi done } ### # Create repository using the details in the config file ### # Function parameters - $1 - repository file path. ### Create_repo_after_build() { if [ $# -eq 0 ]; then echo "No repository configuration provided. Cannot create a repo." exit -1 fi if [ ! -f $1 ]; then echo "$1 does not exist." exit -1 fi . $1 ### Remove leading and trailing whitespaces ### repo_location=`echo $REPOSITORY_LOCATION |sed -e 's/^ *//g' -e 's/ *$//g'` destination=`echo $REPOSITORY_HOST|sed -e 's/^ *//g' -e 's/ *$//g'` uname=`echo $USERNAME |sed -e 's/^ *//g' -e 's/ *$//g'` pwd=`echo $PASSWORD |sed -e 's/^ *//g' -e 's/ *$//g'` if [ "$repo_location" != "" ] ; then if [ "$destination" != "" ] ; then createrepo ./RPMS/noarch/ createrepo ./RPMS/x86_64/ createrepo ./SRPMS/ if [ $uname == "" ] ; then echo "No username provided in the configuration file." echo "Enter the username:" read $uname fi if [ $pwd == "" ] ; then echo "No password provided in the configuration file." echo "Enter the password:" read -s $pwd fi url="$uname@$destination:$repo_location" echo $url ./scp_the_repo.exp "RPMS/" $url $PASSWORD ./scp_the_repo.exp "SRPMS/" $url $PASSWORD if [ $? -ne 0 ]; then echo "Cannot copy the repositories to $destination\n" exit -1 fi echo "Copied the repo to the location on the destination" exit 0 fi if [ ! -e $repo_location ] ; then mkdir -p $repo_location fi cp -r RPMS SRPMS $repo_location createrepo $REPOSITORY_LOCATION/RPMS/noarch/ createrepo $REPOSITORY_LOCATION/RPMS/x86_64/ createrepo $REPOSITORY_LOCATION/SRPMS/ echo "Build repository created at $repo_location." exit 0 fi echo "Cannot create repository. $repo_location has empty value in repository.cfg" } ## ## Check for command line argument validity ## GETOPT=`getopt -o '' -l without-javadoc,without-server,work-dir:,createrepo: -n "$0" -- "$@"` if [ $? != 0 ] ; then Usage exit 255 fi eval set -- "$GETOPT" while true ; do case "$1" in --without-javadoc) WITHOUT_JAVADOCS="--without javadoc" ; shift ;; --without-server) WITHOUT_SERVER="--without server" ; shift ;; --work-dir) WORK_DIR="$2" ; shift 2 ;; --createrepo) CREATEREPO="Y" ; REPO_CFG_FILE="$2" ; shift 2 ;; --) shift ; break ;; *) echo "$0: unrecognized option '$1'" 1>&2 ; exit 255 ;; esac done if [ $# -ne 1 ] ; then Usage exit 255 fi OPTIONS="--define \"_topdir \`pwd\`\" $WITHOUT_JAVADOCS $WITHOUT_SERVER" if [ $1 = "srpm" ] ; then OPTIONS="$OPTIONS -bs" FETCH_SOURCE_TARBALL=0 FETCH_PATCH_FILES=0 elif [ $1 = "hybrid_srpm" ] ; then OPTIONS="$OPTIONS -bs" FETCH_SOURCE_TARBALL=0 FETCH_PATCH_FILES=1 elif [ $1 = "patched_srpm" ] ; then OPTIONS="$OPTIONS -bs" FETCH_SOURCE_TARBALL=1 FETCH_RHEL_SOURCE_TARBALL=0 FETCH_PATCH_FILES=1 FETCH_RHEL_PATCH_FILES=0 elif [ $1 = "patched_rhel_srpm" ] ; then OPTIONS="$OPTIONS -bs" FETCH_SOURCE_TARBALL=1 FETCH_RHEL_SOURCE_TARBALL=1 FETCH_PATCH_FILES=1 FETCH_RHEL_PATCH_FILES=1 elif [ $1 = "rpms" ] ; then OPTIONS="$OPTIONS -ba" FETCH_SOURCE_TARBALL=0 FETCH_PATCH_FILES=0 elif [ $1 = "hybrid_rpms" ] ; then OPTIONS="$OPTIONS -ba" FETCH_SOURCE_TARBALL=0 FETCH_PATCH_FILES=1 elif [ $1 = "patched_rpms" ] ; then OPTIONS="$OPTIONS -ba" FETCH_SOURCE_TARBALL=1 FETCH_RHEL_SOURCE_TARBALL=0 FETCH_PATCH_FILES=1 FETCH_RHEL_PATCH_FILES=0 elif [ $1 = "patched_rhel_rpms" ] ; then OPTIONS="$OPTIONS -ba" FETCH_SOURCE_TARBALL=1 FETCH_RHEL_SOURCE_TARBALL=1 FETCH_PATCH_FILES=1 FETCH_RHEL_PATCH_FILES=1 else Usage exit 255 fi RPMBUILD_CMD="rpmbuild $OPTIONS" export RPMBUILD_CMD