summaryrefslogtreecommitdiff
path: root/lib/spack/spack/hooks/sbang.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/spack/spack/hooks/sbang.py')
-rw-r--r--lib/spack/spack/hooks/sbang.py45
1 files changed, 42 insertions, 3 deletions
diff --git a/lib/spack/spack/hooks/sbang.py b/lib/spack/spack/hooks/sbang.py
index ce2cf3435d..179416f03c 100644
--- a/lib/spack/spack/hooks/sbang.py
+++ b/lib/spack/spack/hooks/sbang.py
@@ -4,6 +4,7 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import filecmp
+import grp
import os
import re
import shutil
@@ -14,7 +15,9 @@ import tempfile
import llnl.util.filesystem as fs
import llnl.util.tty as tty
+import spack.package_prefs
import spack.paths
+import spack.spec
import spack.store
#: OS-imposed character limit for shebang line: 127 for Linux; 511 for Mac.
@@ -187,11 +190,47 @@ def install_sbang():
spack.paths.sbang_script, sbang_path):
return
- # make $install_tree/bin and copy in a new version of sbang if needed
+ # make $install_tree/bin
sbang_bin_dir = os.path.dirname(sbang_path)
fs.mkdirp(sbang_bin_dir)
- fs.install(spack.paths.sbang_script, sbang_path)
- fs.set_install_permissions(sbang_bin_dir)
+
+ # get permissions for bin dir from configuration files
+ group_name = spack.package_prefs.get_package_group(spack.spec.Spec("all"))
+ config_mode = spack.package_prefs.get_package_dir_permissions(
+ spack.spec.Spec("all")
+ )
+
+ if group_name:
+ os.chmod(sbang_bin_dir, config_mode) # Use package directory permissions
+ else:
+ fs.set_install_permissions(sbang_bin_dir)
+
+ # set group on sbang_bin_dir if not already set (only if set in configuration)
+ if group_name and grp.getgrgid(os.stat(sbang_bin_dir).st_gid).gr_name != group_name:
+ os.chown(
+ sbang_bin_dir,
+ os.stat(sbang_bin_dir).st_uid,
+ grp.getgrnam(group_name).gr_gid
+ )
+
+ # copy over the fresh copy of `sbang`
+ sbang_tmp_path = os.path.join(
+ os.path.dirname(sbang_path),
+ ".%s.tmp" % os.path.basename(sbang_path),
+ )
+ shutil.copy(spack.paths.sbang_script, sbang_tmp_path)
+
+ # set permissions on `sbang` (including group if set in configuration)
+ os.chmod(sbang_tmp_path, config_mode)
+ if group_name:
+ os.chown(
+ sbang_tmp_path,
+ os.stat(sbang_tmp_path).st_uid,
+ grp.getgrnam(group_name).gr_gid
+ )
+
+ # Finally, move the new `sbang` into place atomically
+ os.rename(sbang_tmp_path, sbang_path)
def post_install(spec):