282 lines
8.9 KiB
Bash
282 lines
8.9 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# ============================================
|
|
# Core
|
|
# ============================================
|
|
|
|
LOG_LEVEL=${LOG_LEVEL:-INFO}
|
|
|
|
# ============================================
|
|
# Internal
|
|
# ============================================
|
|
|
|
function internal::get_log_priority() {
|
|
case "$1" in
|
|
DEBUG) echo 0 ;;
|
|
INFO) echo 1 ;;
|
|
WARN) echo 2 ;;
|
|
ERROR) echo 3 ;;
|
|
SUCCESS) echo 4 ;;
|
|
*) echo 1 ;;
|
|
esac
|
|
}
|
|
function internal::log() {
|
|
local level="$1"
|
|
shift
|
|
|
|
local current_priority
|
|
local message_priority
|
|
|
|
current_priority=$(internal::get_log_priority "$LOG_LEVEL")
|
|
message_priority=$(internal::get_log_priority "$level")
|
|
|
|
if (( message_priority < current_priority )); then
|
|
return 0
|
|
fi
|
|
|
|
case "$level" in
|
|
DEBUG) color="\033[0;37m" ;; # cyan
|
|
INFO) color="\033[1;34m" ;; # blue
|
|
WARN) color="\033[1;33m" ;; # yellow
|
|
ERROR) color="\033[1;31m" ;; # red
|
|
SUCCESS)color="\033[1;32m" ;; # red
|
|
esac
|
|
|
|
echo -e "${color}=> ${level}:\033[0m $*"
|
|
}
|
|
function internal::icon() {
|
|
local context="$1"
|
|
local action="$2"
|
|
|
|
case "$context:$action" in
|
|
docker:log) echo "🐳 " ;;
|
|
docker:start) echo "🟢 🐳 " ;;
|
|
docker:stop) echo "🔴 🐳 " ;;
|
|
docker:success) echo "✅ 🐳 " ;;
|
|
docker:warning) echo "⚠️ 🐳 " ;;
|
|
docker:error) echo "❌ 🐳 " ;;
|
|
docker:logs) echo "📜 🐳 " ;;
|
|
docker:list) echo "🔍 🐳 " ;;
|
|
docker:build) echo "📦 🐳 " ;;
|
|
|
|
build:log) echo "🏗️ " ;;
|
|
build:start) echo "🟢 🏗️ " ;;
|
|
build:stop) echo "🔴 🏗️ " ;;
|
|
build:success) echo "✅ 🏗️ " ;;
|
|
build:warning) echo "⚠️ 🏗️ " ;;
|
|
build:error) echo "❌ 🏗️ " ;;
|
|
|
|
network:log) echo "🌐 " ;;
|
|
network:setup) echo "⚙️ 🌐 " ;;
|
|
network:stop) echo "🔴 🌐 " ;;
|
|
network:success) echo "✅ 🌐 " ;;
|
|
network:warning) echo "⚠️ 🌐 " ;;
|
|
network:error) echo "❌ 🌐 " ;;
|
|
|
|
auth:log) echo "🔑 " ;;
|
|
auth:setup) echo "⚙️ 🔑 " ;;
|
|
auth:login) echo "🔐 🔑 " ;;
|
|
auth:success) echo "✅ 🔑 " ;;
|
|
auth:warning) echo "⚠️ 🔑 " ;;
|
|
auth:error) echo "❌ 🔑 " ;;
|
|
|
|
env:log) echo "⚙️ " ;;
|
|
env:load) echo "📥 ⚙️ " ;;
|
|
env:success) echo "✅ ⚙️ " ;;
|
|
env:warning) echo "⚠️ ⚙️ " ;;
|
|
env:error) echo "❌ ⚙️ " ;;
|
|
|
|
fs:log) echo "📁 " ;;
|
|
fs:read) echo "📥 📁 " ;;
|
|
fs:write) echo "📤 📁 " ;;
|
|
fs:success) echo "✅ 📁 " ;;
|
|
fs:warning) echo "⚠️ 📁 " ;;
|
|
fs:error) echo "❌ 📁 " ;;
|
|
|
|
db:log) echo "🗄️ " ;;
|
|
db:start) echo "🟢 🗄️ " ;;
|
|
db:migrate) echo "📜 🗄️ " ;;
|
|
db:success) echo "✅ 🗄️ " ;;
|
|
db:warning) echo "⚠️ 🗄️ " ;;
|
|
db:error) echo "❌ 🗄️ " ;;
|
|
|
|
log:info) echo "🔹 " ;;
|
|
log:warn) echo "⚠️ " ;;
|
|
log:error) echo "❌ " ;;
|
|
log:success) echo "✅ " ;;
|
|
log:debug) echo "🔍 " ;;
|
|
|
|
|
|
*) echo "🔹" ;;
|
|
esac
|
|
}
|
|
function internal::get_context_icon() {
|
|
case "$1" in
|
|
docker) echo "🐳" ;;
|
|
build) echo "🏗️" ;;
|
|
network) echo "🌐" ;;
|
|
auth) echo "🔑" ;;
|
|
env) echo "⚙️" ;;
|
|
fs) echo "📁" ;;
|
|
db) echo "🗄️" ;;
|
|
*) echo "🔹" ;;
|
|
esac
|
|
}
|
|
|
|
# ============================================
|
|
# Loggers
|
|
# ============================================
|
|
|
|
function internal::log::info() { internal::log INFO "$*"; }
|
|
function internal::log::warn() { internal::log WARN "$*"; }
|
|
function internal::log::error() { internal::log ERROR "$*"; }
|
|
function internal::log::success() { internal::log SUCCESS "$*"; }
|
|
function internal::log::debug() { internal::log DEBUG "$*"; }
|
|
|
|
# ============================================
|
|
# Context Loggers
|
|
# ============================================
|
|
|
|
function log::context() {
|
|
local context="$1"
|
|
local action="$2"
|
|
shift 2
|
|
|
|
internal::log::info "$(internal::icon "$context" "$action") $*"
|
|
}
|
|
function log::warn_context() {
|
|
local context="$1"
|
|
local action="$2"
|
|
shift 2
|
|
|
|
internal::log::warn "$(internal::icon "$context" "$action") $*"
|
|
}
|
|
function log::error_context() {
|
|
local context="$1"
|
|
local action="$2"
|
|
shift 2
|
|
|
|
internal::log::error "$(internal::icon "$context" "$action") $*"
|
|
}
|
|
function log::success_context() {
|
|
local context="$1"
|
|
local action="$2"
|
|
shift 2
|
|
|
|
internal::log::success "$(internal::icon "$context" "$action") $*"
|
|
}
|
|
function log::debug_context() {
|
|
local context="$1"
|
|
local action="$2"
|
|
shift 2
|
|
|
|
internal::log::debug "$(internal::icon "$context" "$action") $*"
|
|
}
|
|
|
|
# ============================================
|
|
# Logger Helpers
|
|
# ============================================
|
|
|
|
function log::info() { log::context log info "$@"; }
|
|
function log::warn() { log::warn_context log warn "$@"; }
|
|
function log::error() { log::error_context log error "$@"; }
|
|
function log::success() { log::context log success "$@"; }
|
|
function log::debug() { log::debug_context log debug "$@"; }
|
|
|
|
function log::docker() { log::context docker log "$@"; }
|
|
function log::docker_start() { log::context docker start "$@"; }
|
|
function log::docker_stop() { log::context docker stop "$@"; }
|
|
function log::docker_success() { log::context docker success "$@"; }
|
|
function log::docker_logs() { log::context docker logs "$@"; }
|
|
function log::docker_list() { log::context docker list "$@"; }
|
|
function log::docker_build() { log::context docker build "$@"; }
|
|
function log::docker_warning() { log::warn_context docker warning "$@"; }
|
|
function log::docker_error() { log::error_context docker error "$@"; }
|
|
|
|
function log::build() { log::context build log "$@"; }
|
|
function log::build_start() { log::context build start "$@"; }
|
|
function log::build_stop() { log::context build stop "$@"; }
|
|
function log::build_success() { log::context build success "$@"; }
|
|
function log::build_warning() { log::warn_context build warning "$@"; }
|
|
function log::build_error() { log::error_context build error "$@"; }
|
|
|
|
function log::network() { log::context network log "$@"; }
|
|
function log::network_setup() { log::context network setup "$@"; }
|
|
function log::network_stop() { log::context network stop "$@"; }
|
|
function log::network_success() { log::context network success "$@"; }
|
|
function log::network_warning() { log::warn_context network warning "$@"; }
|
|
function log::network_error() { log::error_context network error "$@"; }
|
|
|
|
function log::auth() { log::context auth log "$@"; }
|
|
function log::auth_setup() { log::context auth setup "$@"; }
|
|
function log::auth_login() { log::context auth login "$@"; }
|
|
function log::auth_success() { log::context auth success "$@"; }
|
|
function log::auth_warning() { log::warn_context auth warning "$@"; }
|
|
function log::auth_error() { log::error_context auth error "$@"; }
|
|
|
|
function log::env() { log::context env log "$@"; }
|
|
function log::env_load() { log::context env load "$@"; }
|
|
function log::env_success() { log::context env success "$@"; }
|
|
function log::env_warning() { log::warn_context env warning "$@"; }
|
|
function log::env_error() { log::error_context env error "$@"; }
|
|
|
|
function log::fs() { log::context fs log "$@"; }
|
|
function log::fs_read() { log::context fs read "$@"; }
|
|
function log::fs_write() { log::context fs write "$@"; }
|
|
function log::fs_success() { log::context fs success "$@"; }
|
|
function log::fs_warning() { log::warn_context fs warning "$@"; }
|
|
function log::fs_error() { log::error_context fs error "$@"; }
|
|
|
|
function log::db() { log::context database log "$@"; }
|
|
function log::db_start() { log::context database start "$@"; }
|
|
function log::db_migrate() { log::context database migrate "$@"; }
|
|
function log::db_success() { log::context database success "$@"; }
|
|
function log::db_warning() { log::warn_context database warning "$@"; }
|
|
function log::db_error() { log::error_context database error "$@"; }
|
|
|
|
function log::run_step() {
|
|
local context="$1"
|
|
local mode="strict"
|
|
local description
|
|
|
|
shift
|
|
|
|
if [[ "$1" == "soft" || "$1" == "strict" || "$1" == "info" ]]; then
|
|
mode="$1"
|
|
shift
|
|
fi
|
|
|
|
description="$1"
|
|
shift
|
|
|
|
local icon=$(internal::get_context_icon "$context")
|
|
|
|
if [[ "$mode" == "info" ]]; then
|
|
internal::log::info "$icon $description"
|
|
else
|
|
internal::log::info "🔄 $icon $description"
|
|
fi
|
|
|
|
"$@"
|
|
local status=$?
|
|
|
|
# SUCCESS
|
|
if [[ $status -eq 0 ]]; then
|
|
if [[ "$mode" == "info" ]]; then
|
|
return 0
|
|
fi
|
|
|
|
internal::log::info "✅ $icon $description"
|
|
return 0
|
|
fi
|
|
|
|
# FAILURE
|
|
if [[ "$mode" == "soft" || "$mode" == "info" ]]; then
|
|
internal::log::info "⚠️ $icon $description → skipped"
|
|
return 0
|
|
fi
|
|
|
|
internal::log::info "❌ $icon $description → failed"
|
|
return $status
|
|
}
|
|
|