Recursive ACL script

From SciNet Users Documentation
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Recursive ACL script

You may use/adapt one of the following bash scripts to recursively add or remove ACL attributes using gpfs built-in commands

Courtesy of Gabriel Devenyi

#!/bin/bash
# USAGE
#     - on one directory:     ./set_acl.sh aclfile dir_name
#     - on more directories:  ./set_acl.sh aclfile dir1_name dir2_name ...
#
# Based on a contributed script by Gabriel Devenyi.
#

set -euo pipefail
 
aclfile="$1"
shift

for dir in "$@"
do
    find "${dir}" -type d -exec mmputacl -i "${aclfile}" {} \; -exec mmputacl -d -i "${aclfile}" {} \; 
    find "${dir}" -type f -exec mmputacl -i "${aclfile}" {} \; 
done

Courtesy of Agata Disks

(http://csngwinfo.in2p3.fr/mediawiki/index.php/GPFS_ACL)

This script is a bit more verbose and precise in its error messages

#!/bin/bash
# USAGE
#     - on one directory:     ./set_acl.sh dir_name
#     - on more directories:  ./set_acl.sh 'dir_nam*'
#

# Path of the file that contains the ACL
ACL_FILE_PATH=/agatadisks/data/acl_file.acl

# Directories onto the ACLs have to be set
dirs=$1

# Recursive function that sets ACL to files and directories
set_acl () {
  curr_dir=$1
  for args in $curr_dir/*
  do
    if [ -f $args ]; then
      echo "ACL set on file $args"
      mmputacl -i $ACL_FILE_PATH $args
      if [ $? -ne 0 ]; then
        echo "ERROR: ACL not set on $args"
        exit -1
      fi
    fi
    if [ -d $args ]; then
      # Set Default ACL in directory
      mmputacl -i $ACL_FILE_PATH $args -d
      if [ $? -ne 0 ]; then
        echo "ERROR: Default ACL not set on $args"
        exit -1
      fi
      echo "Default ACL set on directory $args"
      # Set ACL in directory
      mmputacl -i $ACL_FILE_PATH $args
      if [ $? -ne 0 ]; then
        echo "ERROR: ACL not set on $args"
        exit -1
      fi
      echo "ACL set on directory $args"
      set_acl $args
    fi
  done
}
for dir in $dirs
do
  if [ ! -d $dir ]; then
    echo "ERROR: $dir is not a directory"
    exit -1
  fi
  set_acl $dir
done
exit 0

BACK TO Data Management