You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
4.7 KiB
194 lines
4.7 KiB
4 months ago
|
#!/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
|
||
|
}
|