305 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/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
 | 
						|
}
 |