diff options
Diffstat (limited to 'extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh')
| -rwxr-xr-x | extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh | 100 | 
1 files changed, 100 insertions, 0 deletions
diff --git a/extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh b/extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh new file mode 100755 index 00000000000..4a17c993a77 --- /dev/null +++ b/extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh @@ -0,0 +1,100 @@ +#!/bin/bash +# +# Install to hooks/<HOOKS_VER>/add-brick/post +# +# Add an SELinux file context for each brick using the glusterd_brick_t type. +# This ensures that the brick is relabeled correctly on an SELinux restart or +# restore. Subsequently, run a restore on the brick path to set the selinux +# labels. +# +### + +PROGNAME="Sselinux" +OPTSPEC="volname:,version:,gd-workdir:,volume-op:" +VOL= + +parse_args () { +  ARGS=$(getopt -o '' -l ${OPTSPEC} -n ${PROGNAME} -- "$@") +  eval set -- "${ARGS}" + +  while true; do +    case ${1} in +      --volname) +        shift +        VOL=${1} +        ;; +      --gd-workdir) +          shift +          GLUSTERD_WORKDIR=$1 +          ;; +      --version) +          shift +          ;; +      --volume-op) +          shift +          ;; +      *) +          shift +          break +          ;; +    esac +    shift +  done +} + +set_brick_labels() +{ +  local volname="${1}" +  local fctx +  local list=() + +  fctx="$(semanage fcontext --list -C)" + +  # wait for new brick path to be updated under +  # ${GLUSTERD_WORKDIR}/vols/${volname}/bricks/ +  sleep 5 + +  # grab the path for each local brick +  brickpath="${GLUSTERD_WORKDIR}/vols/${volname}/bricks/" +  brickdirs=$( +    find "${brickpath}" -type f -exec grep '^path=' {} \; | \ +    cut -d= -f 2 | \ +    sort -u +  ) + +  # create a list of bricks for which custom SELinux +  # label doesn't exist +  for b in ${brickdirs}; do +    pattern="${b}(/.*)?" +    echo "${fctx}" | grep "^${pattern}\s" >/dev/null +    if [[ $? -ne 0 ]]; then +      list+=("${pattern}") +    fi +  done + +  # Add a file context for each brick path in the list and associate with the +  # glusterd_brick_t SELinux type. +  for p in ${list[@]} +  do +    semanage fcontext --add -t glusterd_brick_t -r s0 "${p}" +  done + +  # Set the labels for which SELinux label was added above +  for b in ${brickdirs} +  do +    echo "${list[@]}" | grep "${b}" >/dev/null +    if [[ $? -eq 0 ]]; then +      restorecon -R "${b}" +    fi +  done +} + +SELINUX_STATE=$(which getenforce && getenforce) +[ "${SELINUX_STATE}" = 'Disabled' ] && exit 0 + +parse_args "$@" +[ -z "${VOL}" ] && exit 1 + +set_brick_labels "${VOL}" + +exit 0  | 
