# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

MODULES_OPTIONAL_IUSE=journal
MODULES_KERNEL_MAX=6.1
inherit desktop linux-mod-r1 optfeature rpm toolchain-funcs pax-utils xdg

DESCRIPTION="IBM Storage Protect (former Tivoli Storage Manager) Backup/Archive Client, API"
HOMEPAGE="https://www.ibm.com/products/storage-protect"

BASE_URI="https://public.dhe.ibm.com/storage/tivoli-storage-management/"
if [[ $(ver_cut 4) == 0 ]]; then
	BASE_URI+="maintenance/client/v$(ver_cut 1)r$(ver_cut 2)/Linux/"
else
	BASE_URI+="patches/client/v$(ver_cut 1)r$(ver_cut 2)/Linux/"
fi

SRC_URI="
	amd64? (
		!gpfs? ( ${BASE_URI}LinuxX86/BA/v$(ver_rs 1-3 '' $(ver_cut 1-3))/${PV}-TIV-TSMBAC-LinuxX86.tar )
		gpfs? ( ${BASE_URI}LinuxX86/HSMGPFS/v$(ver_rs 1-3 '' $(ver_cut 1-3))/${PV}-TIV-TSMHSM-LinuxX86GPFS.tar )
	)
	ppc64? (
		!gpfs? (
			${BASE_URI}LinuxPPC/v$(ver_rs 1-3 '' $(ver_cut 1-3))/${PV}-TIV-TSMBAC-LinuxPPC.tar
			${BASE_URI}LinuxPLE/BA/v$(ver_rs 1-3 '' $(ver_cut 1-3))/${PV}-TIV-TSMBAC-LinuxPLE.tar
		)
		gpfs? ( ${BASE_URI}LinuxPLE/HSMGPFS/v$(ver_rs 1-3 '' $(ver_cut 1-3))/${PV}-TIV-TSMHSM-LinuxPLEGPFS.tar )
	)
	s390? ( ${BASE_URI}LinuxzSeries/BA/v$(ver_rs 1-3 '' $(ver_cut 1-3))/${PV}-TIV-TSMBAC-LinuxS390.tar )
"
S="${WORKDIR}"

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 gSOAP libpng tsm || ( BSD GPL-2+ )
"

SLOT="0"
KEYWORDS="~amd64" # ppc64 s390 -*

IUSE="gpfs"
# GPFS is not supported for journal-based backups on Linux
REQUIRED_USE="journal? ( !gpfs )"

RESTRICT="strip bindist mirror" # Breaks libPiIMG.so and libPiSNAP.so
QA_PREBUILT="/opt/*"
PLOCALE_BACKUP="en_US"
PLOCALES="
	cs_CZ de_DE en_US es_ES fr_FR hu_HU it_IT ja_JP ko_KR pl_PL pt_BR
	ru_RU zh_CN zh_TW
"

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-BR:PT_BR ru:RU_RU zh-CN:ZH_CN zh-TW:ZH_TW
"
for lang in ${MY_LANGS}; do
	IUSE+=" l10n_${lang%:*}"
done

BDEPEND="
	app-arch/xz-utils[extra-filters(+)]
	media-gfx/imagemagick[png]
"
DEPEND="
	acct-group/tsm
"
RDEPEND="
	acct-group/tsm
	dev-libs/expat
	dev-libs/openssl:0/3
	dev-libs/libxml2:2
	media-libs/alsa-lib
	sys-apps/acl
	sys-fs/fuse:0
	sys-libs/zlib:0/1
	x11-libs/libXft
	|| (
		sys-libs/libxcrypt:0/1[compat]
		sys-libs/glibc:2.2[crypt(-)]
	)
	gpfs? ( || (
		app-shells/ksh
		app-shells/loksh
	) )
"

