X-Git-Url: http://git.ipfire.org/?p=people%2Fms%2Fnetwork.git;a=blobdiff_plain;f=src%2Ffunctions%2Ffunctions.util;h=7379a9887de812acf0eb812ef2cb2b0b7d0091e4;hp=4b6f956633a20bdad2779be98dc1d34e294dc4e5;hb=d695b280e9972311ae8c4bc688c0898ade1281e6;hpb=de72bd9187aab8b27e4931bcd54a2ab6c091b332 diff --git a/src/functions/functions.util b/src/functions/functions.util index 4b6f9566..7379a988 100644 --- a/src/functions/functions.util +++ b/src/functions/functions.util @@ -26,6 +26,17 @@ print() { printf -- "${fmt}\n" "$@" } +print_indent() { + local i=${1} + shift + + while (( i-- )); do + printf "\t" + done + + print "%s" "$@" +} + # The args() function takes a number of arguments like # var1="abc d" var2="abc" var3="abcd e" # and splits them into several arguments, devided by newline @@ -82,20 +93,6 @@ warning_log() { log WARNING "$@" } -# The next three functions are kept for backwards -# compatibility. The need to be dropped at some time. -listsort() { - list_sort $@ -} - -listmatch() { - list_match $@ -} - -listlength() { - list_length $@ -} - # Speedup function to avoid a call of the basename binary basename() { echo "${1##*/}" @@ -137,7 +134,7 @@ parse_time() { local ret=0 local arg - for arg in $@; do + for arg in "$@"; do local unit case "${arg}" in @@ -193,7 +190,20 @@ fwrite() { assert isset file shift - if [ ! -w "${file}" ]; then + if ! print "%s" "$@" > ${file} 2>/dev/null; then + error "Could not write to file: ${file}" + return ${EXIT_ERROR} + fi + + return ${EXIT_OK} +} + +fappend() { + local file=${1} + assert isset file + shift + + if [ -e "${file}" ] && [ ! -w "${file}" ]; then log ERROR "${file}: No such file" return ${EXIT_ERROR} fi @@ -201,11 +211,77 @@ fwrite() { print "%s" "$@" >> ${file} 2>/dev/null } -make_parent_dir() { +file_delete() { + local file=${1} + + unlink "${file}" 2>/dev/null +} + +file_exists() { + local file=${1} + + [ -e "${file}" ] && return ${EXIT_TRUE} || return ${EXIT_FALSE} +} + +file_is_newer_than() { + local file1="${1}" + local file2="${2}" + + local age1=$(file_get_age "${file1}") + local age2=$(file_get_age "${file2}") + + if [ ${age1} -gt ${age2} ]; then + return ${EXIT_TRUE} + else + return ${EXIT_FALSE} + fi +} + +file_get_age() { + local file="${1}" + + if [ -e "${file}" ]; then + stat --format="%Y" "${file}" + return $? + fi + + return ${EXIT_ERROR} +} + +file_to_log() { + local level="${1}" + assert isset level + + local file="${2}" + assert file_exists "${file}" + + local line + while read line; do + log "${level}" "${line}" + done < "${file}" +} + +make_directory() { + local path="${1}" + + # Exit silently when directory already exists + if [ -d "${path}" ]; then + return ${EXIT_OK} + fi + + if ! mkdir -p "${path}"; then + log ERROR "Could not create directory ${path}" + return ${EXIT_ERROR} + fi + + log DEBUG "Created directory ${path}" + return ${EXIT_OK} +} + +make_parent_directory() { local path="${1}" - local dirname="$(dirname "${path}")" - mkdir -p "${dirname}" + make_directory "$(dirname "${path}")" } enabled() { @@ -214,6 +290,12 @@ enabled() { list_match "${!param}" yes on true 1 } +disabled() { + local param="${1}" + + list_match "${!param}" no off false 0 +} + mac_generate() { local b="$(random 12)" @@ -264,10 +346,31 @@ mac_is_valid() { [[ ${mac} =~ ^([0-9a-f]{2}\:){5}[0-9a-f]{2}$ ]] } +# Converts the given string to lowercase and returns true if it is a valid FQDN +fqdn_is_valid() { + local fqdn="${1}" + + if grep -qP "^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$" <<< "${fqdn,,}"; then + return ${EXIT_TRUE} + fi + + return ${EXIT_FALSE} +} + uuid() { echo $(/dev/null + cmd "$@" &>/dev/null } cmd_exec() { - local cmd=$@ + local cmd=( "$@" ) log DEBUG "Exec'ing command: ${cmd}" - exec ${cmd} + exec "${cmd[@]}" log ERROR "Could not exec-ute: ${cmd}" exit ${EXIT_ERROR} @@ -428,22 +559,9 @@ cmd_not_implemented() { assert false "not implemented" } -# Runs a command in a clean environment so that no confidential information -# is leaked to any untrusted commands. -cmd_clean_environment() { - local cmd=$@ - - log DEBUG "Running command in a clean environment: ${cmd}" - env -i -- ${cmd} - local ret=${?} - - log DEBUG "Returned with code '${ret}'" - return ${ret} -} - # Executes the given command in background cmd_background() { - cmd_quiet $@ & + cmd_quiet "$@" & } # Prints the PID of the process that was started last @@ -459,7 +577,7 @@ cmd_background_result() { # Increase security of the read command read() { - builtin read -r $@ + builtin read -r "$@" } seq() { @@ -485,7 +603,7 @@ count() { } which() { - type -P $@ + type -P "$@" } # Prints the number of seconds since epoch. @@ -535,10 +653,13 @@ beautify_bytes() { module_load() { local module=${1} - if ! grep -q "^${module}" /proc/modules; then - log DEBUG "Loading module '${module}'." - modprobe ${module} + # Do nothing if the module is already loaded + if [ -d "/sys/module/${module//-/_}" ]; then + return ${EXIT_OK} fi + + log DEBUG "Loading kernel module ${module}" + modprobe "${module}" } binary_exists() { @@ -624,6 +745,26 @@ contains_spaces() { return ${EXIT_FALSE} } +contains_non_ascii_characters() { + local value="$@" + + # Strip away all ASCII characters + local non_ascii="${value//[[:ascii:]]/}" + + if isset non_ascii; then + return ${EXIT_TRUE} + fi + + return ${EXIT_FALSE} +} + +string_match() { + local match=${1} + local string=${2} + + [[ ${string} =~ ${match} ]] && return ${EXIT_TRUE} || return ${EXIT_FALSE} +} + string_split() { local string="$@" @@ -738,3 +879,54 @@ hex2dec() { dec2hex() { printf "%02x\n" "${1}" } + +# This function just copy config files +copy() { + assert [ $# -eq 2 ] + + local src=${1} + local dst=${2} + + # Check if we can read from the source + if [ ! -r "${src}" ]; then + log ERROR "Cannot read ${src}" + return ${EXIT_ERROR} + fi + + # Check if ${dst} is a directory + if [ -d "${dst}" ]; then + log ERROR "${dst} is a directory" + return ${EXIT_ERROR} + fi + + # Create destination directory if it doesn't exist, yet + if ! make_parent_directory "${dst}"; then + return ${EXIT_ERROR} + fi + + if ! fread "${src}" > "${dst}"; then + log ERROR "Could not copy data from ${src} to ${dst}" + return ${EXIT_ERROR} + fi +} + +normalize() { + local string="$@" + + tr -sc [:alnum:] "-" < <(printf "%s" "${string,,}") +} + +get_driver_from_path() { + local path="${1}" + + if file_exists "${path}"; then + # Resolve symlink + local driver="$(readlink "${path}")" + + # Print module name + basename "${driver}" + return ${EXIT_OK} + fi + + return ${EXIT_ERROR} +}