# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=5

inherit versionator multilib eutils rpm user

DESCRIPTION="Tivoli Storage Manager (TSM) Backup/Archive (B/A) Client and API"
HOMEPAGE="http://www.tivoli.com/"

MY_PV_MAJOR=$(get_major_version)
MY_PV_MINOR=$(get_version_component_range 2)
MY_PV_TINY=$(get_version_component_range 3)
MY_PV_PATCH=$(get_version_component_range 4)

MY_PV_NODOTS="${MY_PV_MAJOR}${MY_PV_MINOR}${MY_PV_TINY}"
MY_PVR_ALLDOTS=${PV}

if [[ ${MY_PV_PATCH} == 0 ]]; then
	MY_RELEASE_PATH=maintenance
else
	MY_RELEASE_PATH=patches
fi
BASE_URI="ftp://ftp.software.ibm.com/storage/tivoli-storage-management/"
BASE_URI+="${MY_RELEASE_PATH}/client/v${MY_PV_MAJOR}r${MY_PV_MINOR}/"
BASE_URI+="Linux/LinuxX86/BA/v${MY_PV_NODOTS}/"
SRC_TAR="${MY_PVR_ALLDOTS}-TIV-TSMBAC-LinuxX86.tar"
SRC_URI="${BASE_URI}${SRC_TAR}"

RESTRICT="strip" # Breaks libPiIMG.so and libPiSNAP.so
LICENSE="Apache-1.1 Apache-2.0 JDOM BSD-2 CC-PD Boost-1.0 MIT CPL-1.0 HPND Exolab
	dom4j EPL-1.0 FTL icu unicode IBM Info-ZIP LGPL-2 LGPL-2.1 openafs-krb5-a
	ZLIB MPL-1.0 MPL-1.1 NPL-1.1 openssl OPENLDAP RSA public-domain W3C
	|| ( BSD GPL-2+ ) gSOAP libpng tsm"

SLOT="0"
KEYWORDS="~amd64"
IUSE="acl java +tsm_cit +tsm_hw"
QA_PREBUILT="*"

MY_LANGS="cs:CS_CZ de:DE_DE es:ES_ES fr:FR_FR hu:HU_HU it:IT_IT
	ja:JA_JP ko:KO_KR pl:PL_PL pt:PT_BR ru:RU_RU zh:ZH_CN zh_TW:ZH_TW"
MY_LANG_PV="${MY_PVR_ALLDOTS}-"
for lang in ${MY_LANGS}; do
	IUSE="${IUSE} linguas_${lang%:*}"
	SRC_URI="${SRC_URI} linguas_${lang%:*}? ( \
${BASE_URI}TIVsm-msg.${lang#*:}.x86_64.rpm -> \
${MY_LANG_PV}TIVsm-msg.${lang#*:}.x86_64.rpm )"
done
unset lang

DEPEND=""
RDEPEND="dev-libs/expat
	dev-libs/libxml2
	=sys-fs/fuse-2*
	acl? ( sys-apps/acl )
	java? ( virtual/jre:1.6 )"

S="${WORKDIR}"

pkg_setup() {
	enewgroup tsm
}

src_unpack() {
	local rpm rpms lang
	unpack ${SRC_TAR}

	for rpm in *.rpm; do
		case ${rpm} in
			TIVsm-APIcit.*|TIVsm-BAcit.*)
				use tsm_cit && rpms="${rpms} ./${rpm}"
				;;
			TIVsm-BAhdw.*)
				use tsm_hw && rpms="${rpms} ./${rpm}"
				;;
			TIVsm-JBB.*|*-filepath-*)
				# "journal based backup" for all filesystems
				# requires a kernel module.
				# "Linux Filepath source code" available
				# by request from vendor
				;;
			*)
				rpms="${rpms} ./${rpm}"
				;;
		esac
	done
	for rpm in ${A}; do
		case ${rpm} in
			*.rpm)
				rpms="${rpms} ${rpm}"
				;;
		esac
	done

	rpm_unpack ${rpms}

	# Avoid strange error messages caused by read-only files
	chmod -R u+w "${S}" || die
}

src_prepare() {
	# Avoid unnecessary dependency on ksh
	sed -i 's:^#!/usr/bin/ksh:#!/bin/bash:' \
		opt/tivoli/tsm/client/ba/bin/dsmj || die
}

src_install() {
	cp -a opt "${D}" || die
	cp -a usr "${D}" || die

	# The RPM files contain postinstall scripts which can be extracted
	# e.g. using https://bugs.gentoo.org/attachment.cgi?id=234663 .
	# Below we try to mimic the behaviour of these scripts.
	# We don't deal with SELinux compliance (yet), though.
	local RPM_INSTALL_PREFIX CLIENTDIR i
	RPM_INSTALL_PREFIX=/opt
	CLIENTDIR=$RPM_INSTALL_PREFIX/tivoli/tsm/client

	# We don't bother setting timestamps to build dates.
	# But we should delete the corresponding files.
	rm -f "${D}"$CLIENTDIR/api/bin*/.buildDate || die
	rm -f "${D}"$CLIENTDIR/ba/bin*/.buildDate || die
	rm -f "${D}"$CLIENTDIR/lang/.buildDate || die

	# Create links for messages; this is spread over several postin scripts.
	for i in $(cd "${D}"${CLIENTDIR}/lang; ls -1d ??_??); do
		dosym ../../lang/${i} $CLIENTDIR/ba/bin/${i}
		dosym ../../lang/${i} $CLIENTDIR/api/bin64/${i}
	done

	# Mimic TIVsm-API64 postinstall script
	for i in libgpfs.so libdmapi.so; do
		dosym ../..$CLIENTDIR/api/bin64/${i} /usr/lib64/${i}
	done

	# Mimic TIVsm-BA postinstall script
	# Create a link to libexpat if needed
	if [ ! -e "${ROOT}"/usr/lib64/libexpat.so.0 -a -e "${ROOT}"/usr/lib64/libexpat.so.1 ]
	then
		dosym /usr/lib64/libexpat.so.1 $CLIENTDIR/ba/bin/libexpat.so.0
	fi

	# The gscrypt64 postinstall script only deals with s390[x] SELinux.

	# Move stuff from /usr/local to /opt, #452332
	mv "${D}"/usr/local/ibm "${D}"/opt/ || die
	rmdir "${D}"/usr/local || die

	# Mimic gskssl64 postinstall script
	for i in sys p11 km ssl drld kicc ldap cms acmeidup valn dbfl iccs; do
		dosym ../../opt/ibm/gsk8_64/lib64/libgsk8${i}_64.so \
			/usr/lib64/libgsk8${i}_64.so
	done
	for i in capicmd ver; do
		dosym ../local/ibm/gsk8_64/bin/gsk8${i}_64 /usr/bin/${i}_64
	done

	# Done with the postinstall scripts as the RPMs contain them.
	# Now on to some more Gentoo-specific installation.

	[[ -d "${D}usr/lib" ]] && die "Using 32bit lib dir in 64bit only system"

	# Avoid "QA Notice: Found an absolute symlink in a library directory"
	local target
	find "${D}"usr/lib* -lname '/*' | while read i; do
		target=$(readlink "${i}")
		rm -v "${i}" || die
		dosym "../..${target}" "${i#${D}}"
	done

	# Install symlinks for sonames of libraries, bug #416503
	dosym libvixMntapi.so.1.1.0 $CLIENTDIR/ba/bin/libvixMntapi.so.1
	dosym libvixDiskLibVim.so.5.0.0 $CLIENTDIR/ba/bin/libvixDiskLibVim.so.5
	dosym libvixDiskLib.so.5.0.0 $CLIENTDIR/ba/bin/libvixDiskLib.so.5

	fowners -R :tsm /opt/tivoli
	fperms -R g+rX,o-rx /opt/tivoli # Allow only tsm group users to access TSM tools
	fperms 4710 /opt/tivoli/tsm/client/ba/bin/dsmtca

	keepdir /var/log/tsm
	insinto /etc/logrotate.d
	newins "${FILESDIR}/tsm.logrotate" tsm

	keepdir /etc/tivoli

	cp -a "${S}/opt/tivoli/tsm/client/ba/bin/dsm.sys.smp" "${D}/etc/tivoli/dsm.sys" || die
	echo '	 PasswordDir "/etc/tivoli/"' >> ${D}/etc/tivoli/dsm.sys
	echo '	 PasswordAccess generate' >> ${D}/etc/tivoli/dsm.sys

	# Added the hostname to be more friendly, the admin will need to edit this file anyway
	echo '	 NodeName' `hostname` >> ${D}/etc/tivoli/dsm.sys
	echo '	 ErrorLogName "/var/log/tsm/dsmerror.log"' >> ${D}/etc/tivoli/dsm.sys
	echo '	 SchedLogName "/var/log/tsm/dsmsched.log"' >> ${D}/etc/tivoli/dsm.sys
	dosym ../../../../../../etc/tivoli/dsm.sys /opt/tivoli/tsm/client/ba/bin/dsm.sys

	cp -a "${S}/opt/tivoli/tsm/client/ba/bin/dsm.opt.smp" "${D}/etc/tivoli/dsm.opt"
	dosym ../../../../../../etc/tivoli/dsm.opt /opt/tivoli/tsm/client/ba/bin/dsm.opt

	# Setup the env
	dodir /etc/env.d
	ENV_FILE="${D}/etc/env.d/80tivoli"
	echo 'DSM_CONFIG="/etc/tivoli/dsm.opt"' >> ${ENV_FILE}
	echo 'DSM_DIR="/opt/tivoli/tsm/client/ba/bin"' >> ${ENV_FILE}
	echo 'DSM_LOG="/var/log/tsm"' >> ${ENV_FILE}
	echo 'ROOTPATH="/opt/tivoli/tsm/client/ba/bin"' >> ${ENV_FILE}

	newconfd "${FILESDIR}/dsmc.conf.d" dsmc
	newinitd "${FILESDIR}/dsmc.init.d" dsmc
	newinitd "${FILESDIR}/dsmcad.init.d-r1" dsmcad

	elog
	elog "Note that you have to be either root or member of the group tsm to"
	elog "be able to use the Tivoli Storage Manager client."
	elog

}

pkg_postinst() {
	local i
	for i in /var/log/tsm/dsm{error,sched,j,webcl}.log; do
		if [[ ! -e $i ]]; then
			touch $i || die
			chown :tsm $i || die
			chmod 0660 $i || die
		fi
	done

	# Bug #375041: the log directory itself should not be world writable.
	# Have to do this in postinst due to bug #141619
	chown root:tsm /var/log/tsm || die
	chmod 0750 /var/log/tsm || die
}