src_unpack() {
	if use amd64; then
		if use gpfs; then
			unpack "${PV}-TIV-TSMHSM-LinuxX86GPFS.tar"
		else
			unpack "${PV}-TIV-TSMBAC-LinuxX86.tar"
		fi
	elif use ppc64; then
		if [[ $(tc-endian) == big ]]; then
			if use gpfs; then
				die "GPFS not supported on big endian"
			else
				unpack "${PV}-TIV-TSMBAC-LinuxPPC.tar"
			fi
		else
			if use gpfs; then
				unpack "${PV}-TIV-TSMHSM-LinuxPLEGPFS.tar"
			else
				unpack "${PV}-TIV-TSMBAC-LinuxPLE.tar"
			fi
		fi
	elif use s390; then
		if use gpfs; then
			die "GPFS not supported on s390"
		else
			unpack "${PV}-TIV-TSMBAC-LinuxS390.tar"
		fi
	else
		die "Unsupported architecture"
	fi

	mkdir rpms_unpacked || die
	pushd rpms_unpacked >/dev/null || die
	rpmunpack "${S}/"*.rpm
	popd >/dev/null || die

	use journal && unpack "${S}/TIVsm-filepath-source.tar.gz"
}

src_prepare() {
	default
	local lang
	for lang in ${MY_LANGS}; do
		if ! use l10n_${lang%:*}; then
			find -type d -name "${lang#*:}" -exec rm -r {} + || die
		fi
	done
}

src_compile() {
	local modlist=( filepath=:jbb_gpl )
	local modargs=(
		KDIR="${KV_OUT_DIR}" RELNUM=${PV}
		# The usage of arch is non-standard here
		$(usev amd64 ARCH=x86_64)
		$(usev ppc64 ARCH=ppc64)
	)
	linux-mod-r1_src_compile
}

