#!/bin/sh

export PATH=/usr/bin:/bin:$PATH

RPM_DIR=/var/opt/soco2/sysbackup
SYSBACKUP_DIR=/var/opt/sysbackup
BACKUP_DATE=`date +"%Y_%m_%d_%H"`
BUILD_ROOT="${RPM_DIR}/buildroot"
# this components have own sysbackup routines
EXCLUDE_COMPONENTS="webservice hp4k-CAP_Inside-image hp4k-assistant-image hp4k-base-image"
# this components are defective or should not be included at all
EXCLUDE_COMPONENTS="${EXCLUDE_COMPONENTS} PolicyKit softgate"

function remove_build_dir()
{
  if [ -d ${RPM_DIR} ]
  then
    echo "*** Removing old build directory structure ${RPM_DIR}"
    rm -rf --preserve-root ${RPM_DIR}
  fi
}

function is_valid_component()
{
  VALID="1"
  COMPONENT="$1"
  # check list for excludes
  for EXCLUDE_COMPONENT in ${EXCLUDE_COMPONENTS}
  do
    if [ "${VALID}" == "1" ] && [ "${EXCLUDE_COMPONENT}" == "${COMPONENT}" ]
    then
      VALID=0
    fi
  done
  # check package validity
  if [ "${VALID}" == "1" ]
  then
    rpm -qi ${COMPONENT}
    if [ "$?" != "0" ]
    then
      VALID=0
    fi
  fi
  return ${VALID}
}

if [ "$#" == "0" ]
then
  echo "Usage: $0 -p \"Component1 Component2 ComponentN\""
fi

COMPONENTS=
while getopts ":p:" OPT
do
  case ${OPT} in
    p)
      echo "Packages selected: ${OPTARG}"
      COMPONENTS=${OPTARG}
      ;;
    \?)
      echo "Invalid option: -${OPTARG}" >&2
      exit 1
      ;;
    :)
      echo "Option -${OPTARG} requires a value" >&2
      exit 1
      ;;
  esac
done

for COMPONENT in ${COMPONENTS}
do
  echo "*** Building RPM for component ${COMPONENT}"

  is_valid_component "${COMPONENT}"
  if [ "$?" == "0" ]
  then
    echo "*** Component ${COMPONENT} excluded from generic sysbackup, must supply own sysbackup!"
    exit 1
  fi

  remove_build_dir

  # create new build directory structure
  mkdir -pv ${RPM_DIR}
  cd ${RPM_DIR}
  mkdir -pv BUILD RPMS SOURCES SPECS SRPMS ${BUILD_ROOT}
  cd ${BUILD_ROOT}

  # create generic spec file
  SPEC_FILE="${RPM_DIR}/SPECS/${COMPONENT}.spec"
  RPM_DOCS=`rpm -q -d ${COMPONENT}`
  RPM_CONFIGS=`rpm -q -c ${COMPONENT}`
  RPM_FILES=`rpm -q --filesbypkg ${COMPONENT} | sed "s/${COMPONENT} \+//"`
  RPM_GHOSTS=
  if [ "${COMPONENT}" == "monit" ]
  then
    RPM_GHOSTS="/var/lib/monit/monit-inittab.state
