From fe0bfb3fec2258b8e7be628fd619c541dbd21afc Mon Sep 17 00:00:00 2001 From: Yarny0 <41838844+Yarny0@users.noreply.github.com> Date: Wed, 15 May 2019 18:17:20 +0200 Subject: tsm-client: init at 8.1.8.0 IBM Spectrum Protect (former name: Tivoli Storage Manager) provides a single point of control for backup and recovery. This package contains the client software, that is, a command line client and linkable libraries. This commit adds two packages to nixpkgs: The TSM client software contains a Java GUI that, naturally, requires Java to be installed. To keep the closure size low, we provide the packages `tsm-client` and `tsm-client-withGUI`. The former comes without the Java GUI. While the product has been renamed, its old name is still alive in filenames and as package name used by other distros. --- pkgs/tools/backup/tsm-client/default.nix | 165 +++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 pkgs/tools/backup/tsm-client/default.nix (limited to 'pkgs/tools') diff --git a/pkgs/tools/backup/tsm-client/default.nix b/pkgs/tools/backup/tsm-client/default.nix new file mode 100644 index 000000000000..a1f7b1aba84e --- /dev/null +++ b/pkgs/tools/backup/tsm-client/default.nix @@ -0,0 +1,165 @@ +{ lib +, stdenv +, autoPatchelfHook +, buildEnv +, fetchurl +, makeWrapper +, procps +, zlib +# optional packages that enable certain features +, acl ? null # EXT2/EXT3/XFS ACL support +, jdk8 ? null # Java GUI +, lvm2 ? null # LVM image backup and restore functions +# path to `dsm.sys` configuration files +, dsmSysCli ? "/etc/tsm-client/cli.dsm.sys" +, dsmSysApi ? "/etc/tsm-client/api.dsm.sys" +}: + + +# For an explanation of optional packages +# (features provided by them, version limits), see +# https://www-01.ibm.com/support/docview.wss?uid=swg21052223#Version%208.1 + + +# IBM Tivoli Storage Manager Client uses a system-wide +# client system-options file `dsm.sys` and expects it +# to be located in a directory within the package. +# Note that the command line client and the API use +# different "dms.sys" files (located in different directories). +# Since these files contain settings to be altered by the +# admin user (e.g. TSM server name), we create symlinks +# in place of the files that the client attempts to open. +# Use the arguments `dsmSysCli` and `dsmSysApi` to +# provide the location of the configuration files for +# the command-line interface and the API, respectively. +# +# While the command-line interface contains wrappers +# that help the executables find the configuration file, +# packages that link against the API have to +# set the environment variable `DSMI_DIR` to +# point to this derivations `/dsmi_dir` directory symlink. +# Other environment variables might be necessary, +# depending on local configuration or usage; see: +# https://www.ibm.com/support/knowledgecenter/en/SSEQVQ_8.1.8/client/c_cfg_sapiunix.html + + +# The newest version of TSM client should be discoverable +# by going the the `downloadPage` (see `meta` below), +# there to "Client Latest Downloads", +# "IBM Spectrum Protect Client Downloads and READMEs", +# then to "Linux x86_64 Ubuntu client" (as of 2019-07-15). + + +let + + meta = { + homepage = https://www.ibm.com/us-en/marketplace/data-protection-and-recovery; + downloadPage = https://www-01.ibm.com/support/docview.wss?uid=swg21239415; + platforms = [ "x86_64-linux" ]; + license = lib.licenses.unfree; + maintainers = [ lib.maintainers.yarny ]; + description = "IBM Spectrum Protect (Tivoli Storage Manager) CLI and API"; + longDescription = '' + IBM Spectrum Protect (Tivoli Storage Manager) provides + a single point of control for backup and recovery. + This package contains the client software, that is, + a command line client and linkable libraries. + + Note that the software requires a system-wide + client system-options file (commonly named "dsm.sys"). + This package allows to use separate files for + the command-line interface and for the linkable API. + The location of those files can + be provided as build parameters. + ''; + }; + + unwrapped = stdenv.mkDerivation rec { + name = "tsm-client-${version}-unwrapped"; + version = "8.1.8.0"; + src = fetchurl { + url = "ftp://public.dhe.ibm.com/storage/tivoli-storage-management/maintenance/client/v8r1/Linux/LinuxX86_DEB/BA/v818/${version}-TIV-TSMBAC-LinuxX86_DEB.tar"; + sha256 = "0c1d0jm0i7qjd314nhj2vj8fs7sncm1x2n4d6dg4049jniyvjhpk"; + }; + inherit meta; + + nativeBuildInputs = [ + autoPatchelfHook + ]; + buildInputs = [ + stdenv.cc.cc + zlib + ]; + runtimeDependencies = [ + lvm2 + ]; + sourceRoot = "."; + + postUnpack = '' + for debfile in *.deb + do + ar -x "$debfile" + tar --xz --extract --file=data.tar.xz + rm data.tar.xz + done + ''; + + installPhase = '' + runHook preInstall + mkdir --parents $out + mv --target-directory=$out usr/* opt + runHook postInstall + ''; + + # Fix relative symlinks after `/usr` was moved up one level + preFixup = '' + for link in $out/lib/* $out/bin/* + do + target=$(readlink "$link") + if [ "$(cut -b -6 <<< "$target")" != "../../" ] + then + echo "cannot fix this symlink: $link -> $target" + exit 1 + fi + ln --symbolic --force --no-target-directory "$out/$(cut -b 7- <<< "$target")" "$link" + done + ''; + }; + +in + +buildEnv { + name = "tsm-client-${unwrapped.version}"; + inherit meta; + passthru = { inherit unwrapped; }; + paths = [ unwrapped ]; + buildInputs = [ makeWrapper ]; + pathsToLink = [ + "/" + "/bin" + "/opt/tivoli/tsm/client/ba/bin" + "/opt/tivoli/tsm/client/api/bin64" + ]; + # * Provide top-level symlinks `dsm_dir` and `dsmi_dir` + # to the so-called "installation directories" + # * Add symlinks to the "installation directories" + # that point to the `dsm.sys` configuration files + # * Drop the Java GUI executable unless `jdk` is present + # * Create wrappers for the command-line interface to + # prepare `PATH` and `DSM_DIR` environment variables + postBuild = '' + ln --symbolic --no-target-directory opt/tivoli/tsm/client/ba/bin $out/dsm_dir + ln --symbolic --no-target-directory opt/tivoli/tsm/client/api/bin64 $out/dsmi_dir + ln --symbolic --no-target-directory "${dsmSysCli}" $out/dsm_dir/dsm.sys + ln --symbolic --no-target-directory "${dsmSysApi}" $out/dsmi_dir/dsm.sys + ${lib.strings.optionalString (jdk8==null) "rm $out/bin/dsmj"} + for bin in $out/bin/* + do + target=$(readlink "$bin") + rm "$bin" + makeWrapper "$target" "$bin" \ + --prefix PATH : "$out/dsm_dir:${lib.strings.makeBinPath [ procps acl jdk8 ]}" \ + --set DSM_DIR $out/dsm_dir + done + ''; +} -- cgit 1.4.1