Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved hpc-environment-permissions.bash #736

Merged
merged 6 commits into from
Feb 27, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 39 additions & 38 deletions roles/envsync/templates/hpc-environment-permissions.bash
Original file line number Diff line number Diff line change
Expand Up @@ -42,36 +42,36 @@ REAL_USER="$(logname 2>/dev/null || echo 'no login name')"
# Retain ownership and change group + perms if necessary on the originals.
#
function verifyAndFixOriginals() {
local _ROOT_OF_HPC_ENV_ORIGINAL="$1"

declare -a local _HPC_ENV_FOLDERS=("${_ROOT_OF_HPC_ENV_ORIGINAL}/modules/"
local _ROOT_OF_HPC_ENV_ORIGINAL="${1}"
declare -a _HPC_ENV_FOLDERS=("${_ROOT_OF_HPC_ENV_ORIGINAL}/modules/"
"${_ROOT_OF_HPC_ENV_ORIGINAL}/software/"
"${_ROOT_OF_HPC_ENV_ORIGINAL}/data/"
"${_ROOT_OF_HPC_ENV_ORIGINAL}/sources/"
"${_ROOT_OF_HPC_ENV_ORIGINAL}/.tmp/")

for (( i = 0 ; i < ${#_HPC_ENV_FOLDERS[@]:-0} ; i++ ))
for (( i = 0 ; i < ${#_HPC_ENV_FOLDERS[@]} ; i++ ))
do
find "${_HPC_ENV_FOLDERS[${i}]}" \! -group "${SYS_GROUP}" -exec chgrp "${SYS_GROUP}" '{}' \;
verifyPermissions "${_HPC_ENV_FOLDERS[${i}]}" '0775' '0664' 'ug+rwX,o+rX,o-w' '2775'
if [[ -e "${_HPC_ENV_FOLDERS[${i}]}" ]]; then
find "${_HPC_ENV_FOLDERS[${i}]}" \! -group "${SYS_GROUP}" -a \! -type l -exec chgrp "${SYS_GROUP}" '{}' \;
verifyPermissions "${_HPC_ENV_FOLDERS[${i}]}" '0775' '0664' 'ug+rwX,o+rX,o-w' '2775'
fi
done
}

#
# Change ownership, group and perms if necessary on the copies.
#
function verifyAndFixCopies() {
local _ROOT_OF_HPC_ENV_COPY="$1"

declare -a local _HPC_ENV_FOLDERS=("${_ROOT_OF_HPC_ENV_COPY}/modules/"
"${_ROOT_OF_HPC_ENV_COPY}/software/"
"${_ROOT_OF_HPC_ENV_COPY}/data/")

for (( i = 0 ; i < ${#_HPC_ENV_FOLDERS[@]:-0} ; i++ ))
local _ROOT_OF_HPC_ENV_COPY="${1}"
declare -a _HPC_ENV_FOLDERS=("${_ROOT_OF_HPC_ENV_COPY}/modules/"
"${_ROOT_OF_HPC_ENV_COPY}/software/"
"${_ROOT_OF_HPC_ENV_COPY}/data/")
for (( i = 0 ; i < ${#_HPC_ENV_FOLDERS[@]} ; i++ ))
do
find "${_HPC_ENV_FOLDERS[${i}]}" \! -user "${SYS_USER}" -exec chown "${SYS_USER}" '{}' \;
find "${_HPC_ENV_FOLDERS[${i}]}" \! -group "${SYS_GROUP}" -exec chgrp "${SYS_GROUP}" '{}' \;
verifyPermissions "${_HPC_ENV_FOLDERS[${i}]}" '0755' '0644' 'u+rwX,go+rX,go-w' '2755'
if [[ -e "${_HPC_ENV_FOLDERS[${i}]}" ]]; then
find "${_HPC_ENV_FOLDERS[${i}]}" \! -user "${SYS_USER}" -a \! -type l -exec chown "${SYS_USER}" '{}' \;
find "${_HPC_ENV_FOLDERS[${i}]}" \! -group "${SYS_GROUP}" -a \! -type l -exec chgrp "${SYS_GROUP}" '{}' \;
verifyPermissions "${_HPC_ENV_FOLDERS[${i}]}" '0755' '0644' 'u+rwX,go+rX,go-w' '2755'
fi
done
}

Expand All @@ -81,14 +81,14 @@ function verifyAndFixCopies() {
# unless there really was something to change. Mostly used for "group" folders.
#
function verifyPermissions() {
local _FOLDER="$1"
local _FIND_FILE_PERMS_EXECUTABLE="$2"
local _FIND_FILE_PERMS_REGULAR="$3"
local _CHMOD_FILE_PERMS="$4"
local _FOLDER_PERMS="$5"
local _FOLDER="${1}"
local _FIND_FILE_PERMS_EXECUTABLE="${2}"
local _FIND_FILE_PERMS_REGULAR="${3}"
local _CHMOD_FILE_PERMS="${4}"
local _FOLDER_PERMS="${5}"
echo "INFO: Verify and fix permissions with file perms ${_CHMOD_FILE_PERMS} and folder perms ${_FOLDER_PERMS} for for folder ${_FOLDER}... "
find "${_FOLDER}" -type f -a \! \( -perm ${_FIND_FILE_PERMS_EXECUTABLE} -o -perm ${_FIND_FILE_PERMS_REGULAR} \) -exec chmod "${_CHMOD_FILE_PERMS}" '{}' \;
find "${_FOLDER}" -type d -a \! -perm ${_FOLDER_PERMS} -exec chmod "${_FOLDER_PERMS}" '{}' \;
find "${_FOLDER}" -type f -a \! \( -perm "${_FIND_FILE_PERMS_EXECUTABLE}" -o -perm "${_FIND_FILE_PERMS_REGULAR}" \) -exec chmod "${_CHMOD_FILE_PERMS}" '{}' \;
find "${_FOLDER}" -type d -a \! -perm "${_FOLDER_PERMS}" -exec chmod "${_FOLDER_PERMS}" '{}' \;
}

#
Expand All @@ -104,7 +104,7 @@ fi
#
# Check (and fix if necessary) our original shared HPC environment.
#
if [ -e ${ORIGINAL_HPC_ENV_PREFIX} ] && [ -d ${ORIGINAL_HPC_ENV_PREFIX} ]; then
if [[ -e "${ORIGINAL_HPC_ENV_PREFIX}" ]] && [[ -d "${ORIGINAL_HPC_ENV_PREFIX}" ]]; then
echo "INFO: Found original environment @ ${ORIGINAL_HPC_ENV_PREFIX}: will verify and fix permissions... "
verifyAndFixOriginals "${ORIGINAL_HPC_ENV_PREFIX}"
echo 'INFO: Done!'
Expand All @@ -115,40 +115,41 @@ fi
#
# Find all rsynced copies of our shared HPC environment.
#
declare -a COPIED_HPC_ENV_PREFIXES
for (( i = 0 ; i < ${#COPIED_HPC_ENV_MOUNT_POINT_PARENTS[@]:-0} ; i++ ))
declare -a COPIED_HPC_ENV_PREFIXES=()
for (( i = 0 ; i < ${#COPIED_HPC_ENV_MOUNT_POINT_PARENTS[@]} ; i++ ))
do
#
# Check for presence of folders for logical file system (LFS) names
# and if present whether they contain a copy of ${ORIGINAL_HPC_ENV_PREFIX}.
#
declare -a LFS_MOUNT_POINTS="$(find ${COPIED_HPC_ENV_MOUNT_POINT_PARENTS[${i}]} -mindepth 1 -maxdepth 1 -type d)"
for (( j = 0 ; j < ${#LFS_MOUNT_POINTS[@]:-0} ; j++ ))
declare -a LFS_MOUNT_POINTS
readarray -t LFS_MOUNT_POINTS< <(find "${COPIED_HPC_ENV_MOUNT_POINT_PARENTS[${i}]}" -mindepth 1 -maxdepth 1 -type d)
for (( j = 0 ; j < ${#LFS_MOUNT_POINTS[@]} ; j++ ))
do
[ -z ${LFS_MOUNT_POINTS[${j}]} ] && continue
[[ -z "${LFS_MOUNT_POINTS[${j}]}" ]] && continue
COPIED_HPC_ENV_PREFIX="${LFS_MOUNT_POINTS[${j}]}${ORIGINAL_HPC_ENV_PREFIX}"
if [ -e "${COPIED_HPC_ENV_PREFIX}" ] && \
[ -r "${COPIED_HPC_ENV_PREFIX}" ] && \
[ -w "${COPIED_HPC_ENV_PREFIX}" ] && \
[ -d "${COPIED_HPC_ENV_PREFIX}" ]; then
if [ "${#COPIED_HPC_ENV_PREFIXES[@]:-0}" -eq 0 ]; then
if [[ -e "${COPIED_HPC_ENV_PREFIX}" ]] && \
[[ -r "${COPIED_HPC_ENV_PREFIX}" ]] && \
[[ -w "${COPIED_HPC_ENV_PREFIX}" ]] && \
[[ -d "${COPIED_HPC_ENV_PREFIX}" ]]; then
if [[ "${#COPIED_HPC_ENV_PREFIXES[@]}" -eq 0 ]]; then
COPIED_HPC_ENV_PREFIXES=("${COPIED_HPC_ENV_PREFIX}")
else
COPIED_HPC_ENV_PREFIXES=("${COPIED_HPC_ENV_PREFIXES[@]:-}" "${COPIED_HPC_ENV_PREFIX}")
fi
else
echo "WARN: ${COPIED_HPC_ENV_PREFIX} not available (symlink dead or mount missing)."
echo "INFO: No ${ORIGINAL_HPC_ENV_PREFIX} copy found on ${LFS_MOUNT_POINTS[${j}]}."
fi
done
done

#
# Check (and fix if necessary) all rsynced copies of our shared HPC environment.
#
if [ "${#COPIED_HPC_ENV_PREFIXES[@]:-0}" -eq 0 ]; then
if [[ "${#COPIED_HPC_ENV_PREFIXES[@]}" -eq 0 ]]; then
echo "WARN: Found no environment copies and will not verify and fix permissions for environment copies."
else
for THIS_HPC_ENV_PREFIX in ${COPIED_HPC_ENV_PREFIXES[@]:-}; do
for THIS_HPC_ENV_PREFIX in "${COPIED_HPC_ENV_PREFIXES[@]:-}"; do
echo "INFO: Will verify and fix permissions for environment copy @ ${THIS_HPC_ENV_PREFIX} ... "
verifyAndFixCopies "${THIS_HPC_ENV_PREFIX}"
echo 'INFO: Done!'
Expand Down