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.
305 lines
6.6 KiB
305 lines
6.6 KiB
#!/bin/bash
|
|
# Copyright Broadcom, Inc. All Rights Reserved.
|
|
# SPDX-License-Identifier: APACHE-2.0
|
|
#
|
|
# Validation functions library
|
|
|
|
# shellcheck disable=SC1091,SC2086
|
|
|
|
# Load Generic Libraries
|
|
. /opt/bitnami/scripts/liblog.sh
|
|
|
|
# Functions
|
|
|
|
########################
|
|
# Check if the provided argument is an integer
|
|
# Arguments:
|
|
# $1 - Value to check
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
is_int() {
|
|
local -r int="${1:?missing value}"
|
|
if [[ "$int" =~ ^-?[0-9]+ ]]; then
|
|
true
|
|
else
|
|
false
|
|
fi
|
|
}
|
|
|
|
########################
|
|
# Check if the provided argument is a positive integer
|
|
# Arguments:
|
|
# $1 - Value to check
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
is_positive_int() {
|
|
local -r int="${1:?missing value}"
|
|
if is_int "$int" && (( "${int}" >= 0 )); then
|
|
true
|
|
else
|
|
false
|
|
fi
|
|
}
|
|
|
|
########################
|
|
# Check if the provided argument is a boolean or is the string 'yes/true'
|
|
# Arguments:
|
|
# $1 - Value to check
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
is_boolean_yes() {
|
|
local -r bool="${1:-}"
|
|
# comparison is performed without regard to the case of alphabetic characters
|
|
shopt -s nocasematch
|
|
if [[ "$bool" = 1 || "$bool" =~ ^(yes|true)$ ]]; then
|
|
true
|
|
else
|
|
false
|
|
fi
|
|
}
|
|
|
|
########################
|
|
# Check if the provided argument is a boolean yes/no value
|
|
# Arguments:
|
|
# $1 - Value to check
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
is_yes_no_value() {
|
|
local -r bool="${1:-}"
|
|
if [[ "$bool" =~ ^(yes|no)$ ]]; then
|
|
true
|
|
else
|
|
false
|
|
fi
|
|
}
|
|
|
|
########################
|
|
# Check if the provided argument is a boolean true/false value
|
|
# Arguments:
|
|
# $1 - Value to check
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
is_true_false_value() {
|
|
local -r bool="${1:-}"
|
|
if [[ "$bool" =~ ^(true|false)$ ]]; then
|
|
true
|
|
else
|
|
false
|
|
fi
|
|
}
|
|
|
|
########################
|
|
# Check if the provided argument is a boolean 1/0 value
|
|
# Arguments:
|
|
# $1 - Value to check
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
is_1_0_value() {
|
|
local -r bool="${1:-}"
|
|
if [[ "$bool" =~ ^[10]$ ]]; then
|
|
true
|
|
else
|
|
false
|
|
fi
|
|
}
|
|
|
|
########################
|
|
# Check if the provided argument is an empty string or not defined
|
|
# Arguments:
|
|
# $1 - Value to check
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
is_empty_value() {
|
|
local -r val="${1:-}"
|
|
if [[ -z "$val" ]]; then
|
|
true
|
|
else
|
|
false
|
|
fi
|
|
}
|
|
|
|
########################
|
|
# Validate if the provided argument is a valid port
|
|
# Arguments:
|
|
# $1 - Port to validate
|
|
# Returns:
|
|
# Boolean and error message
|
|
#########################
|
|
validate_port() {
|
|
local value
|
|
local unprivileged=0
|
|
|
|
# Parse flags
|
|
while [[ "$#" -gt 0 ]]; do
|
|
case "$1" in
|
|
-unprivileged)
|
|
unprivileged=1
|
|
;;
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
-*)
|
|
stderr_print "unrecognized flag $1"
|
|
return 1
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [[ "$#" -gt 1 ]]; then
|
|
echo "too many arguments provided"
|
|
return 2
|
|
elif [[ "$#" -eq 0 ]]; then
|
|
stderr_print "missing port argument"
|
|
return 1
|
|
else
|
|
value=$1
|
|
fi
|
|
|
|
if [[ -z "$value" ]]; then
|
|
echo "the value is empty"
|
|
return 1
|
|
else
|
|
if ! is_int "$value"; then
|
|
echo "value is not an integer"
|
|
return 2
|
|
elif [[ "$value" -lt 0 ]]; then
|
|
echo "negative value provided"
|
|
return 2
|
|
elif [[ "$value" -gt 65535 ]]; then
|
|
echo "requested port is greater than 65535"
|
|
return 2
|
|
elif [[ "$unprivileged" = 1 && "$value" -lt 1024 ]]; then
|
|
echo "privileged port requested"
|
|
return 3
|
|
fi
|
|
fi
|
|
}
|
|
|
|
########################
|
|
# Validate if the provided argument is a valid IPv6 address
|
|
# Arguments:
|
|
# $1 - IP to validate
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
validate_ipv6() {
|
|
local ip="${1:?ip is missing}"
|
|
local stat=1
|
|
local full_address_regex='^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$'
|
|
local short_address_regex='^((([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}){0,6}::(([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}){0,6})$'
|
|
|
|
if [[ $ip =~ $full_address_regex || $ip =~ $short_address_regex || $ip == "::" ]]; then
|
|
stat=0
|
|
fi
|
|
return $stat
|
|
}
|
|
|
|
########################
|
|
# Validate if the provided argument is a valid IPv4 address
|
|
# Arguments:
|
|
# $1 - IP to validate
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
validate_ipv4() {
|
|
local ip="${1:?ip is missing}"
|
|
local stat=1
|
|
|
|
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
|
read -r -a ip_array <<< "$(tr '.' ' ' <<< "$ip")"
|
|
[[ ${ip_array[0]} -le 255 && ${ip_array[1]} -le 255 \
|
|
&& ${ip_array[2]} -le 255 && ${ip_array[3]} -le 255 ]]
|
|
stat=$?
|
|
fi
|
|
return $stat
|
|
}
|
|
|
|
########################
|
|
# Validate if the provided argument is a valid IPv4 or IPv6 address
|
|
# Arguments:
|
|
# $1 - IP to validate
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
validate_ip() {
|
|
local ip="${1:?ip is missing}"
|
|
local stat=1
|
|
|
|
if validate_ipv4 "$ip"; then
|
|
stat=0
|
|
else
|
|
stat=$(validate_ipv6 "$ip")
|
|
fi
|
|
return $stat
|
|
}
|
|
|
|
########################
|
|
# Validate a string format
|
|
# Arguments:
|
|
# $1 - String to validate
|
|
# Returns:
|
|
# Boolean
|
|
#########################
|
|
validate_string() {
|
|
local string
|
|
local min_length=-1
|
|
local max_length=-1
|
|
|
|
# Parse flags
|
|
while [ "$#" -gt 0 ]; do
|
|
case "$1" in
|
|
-min-length)
|
|
shift
|
|
min_length=${1:-}
|
|
;;
|
|
-max-length)
|
|
shift
|
|
max_length=${1:-}
|
|
;;
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
-*)
|
|
stderr_print "unrecognized flag $1"
|
|
return 1
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ "$#" -gt 1 ]; then
|
|
stderr_print "too many arguments provided"
|
|
return 2
|
|
elif [ "$#" -eq 0 ]; then
|
|
stderr_print "missing string"
|
|
return 1
|
|
else
|
|
string=$1
|
|
fi
|
|
|
|
if [[ "$min_length" -ge 0 ]] && [[ "${#string}" -lt "$min_length" ]]; then
|
|
echo "string length is less than $min_length"
|
|
return 1
|
|
fi
|
|
if [[ "$max_length" -ge 0 ]] && [[ "${#string}" -gt "$max_length" ]]; then
|
|
echo "string length is great than $max_length"
|
|
return 1
|
|
fi
|
|
}
|