77 lines
2.2 KiB
Bash
Executable File
77 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -o errexit
|
|
set -o nounset
|
|
set -o pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
# shellcheck source=00_env.sh
|
|
. "$SCRIPT_DIR/00_env.sh"
|
|
|
|
DEVICES=""
|
|
SERVERS=""
|
|
OUTPUT=""
|
|
|
|
usage() {
|
|
printf 'Usage: %s --fs <filesystem> --devices "/dev/sdb /dev/sdc" --servers "node1,node2" --failure-group <number> --pool <storage_pool> --usage <dataOnly|metadataOnly|dataAndMetadata> [--output <path>]\n' "$(basename "$0")"
|
|
}
|
|
|
|
while [[ "$#" -gt 0 ]]; do
|
|
case "$1" in
|
|
--fs) FILESYSTEM="${2:-}"; shift 2 ;;
|
|
--devices) DEVICES="${2:-}"; shift 2 ;;
|
|
--servers) SERVERS="${2:-}"; shift 2 ;;
|
|
--failure-group) FAILURE_GROUP="${2:-}"; shift 2 ;;
|
|
--pool) STORAGE_POOL="${2:-}"; shift 2 ;;
|
|
--usage) USAGE="${2:-}"; shift 2 ;;
|
|
--output) OUTPUT="${2:-}"; shift 2 ;;
|
|
-h|--help) usage; exit 0 ;;
|
|
*) critical "Unknown argument: $1"; usage; exit 2 ;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z "$FILESYSTEM" || -z "$DEVICES" || -z "$SERVERS" || -z "$FAILURE_GROUP" || -z "$STORAGE_POOL" || -z "$USAGE" ]]; then
|
|
critical "Missing required input"
|
|
usage
|
|
exit 2
|
|
fi
|
|
|
|
if ! [[ "$FAILURE_GROUP" =~ ^-?[0-9]+$ ]]; then
|
|
critical "--failure-group must be an integer"
|
|
exit 2
|
|
fi
|
|
|
|
if ! usage_value_valid "$USAGE"; then
|
|
critical "--usage must be one of: dataOnly, metadataOnly, dataAndMetadata"
|
|
exit 2
|
|
fi
|
|
|
|
if [[ -z "$OUTPUT" ]]; then
|
|
OUTPUT="/tmp/gpfs_nsd_${FILESYSTEM}_${TIMESTAMP}.stanza"
|
|
fi
|
|
|
|
safe_fs="$(printf '%s' "$FILESYSTEM" | tr -c '[:alnum:]_' '_')"
|
|
|
|
{
|
|
printf '# Generated GPFS NSD stanza for filesystem %s\n' "$FILESYSTEM"
|
|
printf '# Review with storage and cluster teams before use.\n\n'
|
|
for device in $DEVICES; do
|
|
if [[ "$device" != /dev/* ]]; then
|
|
critical "Device must be an absolute /dev path: $device"
|
|
exit 2
|
|
fi
|
|
|
|
device_base="$(basename "$device" | tr -c '[:alnum:]_' '_')"
|
|
nsd_name="nsd_${safe_fs}_${device_base}"
|
|
printf '%%nsd:\n'
|
|
printf ' device=%s\n' "$device"
|
|
printf ' nsd=%s\n' "$nsd_name"
|
|
printf ' servers=%s\n' "$SERVERS"
|
|
printf ' usage=%s\n' "$USAGE"
|
|
printf ' failureGroup=%s\n' "$FAILURE_GROUP"
|
|
printf ' pool=%s\n\n' "$STORAGE_POOL"
|
|
done
|
|
} > "$OUTPUT"
|
|
|
|
ok "Generated NSD stanza: $OUTPUT"
|
|
warning "This script only writes a stanza file. It does not create NSDs or modify GPFS."
|