From 85f6ff48e1eea58fc728c4ffe4f35afe2a2e18b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20Hamb=C3=BCchen?= Date: Thu, 11 May 2017 16:56:07 +0200 Subject: [PATCH] glusterfs: Make commands that gluster calls work. Fixes #25620. Done by setting PATH and PYTHONPATH appropriately. Adds the following patches: * One that removes hardcodes to /sbin, /usr/bin, etc. from gluster, so that programs like `lvm` and `xfs_info` can be called at runtime; see https://bugzilla.redhat.com/show_bug.cgi?id=1450546. * One that fixes unsubstituted autoconf macros in paths (a problem in the 3.10 release); see https://bugzilla.redhat.com/show_bug.cgi?id=1450588. * One that removes uses of the `find_library()` Python function that does not behave as expected in Python < 3.6 (and would not behave correctly even on 3.6 in nixpkgs due to #25763); see https://bugzilla.redhat.com/show_bug.cgi?id=1450593. I think that all of these patches should be upstreamed. Also adds tests to check that none of the Python based utilities throw import errors, calling `--help` or equivalent on them. --- pkgs/tools/filesystems/glusterfs/default.nix | 119 ++++++++- ...fs-fix-unsubstituted-autoconf-macros.patch | 236 ++++++++++++++++++ ...glusterfs-python-remove-find_library.patch | 151 +++++++++++ ...sterfs-use-PATH-instead-of-hardcodes.patch | 160 ++++++++++++ 4 files changed, 662 insertions(+), 4 deletions(-) create mode 100644 pkgs/tools/filesystems/glusterfs/glusterfs-fix-unsubstituted-autoconf-macros.patch create mode 100644 pkgs/tools/filesystems/glusterfs/glusterfs-python-remove-find_library.patch create mode 100644 pkgs/tools/filesystems/glusterfs/glusterfs-use-PATH-instead-of-hardcodes.patch diff --git a/pkgs/tools/filesystems/glusterfs/default.nix b/pkgs/tools/filesystems/glusterfs/default.nix index 6d6f0f3b1c8b..de36606678ae 100644 --- a/pkgs/tools/filesystems/glusterfs/default.nix +++ b/pkgs/tools/filesystems/glusterfs/default.nix @@ -1,31 +1,76 @@ {stdenv, fetchurl, fuse, bison, flex_2_5_35, openssl, python2, ncurses, readline, - autoconf, automake, libtool, pkgconfig, zlib, libaio, libxml2, acl, sqlite - , liburcu, attr, makeWrapper, coreutils, gnused, gnugrep, which + autoconf, automake, libtool, pkgconfig, zlib, libaio, libxml2, acl, sqlite, + liburcu, attr, makeWrapper, coreutils, gnused, gnugrep, which, python2Packages, + openssh, gawk, findutils, utillinux, lvm2, btrfs-progs, e2fsprogs, xfsprogs, systemd, + rsync, glibc }: let s = rec { baseName="glusterfs"; + # NOTE: On each glusterfs release, it should be checked if gluster added + # new, or changed, Python scripts whose PYTHONPATH has to be set in + # `postFixup` below, and whose runtime deps need to go into + # `nativeBuildInputs`. + # The command + # find /nix/store/...-glusterfs-.../ -name '*.py' -executable + # can help with finding new Python scripts. version = "3.10.1"; name="${baseName}-${version}"; url="https://github.com/gluster/glusterfs/archive/v${version}.tar.gz"; sha256 = "0gmb3m98djljcycjggi1qv99ai6k4cvn2rqym2q9f58q8n8kdhh7"; }; buildInputs = [ - fuse bison flex_2_5_35 openssl python2 ncurses readline + fuse bison flex_2_5_35 openssl ncurses readline autoconf automake libtool pkgconfig zlib libaio libxml2 acl sqlite liburcu attr makeWrapper + (python2.withPackages (pkgs: [ + pkgs.flask + pkgs.prettytable + pkgs.requests + pkgs.xattr + ])) + # NOTE: `python2` has to be *AFTER* the above `python2.withPackages`, + # to ensure that the packages are available but the `toPythonPath` + # shell function used in `postFixup` is also still available. + python2 ]; # Some of the headers reference acl propagatedBuildInputs = [ acl ]; + # Packages from which GlusterFS calls binaries at run-time from PATH, + # with comments on which commands are known to be called by it. + runtimePATHdeps = [ + attr # getfattr setfattr + btrfs-progs # btrfs + coreutils # lots of commands in bash scripts + e2fsprogs # tune2fs + findutils # find + gawk # awk + glibc # getent + gnugrep # grep + gnused # sed + lvm2 # lvs + openssh # ssh + rsync # rsync, e.g. for geo-replication + systemd # systemctl + utillinux # mount umount + which # which + xfsprogs # xfs_info + ]; in stdenv.mkDerivation rec { inherit (s) name version; inherit buildInputs propagatedBuildInputs; + patches = [ + ./glusterfs-use-PATH-instead-of-hardcodes.patch + ./glusterfs-fix-unsubstituted-autoconf-macros.patch + ./glusterfs-python-remove-find_library.patch + ]; + # Note that the VERSION file is something that is present in release tarballs # but not in git tags (at least not as of writing in v3.10.1). # That's why we have to create it. @@ -49,7 +94,73 @@ rec { postInstall = '' cp -r $out/$out/* $out rm -r $out/nix - wrapProgram $out/sbin/mount.glusterfs --set PATH "${stdenv.lib.makeBinPath [ coreutils gnused attr gnugrep which]}" + ''; + + postFixup = '' + # glusterd invokes `gluster` and other utilities when telling other glusterd nodes to run commands. + # For example for `peer_georep-sshkey` key generation, so `$out/bin` is needed in the PATH. + # It also invokes bash scripts like `gverify.sh`. + # It also invokes executable Python scripts in `$out/libexec/glusterfs`, which is why we set up PYTHONPATH accordingly. + # We set up the paths for the main entry point executables. + + GLUSTER_PATH="${stdenv.lib.makeBinPath runtimePATHdeps}:$out/bin" + GLUSTER_PYTHONPATH="$(toPythonPath $out):$out/libexec/glusterfs" + GLUSTER_LD_LIBRARY_PATH="$out/lib" + + wrapProgram $out/bin/glusterd --set PATH "$GLUSTER_PATH" --set PYTHONPATH "$GLUSTER_PYTHONPATH" --set LD_LIBRARY_PATH "$GLUSTER_LD_LIBRARY_PATH" + wrapProgram $out/bin/gluster --set PATH "$GLUSTER_PATH" --set PYTHONPATH "$GLUSTER_PYTHONPATH" --set LD_LIBRARY_PATH "$GLUSTER_LD_LIBRARY_PATH" + wrapProgram $out/sbin/mount.glusterfs --set PATH "$GLUSTER_PATH" --set PYTHONPATH "$GLUSTER_PYTHONPATH" --set LD_LIBRARY_PATH "$GLUSTER_LD_LIBRARY_PATH" + + # Set Python environment for the Python based utilities. + # It would be nice if there was a better way to do this, automatically for all of them. + # Also, this is brittle: If we forget a dependency or gluster adds a new one, things will break deep inside gluster. + # We should better try to get an explicit list of Python dependencies from gluster and ensure all of them are in the PYTHONPATH of all these python scripts. + # But at the time of writing (gluster 3.10), gluster only provides this in form of a gluster.spec file for RPM creation, + # and even that one is not complete (for example it doesn't mention the `flask` dependency). + + wrapProgram $out/bin/gluster-eventsapi --set PATH "$GLUSTER_PATH" --set PYTHONPATH "$GLUSTER_PYTHONPATH" --set LD_LIBRARY_PATH "$GLUSTER_LD_LIBRARY_PATH" + wrapProgram $out/bin/gluster-georep-sshkey --set PATH "$GLUSTER_PATH" --set PYTHONPATH "$GLUSTER_PYTHONPATH" --set LD_LIBRARY_PATH "$GLUSTER_LD_LIBRARY_PATH" + wrapProgram $out/bin/gluster-mountbroker --set PATH "$GLUSTER_PATH" --set PYTHONPATH "$GLUSTER_PYTHONPATH" --set LD_LIBRARY_PATH "$GLUSTER_LD_LIBRARY_PATH" + wrapProgram $out/bin/glusterfind --set PATH "$GLUSTER_PATH" --set PYTHONPATH "$GLUSTER_PYTHONPATH" --set LD_LIBRARY_PATH "$GLUSTER_LD_LIBRARY_PATH" + + # Note that we only wrap the symlinks in $out/bin, not the actual executable scripts in $out/libexec/glusterfs. + # This is because those scripts use `__file__` in their program logic + # (see https://github.com/gluster/glusterfs/blob/v3.10.1/extras/cliutils/cliutils.py#L116) + # which would break if we changed the file name (which is what `wrapProgram` does). + # Luckily, `libexec` scripts are never supposed to be invoked straight from PATH, + # instead they are invoked directly from `gluster` or `glusterd`, which is why it is + # sufficient to set PYTHONPATH for those executables. + + wrapProgram $out/share/glusterfs/scripts/eventsdash.py --set PATH "$GLUSTER_PATH" --set PYTHONPATH "$GLUSTER_PYTHONPATH" --set LD_LIBRARY_PATH "$GLUSTER_LD_LIBRARY_PATH" + ''; + + doInstallCheck = true; + + # Below we run Python programs. That generates .pyc/.pyo files. + # By default they are indeterministic because such files contain time stamps + # (see https://nedbatchelder.com/blog/200804/the_structure_of_pyc_files.html). + # So we use the same environment variables as in + # https://github.com/NixOS/nixpkgs/blob/249b34aadca7038207492f29142a3456d0cecec3/pkgs/development/interpreters/python/mk-python-derivation.nix#L61 + # to make these files deterministic. + # A general solution to this problem might be brought by #25707. + DETERMINISTIC_BUILD = 1; + PYTHONHASHSEED = 0; + + installCheckPhase = '' + # Tests that the above programs work without import errors. + # For testing it manually in a shell you may want to substitute `$out` with `$(dirname $(readlink -f $(which gluster)))/../`. + $out/bin/glusterd --help + # $out/bin/gluster help # can't do this because even `gluster help` tries to write to `/var/log/glusterfs/cli.log` + $out/bin/gluster-eventsapi --help + $out/bin/gluster-georep-sshkey --help + $out/bin/gluster-mountbroker --help + $out/bin/glusterfind --help + # gfid_to_path.py doesn't accept --help, and it requires different arguments + # (a dir as single argument) than the usage prints when stdin is not a TTY. + # The `echo ""` is just so that stdin is not a TTY even if you try this line + # on a real TTY for testing purposes. + echo "" | (mkdir -p nix-test-dir-for-gfid_to_path && touch b && $out/libexec/glusterfs/gfind_missing_files/gfid_to_path.py nix-test-dir-for-gfid_to_path) + $out/share/glusterfs/scripts/eventsdash.py --help ''; src = fetchurl { diff --git a/pkgs/tools/filesystems/glusterfs/glusterfs-fix-unsubstituted-autoconf-macros.patch b/pkgs/tools/filesystems/glusterfs/glusterfs-fix-unsubstituted-autoconf-macros.patch new file mode 100644 index 000000000000..de3c2fa9f62e --- /dev/null +++ b/pkgs/tools/filesystems/glusterfs/glusterfs-fix-unsubstituted-autoconf-macros.patch @@ -0,0 +1,236 @@ +From b37e0222a6a60505868a6fbb8591608cdc4bba57 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Niklas=20Hamb=C3=BCchen?= +Date: Sat, 13 May 2017 15:33:27 +0200 +Subject: [PATCH] Revert "build/packaging: Debian and Ubuntu don't have + /usr/libexec". Fixes #1450588 + +This reverts commit 18509e436f8a728ef522f3e76e2f2dc30e1bd8ac. + +This fixes autoconf unsubstituted strings to appear in generated source code. +--- + cli/src/Makefile.am | 2 +- + configure.ac | 12 ++++++------ + events/src/Makefile.am | 8 ++++---- + extras/Makefile.am | 2 +- + geo-replication/src/Makefile.am | 8 ++++---- + geo-replication/syncdaemon/Makefile.am | 2 +- + tools/gfind_missing_files/Makefile.am | 4 ++-- + tools/glusterfind/Makefile.am | 4 ++-- + tools/glusterfind/src/Makefile.am | 2 +- + xlators/features/ganesha/src/Makefile.am | 2 +- + xlators/mgmt/glusterd/src/Makefile.am | 2 +- + 11 files changed, 24 insertions(+), 24 deletions(-) + +diff --git a/cli/src/Makefile.am b/cli/src/Makefile.am +index 5ef9389..f5b8d00 100644 +--- a/cli/src/Makefile.am ++++ b/cli/src/Makefile.am +@@ -18,7 +18,7 @@ AM_CPPFLAGS = $(GF_CPPFLAGS) \ + -I$(top_builddir)/rpc/xdr/src\ + -DDATADIR=\"$(localstatedir)\" \ + -DCONFDIR=\"$(sysconfdir)/glusterfs\" \ +- -DGSYNCD_PREFIX=\"$(GLUSTERFS_LIBEXECDIR)\"\ ++ -DGSYNCD_PREFIX=\"$(libexecdir)/glusterfs\"\ + -DSYNCDAEMON_COMPILE=$(SYNCDAEMON_COMPILE) -DSBIN_DIR=\"$(sbindir)\"\ + $(XML_CPPFLAGS) + +diff --git a/configure.ac b/configure.ac +index c9742e2..0c3a386 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1056,24 +1056,24 @@ old_prefix=$prefix + if test "x$prefix" = xNONE; then + prefix=$ac_default_prefix + fi +-GLUSTERFS_LIBEXECDIR="$libexecdir/glusterfs" +-GLUSTERFSD_MISCDIR="$prefix/var/lib/misc/glusterfsd" ++GLUSTERFS_LIBEXECDIR="$(eval echo $prefix)/libexec/glusterfs" ++GLUSTERFSD_MISCDIR="$(eval echo $prefix)/var/lib/misc/glusterfsd" + prefix=$old_prefix + + ### Dirty hacky stuff to make LOCALSTATEDIR work + if test "x$prefix" = xNONE; then +- test $localstatedir = '$prefix/var' && localstatedir=$ac_default_prefix/var ++ test $localstatedir = '${prefix}/var' && localstatedir=$ac_default_prefix/var + localstatedir=/var +- LOCALSTATEDIR=$localstatedir ++ LOCALSTATEDIR=$(eval echo ${localstatedir}) + else +- LOCALSTATEDIR=$localstatedir ++ LOCALSTATEDIR=$(eval echo ${localstatedir}) + fi + + old_prefix=$prefix + if test "x$prefix" = xNONE; then + prefix=$ac_default_prefix + fi +-GLUSTERD_VOLFILE="$sysconfdir/glusterfs/glusterd.vol" ++GLUSTERD_VOLFILE="$(eval echo ${sysconfdir})/glusterfs/glusterd.vol" + prefix=$old_prefix + + +diff --git a/events/src/Makefile.am b/events/src/Makefile.am +index 8493abd..87282c6 100644 +--- a/events/src/Makefile.am ++++ b/events/src/Makefile.am +@@ -5,7 +5,7 @@ EXTRA_DIST = glustereventsd.py __init__.py eventsapiconf.py.in \ + BUILT_SOURCES = eventtypes.py + CLEANFILES = eventtypes.py + +-eventsdir = $(GLUSTERFS_LIBEXECDIR)/events ++eventsdir = $(libexecdir)/glusterfs/events + events_PYTHON = __init__.py gf_event.py eventsapiconf.py eventtypes.py \ + utils.py + +@@ -13,7 +13,7 @@ eventtypes.py: $(top_srcdir)/events/eventskeygen.py + $(PYTHON) $(top_srcdir)/events/eventskeygen.py PY_HEADER + + if BUILD_EVENTS +-eventspeerscriptdir = $(GLUSTERFS_LIBEXECDIR) ++eventspeerscriptdir = $(libexecdir)/glusterfs + eventsconfdir = $(sysconfdir)/glusterfs + eventsconf_DATA = eventsconfig.json + +@@ -24,10 +24,10 @@ eventspeerscript_SCRIPTS = peer_eventsapi.py + install-exec-hook: + $(mkdir_p) $(DESTDIR)$(sbindir) + rm -f $(DESTDIR)$(sbindir)/glustereventsd +- ln -s $(GLUSTERFS_LIBEXECDIR)/events/glustereventsd.py \ ++ ln -s $(libexecdir)/glusterfs/events/glustereventsd.py \ + $(DESTDIR)$(sbindir)/glustereventsd + rm -f $(DESTDIR)$(sbindir)/gluster-eventsapi +- ln -s $(GLUSTERFS_LIBEXECDIR)/peer_eventsapi.py \ ++ ln -s $(libexecdir)/glusterfs/peer_eventsapi.py \ + $(DESTDIR)$(sbindir)/gluster-eventsapi + + uninstall-hook: +diff --git a/extras/Makefile.am b/extras/Makefile.am +index 9dfc93d..53ac476 100644 +--- a/extras/Makefile.am ++++ b/extras/Makefile.am +@@ -1,4 +1,4 @@ +-addonexecdir = $(GLUSTERFS_LIBEXECDIR) ++addonexecdir = $(libexecdir)/glusterfs + addonexec_SCRIPTS = peer_add_secret_pub + + EditorModedir = $(docdir) +diff --git a/geo-replication/src/Makefile.am b/geo-replication/src/Makefile.am +index 9937a0b..87435d5 100644 +--- a/geo-replication/src/Makefile.am ++++ b/geo-replication/src/Makefile.am +@@ -1,4 +1,4 @@ +-gsyncddir = $(GLUSTERFS_LIBEXECDIR) ++gsyncddir = $(libexecdir)/glusterfs + + gsyncd_SCRIPTS = gverify.sh peer_gsec_create \ + set_geo_rep_pem_keys.sh peer_mountbroker peer_mountbroker.py \ +@@ -21,7 +21,7 @@ noinst_HEADERS = procdiggy.h + + AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \ + -I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \ +- -DGSYNCD_PREFIX=\"$(GLUSTERFS_LIBEXECDIR)\" -DUSE_LIBGLUSTERFS \ ++ -DGSYNCD_PREFIX=\"$(libexecdir)/glusterfs\" -DUSE_LIBGLUSTERFS \ + -DSBIN_DIR=\"$(sbindir)\" -DPYTHON=\"$(PYTHON)\" + + AM_CFLAGS = -Wall $(GF_CFLAGS) +@@ -35,11 +35,11 @@ $(top_builddir)/libglusterfs/src/libglusterfs.la: + install-exec-hook: + $(mkdir_p) $(DESTDIR)$(sbindir) + rm -f $(DESTDIR)$(sbindir)/gluster-mountbroker +- ln -s $(GLUSTERFS_LIBEXECDIR)/peer_mountbroker.py \ ++ ln -s $(libexecdir)/glusterfs/peer_mountbroker.py \ + $(DESTDIR)$(sbindir)/gluster-mountbroker + + rm -f $(DESTDIR)$(sbindir)/gluster-georep-sshkey +- ln -s $(GLUSTERFS_LIBEXECDIR)/peer_georep-sshkey.py \ ++ ln -s $(libexecdir)/glusterfs/peer_georep-sshkey.py \ + $(DESTDIR)$(sbindir)/gluster-georep-sshkey + + +diff --git a/geo-replication/syncdaemon/Makefile.am b/geo-replication/syncdaemon/Makefile.am +index f80fb26..7cdaf45 100644 +--- a/geo-replication/syncdaemon/Makefile.am ++++ b/geo-replication/syncdaemon/Makefile.am +@@ -1,4 +1,4 @@ +-syncdaemondir = $(GLUSTERFS_LIBEXECDIR)/python/syncdaemon ++syncdaemondir = $(libexecdir)/glusterfs/python/syncdaemon + + syncdaemon_PYTHON = gconf.py gsyncd.py __init__.py master.py README.md repce.py \ + resource.py configinterface.py syncdutils.py monitor.py libcxattr.py \ +diff --git a/tools/gfind_missing_files/Makefile.am b/tools/gfind_missing_files/Makefile.am +index f77f789..043c34c 100644 +--- a/tools/gfind_missing_files/Makefile.am ++++ b/tools/gfind_missing_files/Makefile.am +@@ -1,4 +1,4 @@ +-gfindmissingfilesdir = $(GLUSTERFS_LIBEXECDIR)/gfind_missing_files ++gfindmissingfilesdir = $(libexecdir)/glusterfs/gfind_missing_files + + gfindmissingfiles_SCRIPTS = gfind_missing_files.sh gfid_to_path.sh \ + gfid_to_path.py +@@ -21,6 +21,6 @@ uninstall-local: + + install-data-local: + rm -f $(DESTDIR)$(sbindir)/gfind_missing_files +- ln -s $(GLUSTERFS_LIBEXECDIR)/gfind_missing_files/gfind_missing_files.sh $(DESTDIR)$(sbindir)/gfind_missing_files ++ ln -s $(libexecdir)/glusterfs/gfind_missing_files/gfind_missing_files.sh $(DESTDIR)$(sbindir)/gfind_missing_files + + CLEANFILES = +diff --git a/tools/glusterfind/Makefile.am b/tools/glusterfind/Makefile.am +index 92fa614..37f23be 100644 +--- a/tools/glusterfind/Makefile.am ++++ b/tools/glusterfind/Makefile.am +@@ -6,7 +6,7 @@ bin_SCRIPTS = glusterfind + + CLEANFILES = $(bin_SCRIPTS) + +-deletehookscriptsdir = $(GLUSTERFS_LIBEXECDIR)/glusterfind/ ++deletehookscriptsdir = $(libexecdir)/glusterfs/glusterfind/ + deletehookscripts_SCRIPTS = S57glusterfind-delete-post.py + + uninstall-local: +@@ -16,5 +16,5 @@ install-data-local: + $(mkdir_p) $(DESTDIR)$(GLUSTERD_WORKDIR)/glusterfind/.keys + $(mkdir_p) $(DESTDIR)$(GLUSTERD_WORKDIR)/hooks/1/delete/post/ + rm -f $(DESTDIR)$(GLUSTERD_WORKDIR)/hooks/1/delete/post/S57glusterfind-delete-post +- ln -s $(GLUSTERFS_LIBEXECDIR)/glusterfind/S57glusterfind-delete-post.py \ ++ ln -s $(libexecdir)/glusterfs/glusterfind/S57glusterfind-delete-post.py \ + $(DESTDIR)$(GLUSTERD_WORKDIR)/hooks/1/delete/post/S57glusterfind-delete-post +diff --git a/tools/glusterfind/src/Makefile.am b/tools/glusterfind/src/Makefile.am +index e4469c1..541ff94 100644 +--- a/tools/glusterfind/src/Makefile.am ++++ b/tools/glusterfind/src/Makefile.am +@@ -1,4 +1,4 @@ +-glusterfinddir = $(GLUSTERFS_LIBEXECDIR)/glusterfind ++glusterfinddir = $(libexecdir)/glusterfs/glusterfind + + glusterfind_PYTHON = conf.py utils.py __init__.py \ + main.py libgfchangelog.py changelogdata.py +diff --git a/xlators/features/ganesha/src/Makefile.am b/xlators/features/ganesha/src/Makefile.am +index 78715d6..54cfcb3 100644 +--- a/xlators/features/ganesha/src/Makefile.am ++++ b/xlators/features/ganesha/src/Makefile.am +@@ -12,7 +12,7 @@ AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \ + -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D$(GF_HOST_OS)\ + -I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \ + -DGANESHA_DIR=\"$(sysconfdir)/ganesha\" \ +- -DGYSNCD_PREFIX=\"$(GLUSTERFS_LIBEXECDIR)\" ++ -DGYSNCD_PREFIX=\"$(libexecdir)/glusterfs\" + + AM_CFLAGS = -Wall $(GF_CFLAGS) + +diff --git a/xlators/mgmt/glusterd/src/Makefile.am b/xlators/mgmt/glusterd/src/Makefile.am +index 23ebf37..4f2fffd 100644 +--- a/xlators/mgmt/glusterd/src/Makefile.am ++++ b/xlators/mgmt/glusterd/src/Makefile.am +@@ -47,7 +47,7 @@ AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \ + -I$(CONTRIBDIR)/rbtree -I$(top_srcdir)/rpc/rpc-lib/src \ + -I$(CONTRIBDIR)/mount -I$(CONTRIBDIR)/userspace-rcu \ + -DSBIN_DIR=\"$(sbindir)\" -DDATADIR=\"$(localstatedir)\" \ +- -DGSYNCD_PREFIX=\"$(GLUSTERFS_LIBEXECDIR)\" \ ++ -DGSYNCD_PREFIX=\"$(libexecdir)/glusterfs\" \ + -DCONFDIR=\"$(localstatedir)/run/gluster/shared_storage/nfs-ganesha\" \ + -DGANESHA_PREFIX=\"$(libexecdir)/ganesha\" \ + -DSYNCDAEMON_COMPILE=$(SYNCDAEMON_COMPILE) $(XML_CPPFLAGS) +-- +2.7.4 + diff --git a/pkgs/tools/filesystems/glusterfs/glusterfs-python-remove-find_library.patch b/pkgs/tools/filesystems/glusterfs/glusterfs-python-remove-find_library.patch new file mode 100644 index 000000000000..6dd1baad5dff --- /dev/null +++ b/pkgs/tools/filesystems/glusterfs/glusterfs-python-remove-find_library.patch @@ -0,0 +1,151 @@ +From d321df349d10f038f0c89b9c11f8059572264f1b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Niklas=20Hamb=C3=BCchen?= +Date: Sat, 13 May 2017 18:54:36 +0200 +Subject: [PATCH] python: Remove all uses of find_library. Fixes #1450593 + +`find_library()` doesn't consider LD_LIBRARY_PATH on Python < 3.6. +--- + api/examples/getvolfile.py | 2 +- + geo-replication/syncdaemon/libcxattr.py | 3 +-- + geo-replication/syncdaemon/libgfchangelog.py | 3 +-- + tests/features/ipctest.py | 10 ++-------- + tests/utils/libcxattr.py | 5 ++--- + tools/glusterfind/src/libgfchangelog.py | 3 +-- + .../features/changelog/lib/examples/python/libgfchangelog.py | 3 +-- + 7 files changed, 9 insertions(+), 20 deletions(-) + +diff --git a/api/examples/getvolfile.py b/api/examples/getvolfile.py +index 0c95213..32c2268 100755 +--- a/api/examples/getvolfile.py ++++ b/api/examples/getvolfile.py +@@ -3,7 +3,7 @@ + import ctypes + import ctypes.util + +-api = ctypes.CDLL(ctypes.util.find_library("gfapi")) ++api = ctypes.CDLL("libgfapi.so") + api.glfs_get_volfile.argtypes = [ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_ulong] +diff --git a/geo-replication/syncdaemon/libcxattr.py b/geo-replication/syncdaemon/libcxattr.py +index 3671e10..f576648 100644 +--- a/geo-replication/syncdaemon/libcxattr.py ++++ b/geo-replication/syncdaemon/libcxattr.py +@@ -10,7 +10,6 @@ + + import os + from ctypes import CDLL, create_string_buffer, get_errno +-from ctypes.util import find_library + + + class Xattr(object): +@@ -25,7 +24,7 @@ class Xattr(object): + sizes we expect + """ + +- libc = CDLL(find_library("c"), use_errno=True) ++ libc = CDLL("libc.so.6", use_errno=True) + + @classmethod + def geterrno(cls): +diff --git a/geo-replication/syncdaemon/libgfchangelog.py b/geo-replication/syncdaemon/libgfchangelog.py +index d87b56c..003c28c 100644 +--- a/geo-replication/syncdaemon/libgfchangelog.py ++++ b/geo-replication/syncdaemon/libgfchangelog.py +@@ -10,12 +10,11 @@ + + import os + from ctypes import CDLL, RTLD_GLOBAL, create_string_buffer, get_errno, byref, c_ulong +-from ctypes.util import find_library + from syncdutils import ChangelogException, ChangelogHistoryNotAvailable + + + class Changes(object): +- libgfc = CDLL(find_library("gfchangelog"), mode=RTLD_GLOBAL, use_errno=True) ++ libgfc = CDLL("libgfchangelog.so", mode=RTLD_GLOBAL, use_errno=True) + + @classmethod + def geterrno(cls): +diff --git a/tests/features/ipctest.py b/tests/features/ipctest.py +index 5aff319..9339248 100755 +--- a/tests/features/ipctest.py ++++ b/tests/features/ipctest.py +@@ -1,14 +1,8 @@ + #!/usr/bin/python + + import ctypes +-import ctypes.util +- +-# find_library does not lookup LD_LIBRARY_PATH and may miss the +-# function. In that case, retry with less portable but explicit name. +-libgfapi = ctypes.util.find_library("gfapi") +-if libgfapi == None: +- libgfapi = "libgfapi.so" +-api = ctypes.CDLL(libgfapi,mode=ctypes.RTLD_GLOBAL) ++ ++api = ctypes.CDLL("libgfapi.so",mode=ctypes.RTLD_GLOBAL) + + api.glfs_ipc.argtypes = [ ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p, ctypes.c_void_p ] + api.glfs_ipc.restype = ctypes.c_int +diff --git a/tests/utils/libcxattr.py b/tests/utils/libcxattr.py +index 149db72..4e6e6c4 100644 +--- a/tests/utils/libcxattr.py ++++ b/tests/utils/libcxattr.py +@@ -11,7 +11,6 @@ + import os + import sys + from ctypes import CDLL, c_int, create_string_buffer +-from ctypes.util import find_library + + + class Xattr(object): +@@ -28,9 +27,9 @@ class Xattr(object): + + if sys.hexversion >= 0x02060000: + from ctypes import DEFAULT_MODE +- libc = CDLL(find_library("libc"), DEFAULT_MODE, None, True) ++ libc = CDLL("libc.so.6", DEFAULT_MODE, None, True) + else: +- libc = CDLL(find_library("libc")) ++ libc = CDLL("libc.so.6") + + @classmethod + def geterrno(cls): +diff --git a/tools/glusterfind/src/libgfchangelog.py b/tools/glusterfind/src/libgfchangelog.py +index dd8153e..da822cf 100644 +--- a/tools/glusterfind/src/libgfchangelog.py ++++ b/tools/glusterfind/src/libgfchangelog.py +@@ -12,14 +12,13 @@ + import os + from ctypes import CDLL, get_errno, create_string_buffer, c_ulong, byref + from ctypes import RTLD_GLOBAL +-from ctypes.util import find_library + + + class ChangelogException(OSError): + pass + + +-libgfc = CDLL(find_library("gfchangelog"), use_errno=True, mode=RTLD_GLOBAL) ++libgfc = CDLL("libgfchangelog.so", use_errno=True, mode=RTLD_GLOBAL) + + + def raise_oserr(): +diff --git a/xlators/features/changelog/lib/examples/python/libgfchangelog.py b/xlators/features/changelog/lib/examples/python/libgfchangelog.py +index 10e73c0..2cdbf11 100644 +--- a/xlators/features/changelog/lib/examples/python/libgfchangelog.py ++++ b/xlators/features/changelog/lib/examples/python/libgfchangelog.py +@@ -1,9 +1,8 @@ + import os + from ctypes import * +-from ctypes.util import find_library + + class Changes(object): +- libgfc = CDLL(find_library("gfchangelog"), mode=RTLD_GLOBAL, use_errno=True) ++ libgfc = CDLL("libgfchangelog.so", mode=RTLD_GLOBAL, use_errno=True) + + @classmethod + def geterrno(cls): +-- +2.7.4 + diff --git a/pkgs/tools/filesystems/glusterfs/glusterfs-use-PATH-instead-of-hardcodes.patch b/pkgs/tools/filesystems/glusterfs/glusterfs-use-PATH-instead-of-hardcodes.patch new file mode 100644 index 000000000000..874d47cc148b --- /dev/null +++ b/pkgs/tools/filesystems/glusterfs/glusterfs-use-PATH-instead-of-hardcodes.patch @@ -0,0 +1,160 @@ +From 67fbd3aadc2c4caeb14418609f5c7af6de36081b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Niklas=20Hamb=C3=BCchen?= +Date: Sat, 13 May 2017 02:45:49 +0200 +Subject: [PATCH] Don't use hardcoded /sbin, /usr/bin etc. paths. Fixes + #1450546. + +Instead, rely on programs to be in PATH, as gluster already +does in many places across its code base. +--- + contrib/fuse-lib/mount-common.c | 8 ++++---- + xlators/mgmt/glusterd/src/glusterd-ganesha.c | 8 ++++---- + xlators/mgmt/glusterd/src/glusterd-quota.c | 6 +++--- + xlators/mgmt/glusterd/src/glusterd-snapshot.c | 4 ++-- + xlators/mgmt/glusterd/src/glusterd-utils.c | 13 +------------ + 5 files changed, 14 insertions(+), 25 deletions(-) + +diff --git a/contrib/fuse-lib/mount-common.c b/contrib/fuse-lib/mount-common.c +index e9f80fe..6380dd8 100644 +--- a/contrib/fuse-lib/mount-common.c ++++ b/contrib/fuse-lib/mount-common.c +@@ -255,16 +255,16 @@ fuse_mnt_umount (const char *progname, const char *abs_mnt, + exit (1); + } + #ifdef GF_LINUX_HOST_OS +- execl ("/bin/umount", "/bin/umount", "-i", rel_mnt, ++ execl ("umount", "umount", "-i", rel_mnt, + lazy ? "-l" : NULL, NULL); +- GFFUSE_LOGERR ("%s: failed to execute /bin/umount: %s", ++ GFFUSE_LOGERR ("%s: failed to execute umount: %s", + progname, strerror (errno)); + #elif __NetBSD__ + /* exitting the filesystem causes the umount */ + exit (0); + #else +- execl ("/sbin/umount", "/sbin/umount", "-f", rel_mnt, NULL); +- GFFUSE_LOGERR ("%s: failed to execute /sbin/umount: %s", ++ execl ("umount", "umount", "-f", rel_mnt, NULL); ++ GFFUSE_LOGERR ("%s: failed to execute umount: %s", + progname, strerror (errno)); + #endif /* GF_LINUX_HOST_OS */ + exit (1); +diff --git a/xlators/mgmt/glusterd/src/glusterd-ganesha.c b/xlators/mgmt/glusterd/src/glusterd-ganesha.c +index 8dde82e..0038e69 100644 +--- a/xlators/mgmt/glusterd/src/glusterd-ganesha.c ++++ b/xlators/mgmt/glusterd/src/glusterd-ganesha.c +@@ -123,15 +123,15 @@ manage_service (char *action) + int i = 0; + int ret = 0; + struct service_command sc_list[] = { +- { .binary = "/usr/bin/systemctl", ++ { .binary = "systemctl", + .service = "nfs-ganesha", + .action = sc_systemctl_action + }, +- { .binary = "/sbin/invoke-rc.d", ++ { .binary = "invoke-rc.d", + .service = "nfs-ganesha", + .action = sc_service_action + }, +- { .binary = "/sbin/service", ++ { .binary = "service", + .service = "nfs-ganesha", + .action = sc_service_action + }, +@@ -144,7 +144,7 @@ manage_service (char *action) + if (ret == 0) { + gf_msg_debug (THIS->name, 0, + "%s found.", sc_list[i].binary); +- if (strcmp (sc_list[i].binary, "/usr/bin/systemctl") == 0) ++ if (strcmp (sc_list[i].binary, "systemctl") == 0) + ret = sc_systemctl_action (&sc_list[i], action); + else + ret = sc_service_action (&sc_list[i], action); +diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c +index c1c95ae..a6eeb69 100644 +--- a/xlators/mgmt/glusterd/src/glusterd-quota.c ++++ b/xlators/mgmt/glusterd/src/glusterd-quota.c +@@ -30,7 +30,7 @@ + + #ifndef _PATH_SETFATTR + # ifdef GF_LINUX_HOST_OS +-# define _PATH_SETFATTR "/usr/bin/setfattr" ++# define _PATH_SETFATTR "setfattr" + # endif + # ifdef __NetBSD__ + # define _PATH_SETFATTR "/usr/pkg/bin/setfattr" +@@ -335,7 +335,7 @@ _glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, + + if (type == GF_QUOTA_OPTION_TYPE_ENABLE || + type == GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS) +- runner_add_args (&runner, "/usr/bin/find", ".", NULL); ++ runner_add_args (&runner, "find", ".", NULL); + + else if (type == GF_QUOTA_OPTION_TYPE_DISABLE) { + +@@ -351,7 +351,7 @@ _glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, + VIRTUAL_QUOTA_XATTR_CLEANUP_KEY, "1", + "{}", "\\", ";", NULL); + #else +- runner_add_args (&runner, "/usr/bin/find", ".", ++ runner_add_args (&runner, "find", ".", + "-exec", _PATH_SETFATTR, "-n", + VIRTUAL_QUOTA_XATTR_CLEANUP_KEY, "-v", + "1", "{}", "\\", ";", NULL); +diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c +index c75a101..b7b659e 100644 +--- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c ++++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c +@@ -121,7 +121,7 @@ glusterd_build_snap_device_path (char *device, char *snapname, + } + + runinit (&runner); +- runner_add_args (&runner, "/sbin/lvs", "--noheadings", "-o", "vg_name", ++ runner_add_args (&runner, "lvs", "--noheadings", "-o", "vg_name", + device, NULL); + runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); + snprintf (msg, sizeof (msg), "Get volume group for device %s", device); +@@ -1982,7 +1982,7 @@ glusterd_is_thinp_brick (char *device, uint32_t *op_errno) + + runinit (&runner); + +- runner_add_args (&runner, "/sbin/lvs", "--noheadings", "-o", "pool_lv", ++ runner_add_args (&runner, "lvs", "--noheadings", "-o", "pool_lv", + device, NULL); + runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); + runner_log (&runner, this->name, GF_LOG_DEBUG, msg); +diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c +index 8f8447a..63d8add 100644 +--- a/xlators/mgmt/glusterd/src/glusterd-utils.c ++++ b/xlators/mgmt/glusterd/src/glusterd-utils.c +@@ -5899,7 +5899,6 @@ static struct fs_info { + char *fs_tool_pattern; + char *fs_tool_pkg; + } glusterd_fs[] = { +- /* some linux have these in /usr/sbin/and others in /sbin/? */ + { "xfs", "xfs_info", NULL, "isize=", "xfsprogs" }, + { "ext3", "tune2fs", "-l", "Inode size:", "e2fsprogs" }, + { "ext4", "tune2fs", "-l", "Inode size:", "e2fsprogs" }, +@@ -5957,17 +5956,7 @@ glusterd_add_inode_size_to_dict (dict_t *dict, int count) + cur_word = "N/A"; + goto cached; + } +- +- snprintf (fs_tool_name, sizeof (fs_tool_name), +- "/usr/sbin/%s", fs->fs_tool_name); +- if (sys_access (fs_tool_name, R_OK|X_OK) == 0) +- runner_add_arg (&runner, fs_tool_name); +- else { +- snprintf (fs_tool_name, sizeof (fs_tool_name), +- "/sbin/%s", fs->fs_tool_name); +- if (sys_access (fs_tool_name, R_OK|X_OK) == 0) +- runner_add_arg (&runner, fs_tool_name); +- } ++ runner_add_arg (&runner, fs->fs_tool_name); + break; + } + } +-- +2.7.4 +