194 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/bin/bash
 | 
						|
# Copyright Broadcom, Inc. All Rights Reserved.
 | 
						|
# SPDX-License-Identifier: APACHE-2.0
 | 
						|
#
 | 
						|
# Library for file system actions
 | 
						|
 | 
						|
# shellcheck disable=SC1091
 | 
						|
 | 
						|
# Load Generic Libraries
 | 
						|
. /opt/bitnami/scripts/liblog.sh
 | 
						|
 | 
						|
# Functions
 | 
						|
 | 
						|
########################
 | 
						|
# Ensure a file/directory is owned (user and group) but the given user
 | 
						|
# Arguments:
 | 
						|
#   $1 - filepath
 | 
						|
#   $2 - owner
 | 
						|
# Returns:
 | 
						|
#   None
 | 
						|
#########################
 | 
						|
owned_by() {
 | 
						|
    local path="${1:?path is missing}"
 | 
						|
    local owner="${2:?owner is missing}"
 | 
						|
    local group="${3:-}"
 | 
						|
 | 
						|
    if [[ -n $group ]]; then
 | 
						|
        chown "$owner":"$group" "$path"
 | 
						|
    else
 | 
						|
        chown "$owner":"$owner" "$path"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
########################
 | 
						|
# Ensure a directory exists and, optionally, is owned by the given user
 | 
						|
# Arguments:
 | 
						|
#   $1 - directory
 | 
						|
#   $2 - owner
 | 
						|
# Returns:
 | 
						|
#   None
 | 
						|
#########################
 | 
						|
ensure_dir_exists() {
 | 
						|
    local dir="${1:?directory is missing}"
 | 
						|
    local owner_user="${2:-}"
 | 
						|
    local owner_group="${3:-}"
 | 
						|
 | 
						|
    [ -d "${dir}" ] || mkdir -p "${dir}"
 | 
						|
    if [[ -n $owner_user ]]; then
 | 
						|
        owned_by "$dir" "$owner_user" "$owner_group"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
########################
 | 
						|
# Checks whether a directory is empty or not
 | 
						|
# arguments:
 | 
						|
#   $1 - directory
 | 
						|
# returns:
 | 
						|
#   boolean
 | 
						|
#########################
 | 
						|
is_dir_empty() {
 | 
						|
    local -r path="${1:?missing directory}"
 | 
						|
    # Calculate real path in order to avoid issues with symlinks
 | 
						|
    local -r dir="$(realpath "$path")"
 | 
						|
    if [[ ! -e "$dir" ]] || [[ -z "$(ls -A "$dir")" ]]; then
 | 
						|
        true
 | 
						|
    else
 | 
						|
        false
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
########################
 | 
						|
# Checks whether a mounted directory is empty or not
 | 
						|
# arguments:
 | 
						|
#   $1 - directory
 | 
						|
# returns:
 | 
						|
#   boolean
 | 
						|
#########################
 | 
						|
is_mounted_dir_empty() {
 | 
						|
    local dir="${1:?missing directory}"
 | 
						|
 | 
						|
    if is_dir_empty "$dir" || find "$dir" -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" -exec false {} +; then
 | 
						|
        true
 | 
						|
    else
 | 
						|
        false
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
########################
 | 
						|
# Checks whether a file can be written to or not
 | 
						|
# arguments:
 | 
						|
#   $1 - file
 | 
						|
# returns:
 | 
						|
#   boolean
 | 
						|
#########################
 | 
						|
is_file_writable() {
 | 
						|
    local file="${1:?missing file}"
 | 
						|
    local dir
 | 
						|
    dir="$(dirname "$file")"
 | 
						|
 | 
						|
    if [[ (-f "$file" && -w "$file") || (! -f "$file" && -d "$dir" && -w "$dir") ]]; then
 | 
						|
        true
 | 
						|
    else
 | 
						|
        false
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
########################
 | 
						|
# Relativize a path
 | 
						|
# arguments:
 | 
						|
#   $1 - path
 | 
						|
#   $2 - base
 | 
						|
# returns:
 | 
						|
#   None
 | 
						|
#########################
 | 
						|
relativize() {
 | 
						|
    local -r path="${1:?missing path}"
 | 
						|
    local -r base="${2:?missing base}"
 | 
						|
    pushd "$base" >/dev/null || exit
 | 
						|
    realpath -q --no-symlinks --relative-base="$base" "$path" | sed -e 's|^/$|.|' -e 's|^/||'
 | 
						|
    popd >/dev/null || exit
 | 
						|
}
 | 
						|
 | 
						|
########################
 | 
						|
# Configure permisions and ownership recursively
 | 
						|
# Globals:
 | 
						|
#   None
 | 
						|
# Arguments:
 | 
						|
#   $1 - paths (as a string).
 | 
						|
# Flags:
 | 
						|
#   -f|--file-mode - mode for directories.
 | 
						|
#   -d|--dir-mode - mode for files.
 | 
						|
#   -u|--user - user
 | 
						|
#   -g|--group - group
 | 
						|
# Returns:
 | 
						|
#   None
 | 
						|
#########################
 | 
						|
configure_permissions_ownership() {
 | 
						|
    local -r paths="${1:?paths is missing}"
 | 
						|
    local dir_mode=""
 | 
						|
    local file_mode=""
 | 
						|
    local user=""
 | 
						|
    local group=""
 | 
						|
 | 
						|
    # Validate arguments
 | 
						|
    shift 1
 | 
						|
    while [ "$#" -gt 0 ]; do
 | 
						|
        case "$1" in
 | 
						|
        -f | --file-mode)
 | 
						|
            shift
 | 
						|
            file_mode="${1:?missing mode for files}"
 | 
						|
            ;;
 | 
						|
        -d | --dir-mode)
 | 
						|
            shift
 | 
						|
            dir_mode="${1:?missing mode for directories}"
 | 
						|
            ;;
 | 
						|
        -u | --user)
 | 
						|
            shift
 | 
						|
            user="${1:?missing user}"
 | 
						|
            ;;
 | 
						|
        -g | --group)
 | 
						|
            shift
 | 
						|
            group="${1:?missing group}"
 | 
						|
            ;;
 | 
						|
        *)
 | 
						|
            echo "Invalid command line flag $1" >&2
 | 
						|
            return 1
 | 
						|
            ;;
 | 
						|
        esac
 | 
						|
        shift
 | 
						|
    done
 | 
						|
 | 
						|
    read -r -a filepaths <<<"$paths"
 | 
						|
    for p in "${filepaths[@]}"; do
 | 
						|
        if [[ -e "$p" ]]; then
 | 
						|
            find -L "$p" -printf ""
 | 
						|
            if [[ -n $dir_mode ]]; then
 | 
						|
                find -L "$p" -type d ! -perm "$dir_mode" -print0 | xargs -r -0 chmod "$dir_mode"
 | 
						|
            fi
 | 
						|
            if [[ -n $file_mode ]]; then
 | 
						|
                find -L "$p" -type f ! -perm "$file_mode" -print0 | xargs -r -0 chmod "$file_mode"
 | 
						|
            fi
 | 
						|
            if [[ -n $user ]] && [[ -n $group ]]; then
 | 
						|
                find -L "$p" -print0 | xargs -r -0 chown "${user}:${group}"
 | 
						|
            elif [[ -n $user ]] && [[ -z $group ]]; then
 | 
						|
                find -L "$p" -print0 | xargs -r -0 chown "${user}"
 | 
						|
            elif [[ -z $user ]] && [[ -n $group ]]; then
 | 
						|
                find -L "$p" -print0 | xargs -r -0 chgrp "${group}"
 | 
						|
            fi
 | 
						|
        else
 | 
						|
            stderr_print "$p does not exist"
 | 
						|
        fi
 | 
						|
    done
 | 
						|
}
 |