#!/usr/bin/env bash if [[ -n "${ATLAS_LOGGING_SH_LOADED:-}" ]]; then return 0 fi ATLAS_LOGGING_SH_LOADED=1 ATLAS_LOG_FILE="${ATLAS_LOG_FILE:-}" ATLAS_LOG_TO_FILE=0 atlas_timestamp() { date -u '+%Y-%m-%dT%H:%M:%SZ' } atlas_log_line() { local level="$1" shift local message="$*" local line line="$(printf '%s [%s] %s' "$(atlas_timestamp)" "$level" "$message")" printf '%s\n' "$line" if [[ "${ATLAS_LOG_TO_FILE}" == "1" && -n "${ATLAS_LOG_FILE}" ]]; then printf '%s\n' "$line" >>"${ATLAS_LOG_FILE}" 2>/dev/null || ATLAS_LOG_TO_FILE=0 fi } atlas_log_info() { atlas_log_line "INFO" "$@" } atlas_log_warn() { atlas_log_line "WARN" "$@" } atlas_log_error() { atlas_log_line "ERROR" "$@" >&2 } atlas_log_ok() { atlas_log_line "OK" "$@" } atlas_log_verbose() { if [[ "${ATLAS_VERBOSE:-0}" == "1" ]]; then atlas_log_line "DEBUG" "$@" fi } atlas_init_log_file() { local log_dir="$1" local name="${2:-${ATLAS_SCRIPT_NAME:-atlas}}" local timestamp timestamp="$(date -u '+%Y%m%dT%H%M%SZ')" ATLAS_LOG_FILE="${log_dir}/${name}-${timestamp}.log" if [[ "${ATLAS_DRY_RUN:-0}" == "1" ]]; then atlas_log_info "Dry-run mode: would initialise log file ${ATLAS_LOG_FILE}" return 0 fi if [[ ! -d "$log_dir" ]]; then if command -v sudo >/dev/null 2>&1 && sudo -n true >/dev/null 2>&1; then sudo -n install -d -m 0750 -o "$(id -u)" -g "$(id -g)" "$log_dir" 2>/dev/null || { atlas_log_warn "File logging disabled; cannot create ${log_dir}" return 0 } else atlas_log_warn "File logging disabled; ${log_dir} does not exist and sudo is unavailable" return 0 fi fi if [[ -w "$log_dir" ]]; then : >"${ATLAS_LOG_FILE}" 2>/dev/null && chmod 0640 "${ATLAS_LOG_FILE}" 2>/dev/null && ATLAS_LOG_TO_FILE=1 || ATLAS_LOG_TO_FILE=0 elif command -v sudo >/dev/null 2>&1 && sudo -n true >/dev/null 2>&1; then sudo -n touch "${ATLAS_LOG_FILE}" 2>/dev/null && sudo -n chown "$(id -u):$(id -g)" "${ATLAS_LOG_FILE}" 2>/dev/null && sudo -n chmod 0640 "${ATLAS_LOG_FILE}" 2>/dev/null && ATLAS_LOG_TO_FILE=1 || ATLAS_LOG_TO_FILE=0 fi if [[ "${ATLAS_LOG_TO_FILE}" == "1" ]]; then atlas_log_info "Logging to ${ATLAS_LOG_FILE}" else atlas_log_warn "File logging unavailable; continuing with console logging" fi }