src_install() {
	local i
	for i in rpms_unpacked/*; do
		rsync -a "${i}/"* "${ED}" || die
	done

	# Don't bundle java
	rm -r "${ED}/opt/tivoli/tsm/tdpvmware/common/jre" || 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.

	# Mimic TIVsm-API64 postinstall script
	for i in "${ED}/opt/tivoli/tsm/client/api/bin64/"*.so; do
		dosym "../../opt/tivoli/tsm/client/api/bin64/$(basename "${i}")" \
			"/usr/$(get_libdir)/$(basename "${i}")"
	done

	# The TIVsm-BA postinstall script only does messages and ancient upgrades

	# The gscrypt64 postinstall script only deals with s390[x] SELinux
	# and the symlink for the iccs library which we handle in the loop below.

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

	# Mimic gskssl64 postinstall script
	for i in "${ED}/opt/ibm/gsk8_64/lib64/"*.so; do
		dosym "../../opt/ibm/gsk8_64/lib64/$(basename "${i}")" \
			"/usr/$(get_libdir)/$(basename "${i}")"
	done
	for i in "${ED}/opt/ibm/gsk8_64/bin/"*; do
		dosym "../../opt/ibm/gsk8_64/bin/$(basename "${i}")" \
			"/usr/bin/$(basename "${i//8/}")"
	done

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

	rm -rf "${ED}/usr/lib/.build-id" &> /dev/null
	[[ -d "${ED}/usr/lib" ]] && rmdir "${ED}/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 "${ED}"/usr/lib* -lname '/*' | while read i; do
		target=$(readlink "${i}")
		rm -v "${i}" || die
		dosym "../..${target}" "${i#${ED}/}"
	done

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

	keepdir /etc/tivoli

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

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

	cp -a "${ED}/opt/tivoli/tsm/client/ba/bin/dsm.opt.smp" "${ED}/etc/tivoli/dsm.opt" || die
	dosym ../../../../../../etc/tivoli/dsm.opt /opt/tivoli/tsm/client/ba/bin/dsm.opt

	if use journal; then
		touch "${ED}/etc/tivoli/tsmjbbd.ini" || die
		dosym ../../../../../../etc/tivoli/tsmjbbd.ini /opt/tivoli/tsm/client/ba/bin/tsmjbbd.ini
	fi

	chown -R root:tsm "${ED}/etc/tivoli" || die
	chmod -R 0660 "${ED}/etc/tivoli/"* || die

	# Setup the env
	newenvd - 80tivoli <<-EOF
		DSM_CONFIG="/etc/tivoli/dsm.opt"
		DSM_DIR="/opt/tivoli/tsm/client/ba/bin"
		DSM_LOG="/var/log/tsm"
		# ROOTPATH="/opt/tivoli/tsm/client/ba/bin"
	EOF

	insinto /etc/revdep-rebuild
	newins - 80${PN} <<-EOF
		SEARCH_DIRS_MASK="/opt/tivoli/tsm/client/ba/bin"
	EOF

	# https://www.ibm.com/support/pages/apar/IT46420
	insinto /opt/tivoli/tsm/client/ba/bin
	newins - dsmcad.lang <<-EOF
		LANG=en_US.UTF-8
		LC_ALL=en_US.UTF-8
	EOF

	# Need this for hardened, otherwise a cryptic "connection to server lost" message appears
	pax-mark -m "${ED}/opt/tivoli/tsm/client/ba/bin/dsmc"

	magick "${ED}/opt/tivoli/tsm/client/ba/bin/favicon.ico" "${T}/ibm.png" || die
	doicon -s 16 "${T}/ibm.png"
	make_desktop_entry dsmj "IBM Storage Protect" ibm System

	# Ensure the services can start on Gentoo, respect our java setting
	sed -e 's/Ubuntu/Gentoo/g' \
		-i "${ED}/opt/tivoli/tsm/client/ba/bin/rc."* || die
	sed -e 's/DSM_LOG=\/opt\/tivoli\/tsm\/client\/ba\/bin/DSM_LOG=\/var\/log\/tsm/g' \
		-e '/JAVA_HOME=/d' \
		-e '/PATH=/d' \
		-e '/LD_LIBRARY_PATH=/d' \
		-i "${ED}/opt/tivoli/tsm/client/ba/bin/"*.service || die

	sed -e '/JAVA_HOME=/d' \
		-i "${ED}/opt/tivoli/tsm/tdpvmware/common/scripts/webserver" || die

	# Overwrite with relative symlinks
	dosym ../../opt/tivoli/tsm/client/ba/bin/rc.dsmcad /etc/init.d/dsmcad
	dosym ../../opt/tivoli/tsm/tdpvmware/common/scripts/webserver /etc/init.d/webserver
	if use journal; then
		dosym ../../opt/tivoli/tsm/client/ba/bin/rc.tsmjbb /etc/init.d/tsmjbbd
	else
		rm -f "${ED}/etc/init.d/tsmjbbd" || die
	fi

	dosym ../../../../opt/tivoli/tsm/client/ba/bin/dsmcad.service /usr/lib/systemd/system/dsmcad.service
	if use journal; then
		dosym ../../../../opt/tivoli/tsm/client/ba/bin/tsmjbbd.service /usr/lib/systemd/system/tsmjbbd.service
	else
		rm -f "${ED}/usr/lib/systemd/system/tsmjbbd.service" || die
	fi

	linux-mod-r1_src_install
}

pkg_postinst() {
	xdg_pkg_postinst

	local i dirs
	for i in "${EROOT}/var/log/tsm/dsm"{error,instr,j,sched,webcl}.log; do
		if [[ ! -e ${i} ]]; then
			touch ${i} || die
			chown root: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 "${EROOT}/var/log/tsm" || die
	chmod 0750 "${EROOT}/var/log/tsm" || die

	# Bug 508052: directories used to be too restrictive, have to widen perms.
	dirs=( "${EROOT}/opt/tivoli" $(find "${EROOT}/opt/tivoli/tsm" -type d) )
	chown root:root "${dirs[@]}" || die
	chmod 0755 "${dirs[@]}" || die

	linux-mod-r1_pkg_postinst

	optfeature "using the Java GUI client" virtual/jre

	elog
	elog "To use the client as a regular user, add the user to the \"tsm\" group"
}