/var/run/monit/monit.pid
/var/run/monit/monit.state"
  fi
  RPM_REMAINS=`(echo "${RPM_DOCS}"; echo "${RPM_CONFIGS}"; echo "${RPM_FILES}"; echo "${RPM_GHOSTS}") | sort | uniq -u | sed '/^$/d'`
  NAME=`rpm -q --qf %{NAME} ${COMPONENT}`
  VERSION=`rpm -q --qf %{VERSION} ${COMPONENT}`
  RELEASE=`rpm -q --qf %{RELEASE} ${COMPONENT}`
  GROUP=`rpm -q --qf %{GROUP} ${COMPONENT}`
  PACKAGER=`rpm -q --qf %{PACKAGER} ${COMPONENT}`
  VENDOR=`rpm -q --qf %{VENDOR} ${COMPONENT}`
  LICENSE=`rpm -q --qf %{LICENSE} ${COMPONENT}`
  ARCH=`rpm -q --qf %{ARCH} ${COMPONENT}`
  REQUIRES=`rpm -q --qf "[%{REQUIRENAME} %{REQUIREFLAGS:depflags} %{REQUIREVERSION},]" ${COMPONENT}`
  PROVIDES=`rpm -q --qf "[%{PROVIDENAME} %{PROVIDEFLAGS:depflags} %{PROVIDEVERSION},]" ${COMPONENT}`
  DISTRIBUTION=`rpm -q --qf %{DISTRIBUTION} ${COMPONENT}`
  SUMMARY=`rpm -q --qf %{SUMMARY} ${COMPONENT}`
  DESCRIPTION=`rpm -q --qf %{DESCRIPTION} ${COMPONENT}`
  FILE_NAME="${NAME}-${VERSION}-${RELEASE}.${ARCH}.rpm"
  SCRIPTS=`rpm -q --scripts ${COMPONENT} | sed -e 's/^preinstall.*/\n%pre/; s/^postinstall.*/\n%post/; s/^preuninstall.*/\n%preun/; s/^postuninstall.*/\n%postun/'`
  echo "Name: ${NAME}" > ${SPEC_FILE}
  echo "Version: ${VERSION}" >> ${SPEC_FILE}
  echo "Release: ${RELEASE}" >> ${SPEC_FILE}
  echo "Group: ${GROUP}" >> ${SPEC_FILE}
  echo "Packager: ${PACKAGER}" >> ${SPEC_FILE}
  echo "Vendor: ${VENDOR}" >> ${SPEC_FILE}
  echo "License: ${LICENSE}" >> ${SPEC_FILE}
  if [ "${ARCH}" != "i586" ]
  then
    echo "BuildArch: ${ARCH}" >> ${SPEC_FILE}
  fi
  echo "Provides: ${PROVIDES}" >> ${SPEC_FILE}
  echo "Requires: ${REQUIRES}" >> ${SPEC_FILE}
  echo "AutoReq: no" >> ${SPEC_FILE}  
  echo "Summary: ${SUMMARY}" >> ${SPEC_FILE}
  echo "" >> ${SPEC_FILE}
  echo "%description" >> ${SPEC_FILE}
  echo "${DESCRIPTION}" >> ${SPEC_FILE}
  echo "System backup ${BACKUP_DATE} ${FILE_NAME}" >> ${SPEC_FILE}
  echo "" >> ${SPEC_FILE}
  echo "%files" >> ${SPEC_FILE}
  if [ ! -z "${RPM_DOCS}" ]
  then
    echo "# doc files" >> ${SPEC_FILE}
    echo "${RPM_DOCS}" | sed "s/^/\"/; s/$/\"/" | sed 's/^/%doc /' >> ${SPEC_FILE}
  fi
  if [ ! -z "${RPM_CONFIGS}" ]
  then
    echo "# config files" >> ${SPEC_FILE}
    echo "${RPM_CONFIGS}" | sed "s/^/\"/; s/$/\"/" | sed 's/^/%config /; ' >> ${SPEC_FILE}
  fi
  if [ ! -z "${RPM_GHOSTS}" ]
  then
    echo "# ghost files" >> ${SPEC_FILE}
    echo "${RPM_GHOSTS}" | sed "s/^/\"/; s/$/\"/" | sed 's/^/%ghost /' >> ${SPEC_FILE}
  fi
  if [ ! -z "${RPM_REMAINS}" ]
  then
    echo "# remaining files" >> ${SPEC_FILE}
    echo "${RPM_REMAINS}" | sed "s/^/\"/; s/$/\"/" >> ${SPEC_FILE}
  fi
  echo "${SCRIPTS}" >> ${SPEC_FILE}
  echo "" >> ${SPEC_FILE}
  cat ${SPEC_FILE}

  # copy files provided by rpm package
  echo "*** Filling build structure ..."
  TAR_FILE="${BUILD_ROOT}/${COMPONENT}.tar"
  TAR_FILES="${BUILD_ROOT}/${COMPONENT}.files"
  echo "${RPM_FILES}" | sed 's/ /\ /g' > ${TAR_FILES}
  tar -cvp --ignore-failed-read --no-recursion --files-from=${TAR_FILES} -f ${TAR_FILE} || exit 1
  tar -xvpf ${TAR_FILE} || exit 1
  rm -vf ${TAR_FILE} ${TAR_FILES} || exit 1
  for FILE in ${RPM_GHOSTS}
  do
    touch ${BUILD_ROOT}/${FILE}
  done

  # create rpm package
  if [ "${ARCH}" == "i586" ]
  then
    rpmbuild -bb --buildroot ${BUILD_ROOT} --target i586 --define "_topdir ${RPM_DIR}" ${SPEC_FILE} || exit 1
  else
    rpmbuild -bb --buildroot ${BUILD_ROOT} --define "_topdir ${RPM_DIR}" ${SPEC_FILE} || exit 1
  fi
  rpm -Vp ${RPM_DIR}/RPMS/${ARCH}/${FILE_NAME}
  if [ "$?" == "0" ]
  then
    echo "*** Package verification OK"
  fi

  # copy rpm file to sysbackup directory
  mkdir -pv ${SYSBACKUP_DIR} || exit 1
  cp -avf ${RPM_DIR}/RPMS/${ARCH}/${FILE_NAME} ${SYSBACKUP_DIR}/ || exit 1

  remove_build_dir
done

exit 0

