#!/bin/bash # SPDX-Version: 3.0 # SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; # SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git # SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency # SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; # SPDX-FileType: SOURCE # SPDX-License-Identifier: EUPL-1.2 OR LicenseRef-CCLA-1.0 # SPDX-LicenseComment: This file is part of the CISS.debian.installer.secure framework. # SPDX-PackageName: CISS.debian.installer # SPDX-Security-Contact: security@coresecret.eu guard_sourcing ####################################### # Log level values for comparison. # Arguments: # 1: "${LOG_LEVEL}" one of: "debug" | "info" | "notice" | "warn" | "error" | "critical" | "fatal" | "emergency" ####################################### log_level_value() { case "${1,,}" in debug) printf '%d' 7 ;; info) printf '%d' 6 ;; notice) printf '%d' 5 ;; warn) printf '%d' 4 ;; error) printf '%d' 3 ;; critical) printf '%d' 2 ;; fatal) printf '%d' 1 ;; emergency) printf '%d' 0 ;; esac } ####################################### # Filter and compare log levels. # Globals: # VAR_DEFAULT_LOG_LEVEL # Arguments: # 1: "${LOG_LEVEL}" one of: "debug" | "info" | "notice" | "warn" | "error" | "critical" | "fatal" | "emergency" ####################################### do_should_log() { # shellcheck disable=SC2155 declare -i var_desired_log_value=$(log_level_value "$1") # Desired log level # shellcheck disable=SC2155 declare -i var_default_log_value=$(log_level_value "${VAR_DEFAULT_LOG_LEVEL}") # Current threshold ### Return true if a message should be logged. [[ ${var_desired_log_value} -le ${var_default_log_value} ]] } ####################################### # Log level color retriever. # Globals: # BLU # C_GRN # MAG # RED # WHI # YEL # Arguments: # 1: "${LOG_LEVEL}" one of: "debug" | "info" | "notice" | "warn" | "error" | "critical" | "fatal" | "emergency" ####################################### do_get_log_color() { case "${1,,}" in debug) echo "${WHI}" ;; info) echo "${C_GRN}" ;; notice) echo "${YEL}" ;; warn | error | critical) echo "${RED}" ;; fatal | emergency) echo "${MAG}" ;; *) echo "${BLU}" ;; esac } ####################################### # Main logger wrapper. # Globals: # LOG_ERR # LOG_INS # Arguments: # 1: "${LOG_LEVEL}" one of: "debug" | "info" | "notice" | "warn" | "error" | "critical" | "fatal" | "emergency" # 2: "${LOG_ONLY}" boolean "true" | "false" # @: "${MESSAGE[*]}" arbitrary text string to log. ####################################### do_log() { declare var_log_level="$1"; shift declare var_log_only="$2"; shift declare ary_message=("$@") declare var_msg_string="${ary_message[*]}" declare var_color; var_color=$(do_get_log_color "${var_log_level}") declare var_ts; var_ts="$(date -u '+%Y-%m-%dT%H:%M:%S.%4N%z')" declare var_log_entry=("${var_ts} [${var_log_level}]: ${ary_message[*]}") if do_should_log "${var_log_level}"; then if [[ "${var_log_only,,}" == "true" ]]; then case "${var_log_level,,}" in debug | info | notice) do_print_log "${var_log_entry[*]}" >> "${LOG_INS}" ;; warn | error | critical | fatal | emergency ) do_print_log "${var_log_entry[*]}" >> "${LOG_ERR}" ;; esac elif [[ "${var_log_only,,}" == "false" ]]; then case "${var_log_level,,}" in debug | info | notice) if [[ ${#var_msg_string} -le 76 ]]; then do_print_color "${var_color}" "${var_log_entry[*]}" do_print_log "${var_log_entry[*]}" >> "${LOG_INS}" else do_print_fold "${var_color}" "${var_log_entry[*]}" do_print_log "${var_log_entry[*]}" >> "${LOG_INS}" fi ;; warn | error | critical | fatal | emergency) if [[ ${#var_msg_string} -le 76 ]]; then do_print_color "${var_color}" "${var_log_entry[*]}" do_print_log "${var_log_entry[*]}" >> "${LOG_ERR}" else do_print_fold "${var_color}" "${var_log_entry[*]}" do_print_log "${var_log_entry[*]}" >> "${LOG_ERR}" fi ;; *) if [[ ${#var_msg_string} -le 76 ]]; then do_print_color "${var_color}" "${var_log_entry[*]}" do_print_log "${var_log_entry[*]}" >> "${LOG_INS}" else do_print_fold "${var_color}" "${var_log_entry[*]}" do_print_log "${var_log_entry[*]}" >> "${LOG_INS}" fi ;; esac fi fi } # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh