#!/usr/bin/env bash script_name="$(basename $(realpath $0))" working_dir="$(dirname $(realpath $0))" conf_file="${working_dir}/conf/set_directory_permissions.conf" LOCK_DIR="/tmp/set_directory_permissions.LOCK" # ------------- # - Some functions # ------------- clean_up() { # Perform program exit housekeeping rm -rf "$LOCK_DIR" exit $1 } echononl(){ if $terminal ; then echo X\\c > /tmp/shprompt$$ if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then echo -e -n "$*\\c" 1>&2 else echo -e -n "$*" 1>&2 fi rm /tmp/shprompt$$ fi } fatal(){ echo "" if $terminal ; then echo -e " [ \033[31m\033[1mFatal\033[m ]: $*" echo "" echo -e " \033[31m\033[1mScript was terminated\033[m!" else echo " [ Fatal ]: $*" echo "" echo " Script was terminated...." fi echo "" clean_up 1 } error (){ echo "" if $terminal ; then echo -e " [ \033[31m\033[1mError\033[m ]: $*" else echo "[ Error ]: $*" fi echo "" } warn (){ echo "" if $terminal ; then echo -e " [ \033[33m\033[1mWarning\033[m ]: $*" else echo "[ Warning ]: $*" fi echo "" } info (){ if $terminal ; then echo "" echo -e " [ \033[32m\033[1mInfo\033[m ]: $*" echo "" fi } echo_done() { if $terminal ; then echo -e "\033[75G[ \033[32mdone\033[m ]" fi } echo_failed(){ if $terminal && $LOGGING ; then echo -e "\033[75G[ \033[1;31mfailed\033[m ]" fi } echo_skipped() { if $terminal && $LOGGING ; then echo -e "\033[75G[ \033[33m\033[1mskipped\033[m ]" fi } trim() { local var="$*" var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters echo -n "$var" } # ------------- # - Running in a terminal? # ------------- if [[ -t 1 ]] ; then terminal=true else terminal=false fi warn "Script '$script_name' is deprecated. Use 'set_permissions.sh' instead." # ------------- # - Read Configurations from $conf_file # ------------- if [[ ! -f "$conf_file" ]]; then fatal " Configuration file '$(basename ${conf_file})' not found!" else source "$conf_file" fi [[ -z "$(trim $dir_permissions)" ]] && fatal "No directory given!" # ------------- # - Job is already running? # ------------- # - If job already runs, stop execution.. # - if mkdir "$LOCK_DIR" 2> /dev/null ; then ## - Remove lockdir when the script finishes, or when it receives a signal trap clean_up SIGHUP SIGINT SIGTERM else datum="$(date +"%d.%m.%Y %H:%M")" msg=" [ Error ]: A previos instance of '$(basename $0)' seems already be running.\n\n Exiting now.." error "A previos instance of the script '$(basename $0)' seems already be running." exit 1 fi for _dir_perm in $dir_permissions ; do IFS=':' read -a _dir_perm_arr <<< "${_dir_perm}" base_dir="${_dir_perm_arr[0]}" if [[ -z "$(trim "$base_dir")" ]]; then error "Directory not given!" continue fi if [[ ! -d "$base_dir" ]]; then error "Cannot find directory '$base_dir'" continue fi group="${_dir_perm_arr[1]}" if [[ -z "$(trim "$group")" ]]; then error "Group not given!" continue fi if ! grep -E -q "^${group}:" /etc/group ; then error "Group '$group' does not exist!" fi file_perm="${_dir_perm_arr[2]}" if [[ -z "$(trim "$file_perm")" ]]; then error "File permissions not given!" continue fi dir_perm="${_dir_perm_arr[3]}" if [[ -z "$(trim "$dir_perm")" ]]; then error "Directory permissions not given!" continue fi info "Set Permisions on \033[1m${base_dir}\033[m: Group:\033[1m${group}\033[m Perimissions: \033[1m${dir_perm}/${file_perm}\033[m .." chmod $dir_perm $base_dir chgrp $group $base_dir while IFS='' read -r -d '' filename ; do [[ -f "$filename" ]] && ( chmod $file_perm "$filename"; chgrp $group "$filename") [[ ! -d "$filename" ]] && continue [[ "$filename" =~ .Trash ]] && continue [[ "$filename" = "lost+found" ]] && continue chmod $dir_perm "$filename" ; chgrp $group "$filename" find "$filename" ! -group $group -exec chgrp -R $group {} \; find "$filename" -type d ! -perm $dir_perm -exec chmod -R $dir_perm {} \; find "$filename" -type f ! -perm $file_perm -exec chmod -R $file_perm {} \; done < <(find $base_dir -mindepth 1 -maxdepth 1 -print0) done clean_up 0