gistfile1.txt
· 12 KiB · Text
Raw
#!/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 ;;
SUCCESS) echo 1 ;;
OK) echo 1 ;;
WARN) echo 2 ;;
ERROR) echo 3 ;;
*) echo 1 ;;
esac
}
function internal::log() {
local level="$1"
shift
# Quiet mode — suppress INFO and SUCCESS
if core::is_quiet; then
case "$level" in
INFO|SUCCESS) return 0 ;;
esac
fi
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
local color
case "$level" in
DEBUG) color="\033[0;36m" ;;
INFO) color="\033[1;34m" ;;
WARN) color="\033[1;33m" ;;
ERROR) color="\033[1;31m" ;;
SUCCESS) color="\033[1;32m" ;;
OK) color="\033[1;32m" ;;
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 "❌ 🗄️ " ;;
wg:log) echo "🔒 " ;;
wg:start) echo "🟢 🔒 " ;;
wg:stop) echo "🔴 🔒 " ;;
wg:add) echo "➕ 🔒 " ;;
wg:remove) echo "➖ 🔒 " ;;
wg:block) echo "🚫 🔒 " ;;
wg:unblock) echo "🔓 🔒 " ;;
wg:key) echo "🔑 🔒 " ;;
wg:success) echo "✅ 🔒 " ;;
wg:warning) echo "⚠️ 🔒 " ;;
wg:error) echo "❌ 🔒 " ;;
wg:list) echo "🔍 🔒 " ;;
wg:qr) echo "📱 🔒 " ;;
wg:preset) 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 "🗄️" ;;
wg) echo "🔒" ;;
log) echo "🔹" ;;
*) echo "🔹" ;;
esac
}
# ============================================
# Profiler
# ============================================
declare -gi _PROFILE_T0=0
function log::profile_start() {
_PROFILE_T0=$(date +%s%3N)
}
function log::profile() {
[[ "${LOG_LEVEL:-2}" -gt 0 ]] && return 0
local label="${1:-checkpoint}"
local now
now=$(date +%s%3N)
printf " \033[2m[profile] %s: %dms\033[0m\n" \
"$label" "$(( now - _PROFILE_T0 ))" >&2
_PROFILE_T0=$now # reset for next checkpoint
}
# ============================================
# 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 OK "$*"; }
function internal::log::debug() { internal::log DEBUG "$*"; }
# ============================================
# Context Loggers
# ============================================
function log::context() {
local context="$1" action="$2"
shift 2
internal::log::info "$(internal::icon "$context" "$action") $*"
}
function log::warn_context() {
local context="$1" action="$2"
shift 2
internal::log::warn "$(internal::icon "$context" "$action") $*"
}
function log::error_context() {
local context="$1" action="$2"
shift 2
internal::log::error "$(internal::icon "$context" "$action") $*"
}
function log::success_context() {
local context="$1" action="$2"
shift 2
internal::log::success "$(internal::icon "$context" "$action") $*"
}
function log::debug_context() {
local context="$1" 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::ok() { internal::log OK "$@"; }
function log::success() { log::ok "$@"; }
function log::debug() { log::debug_context log debug "$@"; }
function log::section() {
core::is_quiet && return 0
local label="$1"
local width=48
local line
line=$(printf '─%.0s' $(seq 1 $width))
echo -e "\n\033[1;34m${line}\033[0m"
echo -e "\033[1;34m $label\033[0m"
echo -e "\033[1;34m${line}\033[0m"
}
# ============================================
# Docker
# ============================================
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::success_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 "$@"; }
# ============================================
# Build
# ============================================
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::success_context build success "$@"; }
function log::build_warning() { log::warn_context build warning "$@"; }
function log::build_error() { log::error_context build error "$@"; }
# ============================================
# Network
# ============================================
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::success_context network success "$@"; }
function log::network_warning() { log::warn_context network warning "$@"; }
function log::network_error() { log::error_context network error "$@"; }
# ============================================
# Auth
# ============================================
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::success_context auth success "$@"; }
function log::auth_warning() { log::warn_context auth warning "$@"; }
function log::auth_error() { log::error_context auth error "$@"; }
# ============================================
# Env
# ============================================
function log::env() { log::context env log "$@"; }
function log::env_load() { log::context env load "$@"; }
function log::env_success() { log::success_context env success "$@"; }
function log::env_warning() { log::warn_context env warning "$@"; }
function log::env_error() { log::error_context env error "$@"; }
# ============================================
# Filesystem
# ============================================
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::success_context fs success "$@"; }
function log::fs_warning() { log::warn_context fs warning "$@"; }
function log::fs_error() { log::error_context fs error "$@"; }
# ============================================
# Database
# ============================================
function log::db() { log::context db log "$@"; }
function log::db_start() { log::context db start "$@"; }
function log::db_migrate() { log::context db migrate "$@"; }
function log::db_success() { log::success_context db success "$@"; }
function log::db_warning() { log::warn_context db warning "$@"; }
function log::db_error() { log::error_context db error "$@"; }
# ============================================
# WireGuard
# ============================================
function log::wg() { log::context wg log "$@"; }
function log::wg_start() { log::context wg start "$@"; }
function log::wg_stop() { log::context wg stop "$@"; }
function log::wg_add() { log::context wg add "$@"; }
function log::wg_remove() { log::context wg remove "$@"; }
function log::wg_key() { log::context wg key "$@"; }
function log::wg_list() { log::context wg list "$@"; }
function log::wg_qr() { log::context wg qr "$@"; }
function log::wg_preset() { log::context wg preset "$@"; }
function log::wg_success() { log::success_context wg success "$@"; }
function log::wg_warning() { log::warn_context wg warning "$@"; }
function log::wg_error() { log::error_context wg error "$@"; }
function log::wg_block() {
log::context wg block "$@"
}
function log::wg_unblock() {
log::context wg unblock "$@"
}
# ============================================
# Run Step
# ============================================
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
icon=$(internal::get_context_icon "$context")
if [[ "$mode" == "info" ]]; then
internal::log::info "$icon $description"
else
internal::log::info "🔄 $icon $description"
fi
"$@"
local status=$?
if [[ $status -eq 0 ]]; then
[[ "$mode" == "info" ]] && return 0
internal::log::success "✅ $icon $description"
return 0
fi
if [[ "$mode" == "soft" || "$mode" == "info" ]]; then
internal::log::warn "⚠️ $icon $description → skipped"
return 0
fi
internal::log::error "❌ $icon $description → failed"
return $status
}
| 1 | #!/usr/bin/env bash |
| 2 | |
| 3 | # ============================================ |
| 4 | # Core |
| 5 | # ============================================ |
| 6 | |
| 7 | LOG_LEVEL=${LOG_LEVEL:-INFO} |
| 8 | |
| 9 | # ============================================ |
| 10 | # Internal |
| 11 | # ============================================ |
| 12 | |
| 13 | function internal::get_log_priority() { |
| 14 | case "$1" in |
| 15 | DEBUG) echo 0 ;; |
| 16 | INFO) echo 1 ;; |
| 17 | SUCCESS) echo 1 ;; |
| 18 | OK) echo 1 ;; |
| 19 | WARN) echo 2 ;; |
| 20 | ERROR) echo 3 ;; |
| 21 | *) echo 1 ;; |
| 22 | esac |
| 23 | } |
| 24 | |
| 25 | function internal::log() { |
| 26 | local level="$1" |
| 27 | shift |
| 28 | |
| 29 | # Quiet mode — suppress INFO and SUCCESS |
| 30 | if core::is_quiet; then |
| 31 | case "$level" in |
| 32 | INFO|SUCCESS) return 0 ;; |
| 33 | esac |
| 34 | fi |
| 35 | |
| 36 | local current_priority |
| 37 | local message_priority |
| 38 | current_priority=$(internal::get_log_priority "$LOG_LEVEL") |
| 39 | message_priority=$(internal::get_log_priority "$level") |
| 40 | |
| 41 | if (( message_priority < current_priority )); then |
| 42 | return 0 |
| 43 | fi |
| 44 | |
| 45 | local color |
| 46 | case "$level" in |
| 47 | DEBUG) color="\033[0;36m" ;; |
| 48 | INFO) color="\033[1;34m" ;; |
| 49 | WARN) color="\033[1;33m" ;; |
| 50 | ERROR) color="\033[1;31m" ;; |
| 51 | SUCCESS) color="\033[1;32m" ;; |
| 52 | OK) color="\033[1;32m" ;; |
| 53 | esac |
| 54 | |
| 55 | echo -e "${color}=> ${level}:\033[0m $*" |
| 56 | } |
| 57 | |
| 58 | function internal::icon() { |
| 59 | local context="$1" |
| 60 | local action="$2" |
| 61 | |
| 62 | case "$context:$action" in |
| 63 | docker:log) echo "🐳 " ;; |
| 64 | docker:start) echo "🟢 🐳 " ;; |
| 65 | docker:stop) echo "🔴 🐳 " ;; |
| 66 | docker:success) echo "✅ 🐳 " ;; |
| 67 | docker:warning) echo "⚠️ 🐳 " ;; |
| 68 | docker:error) echo "❌ 🐳 " ;; |
| 69 | docker:logs) echo "📜 🐳 " ;; |
| 70 | docker:list) echo "🔍 🐳 " ;; |
| 71 | docker:build) echo "📦 🐳 " ;; |
| 72 | |
| 73 | build:log) echo "🏗️ " ;; |
| 74 | build:start) echo "🟢 🏗️ " ;; |
| 75 | build:stop) echo "🔴 🏗️ " ;; |
| 76 | build:success) echo "✅ 🏗️ " ;; |
| 77 | build:warning) echo "⚠️ 🏗️ " ;; |
| 78 | build:error) echo "❌ 🏗️ " ;; |
| 79 | |
| 80 | network:log) echo "🌐 " ;; |
| 81 | network:setup) echo "⚙️ 🌐 " ;; |
| 82 | network:stop) echo "🔴 🌐 " ;; |
| 83 | network:success) echo "✅ 🌐 " ;; |
| 84 | network:warning) echo "⚠️ 🌐 " ;; |
| 85 | network:error) echo "❌ 🌐 " ;; |
| 86 | |
| 87 | auth:log) echo "🔑 " ;; |
| 88 | auth:setup) echo "⚙️ 🔑 " ;; |
| 89 | auth:login) echo "🔐 🔑 " ;; |
| 90 | auth:success) echo "✅ 🔑 " ;; |
| 91 | auth:warning) echo "⚠️ 🔑 " ;; |
| 92 | auth:error) echo "❌ 🔑 " ;; |
| 93 | |
| 94 | env:log) echo "⚙️ " ;; |
| 95 | env:load) echo "📥 ⚙️ " ;; |
| 96 | env:success) echo "✅ ⚙️ " ;; |
| 97 | env:warning) echo "⚠️ ⚙️ " ;; |
| 98 | env:error) echo "❌ ⚙️ " ;; |
| 99 | |
| 100 | fs:log) echo "📁 " ;; |
| 101 | fs:read) echo "📥 📁 " ;; |
| 102 | fs:write) echo "📤 📁 " ;; |
| 103 | fs:success) echo "✅ 📁 " ;; |
| 104 | fs:warning) echo "⚠️ 📁 " ;; |
| 105 | fs:error) echo "❌ 📁 " ;; |
| 106 | |
| 107 | db:log) echo "🗄️ " ;; |
| 108 | db:start) echo "🟢 🗄️ " ;; |
| 109 | db:migrate) echo "📜 🗄️ " ;; |
| 110 | db:success) echo "✅ 🗄️ " ;; |
| 111 | db:warning) echo "⚠️ 🗄️ " ;; |
| 112 | db:error) echo "❌ 🗄️ " ;; |
| 113 | |
| 114 | wg:log) echo "🔒 " ;; |
| 115 | wg:start) echo "🟢 🔒 " ;; |
| 116 | wg:stop) echo "🔴 🔒 " ;; |
| 117 | wg:add) echo "➕ 🔒 " ;; |
| 118 | wg:remove) echo "➖ 🔒 " ;; |
| 119 | wg:block) echo "🚫 🔒 " ;; |
| 120 | wg:unblock) echo "🔓 🔒 " ;; |
| 121 | wg:key) echo "🔑 🔒 " ;; |
| 122 | wg:success) echo "✅ 🔒 " ;; |
| 123 | wg:warning) echo "⚠️ 🔒 " ;; |
| 124 | wg:error) echo "❌ 🔒 " ;; |
| 125 | wg:list) echo "🔍 🔒 " ;; |
| 126 | wg:qr) echo "📱 🔒 " ;; |
| 127 | wg:preset) echo "📋 🔒 " ;; |
| 128 | |
| 129 | log:info) echo "🔹 " ;; |
| 130 | log:warn) echo "⚠️ " ;; |
| 131 | log:error) echo "❌ " ;; |
| 132 | log:success) echo "✅ " ;; |
| 133 | log:debug) echo "🔍 " ;; |
| 134 | |
| 135 | *) echo "🔹" ;; |
| 136 | esac |
| 137 | } |
| 138 | |
| 139 | function internal::get_context_icon() { |
| 140 | case "$1" in |
| 141 | docker) echo "🐳" ;; |
| 142 | build) echo "🏗️" ;; |
| 143 | network) echo "🌐" ;; |
| 144 | auth) echo "🔑" ;; |
| 145 | env) echo "⚙️" ;; |
| 146 | fs) echo "📁" ;; |
| 147 | db) echo "🗄️" ;; |
| 148 | wg) echo "🔒" ;; |
| 149 | log) echo "🔹" ;; |
| 150 | *) echo "🔹" ;; |
| 151 | esac |
| 152 | } |
| 153 | |
| 154 | # ============================================ |
| 155 | # Profiler |
| 156 | # ============================================ |
| 157 | |
| 158 | declare -gi _PROFILE_T0=0 |
| 159 | |
| 160 | function log::profile_start() { |
| 161 | _PROFILE_T0=$(date +%s%3N) |
| 162 | } |
| 163 | |
| 164 | function log::profile() { |
| 165 | [[ "${LOG_LEVEL:-2}" -gt 0 ]] && return 0 |
| 166 | local label="${1:-checkpoint}" |
| 167 | local now |
| 168 | now=$(date +%s%3N) |
| 169 | printf " \033[2m[profile] %s: %dms\033[0m\n" \ |
| 170 | "$label" "$(( now - _PROFILE_T0 ))" >&2 |
| 171 | _PROFILE_T0=$now # reset for next checkpoint |
| 172 | } |
| 173 | |
| 174 | # ============================================ |
| 175 | # Loggers |
| 176 | # ============================================ |
| 177 | |
| 178 | function internal::log::info() { internal::log INFO "$*"; } |
| 179 | function internal::log::warn() { internal::log WARN "$*"; } |
| 180 | function internal::log::error() { internal::log ERROR "$*"; } |
| 181 | function internal::log::success() { internal::log OK "$*"; } |
| 182 | function internal::log::debug() { internal::log DEBUG "$*"; } |
| 183 | |
| 184 | # ============================================ |
| 185 | # Context Loggers |
| 186 | # ============================================ |
| 187 | |
| 188 | function log::context() { |
| 189 | local context="$1" action="$2" |
| 190 | shift 2 |
| 191 | internal::log::info "$(internal::icon "$context" "$action") $*" |
| 192 | } |
| 193 | |
| 194 | function log::warn_context() { |
| 195 | local context="$1" action="$2" |
| 196 | shift 2 |
| 197 | internal::log::warn "$(internal::icon "$context" "$action") $*" |
| 198 | } |
| 199 | |
| 200 | function log::error_context() { |
| 201 | local context="$1" action="$2" |
| 202 | shift 2 |
| 203 | internal::log::error "$(internal::icon "$context" "$action") $*" |
| 204 | } |
| 205 | |
| 206 | function log::success_context() { |
| 207 | local context="$1" action="$2" |
| 208 | shift 2 |
| 209 | internal::log::success "$(internal::icon "$context" "$action") $*" |
| 210 | } |
| 211 | |
| 212 | function log::debug_context() { |
| 213 | local context="$1" action="$2" |
| 214 | shift 2 |
| 215 | internal::log::debug "$(internal::icon "$context" "$action") $*" |
| 216 | } |
| 217 | |
| 218 | # ============================================ |
| 219 | # Logger Helpers |
| 220 | # ============================================ |
| 221 | |
| 222 | function log::info() { log::context log info "$@"; } |
| 223 | function log::warn() { log::warn_context log warn "$@"; } |
| 224 | function log::error() { log::error_context log error "$@"; } |
| 225 | function log::ok() { internal::log OK "$@"; } |
| 226 | function log::success() { log::ok "$@"; } |
| 227 | function log::debug() { log::debug_context log debug "$@"; } |
| 228 | |
| 229 | function log::section() { |
| 230 | core::is_quiet && return 0 |
| 231 | local label="$1" |
| 232 | local width=48 |
| 233 | local line |
| 234 | line=$(printf '─%.0s' $(seq 1 $width)) |
| 235 | echo -e "\n\033[1;34m${line}\033[0m" |
| 236 | echo -e "\033[1;34m $label\033[0m" |
| 237 | echo -e "\033[1;34m${line}\033[0m" |
| 238 | } |
| 239 | |
| 240 | # ============================================ |
| 241 | # Docker |
| 242 | # ============================================ |
| 243 | |
| 244 | function log::docker() { log::context docker log "$@"; } |
| 245 | function log::docker_start() { log::context docker start "$@"; } |
| 246 | function log::docker_stop() { log::context docker stop "$@"; } |
| 247 | function log::docker_success() { log::success_context docker success "$@"; } |
| 248 | function log::docker_logs() { log::context docker logs "$@"; } |
| 249 | function log::docker_list() { log::context docker list "$@"; } |
| 250 | function log::docker_build() { log::context docker build "$@"; } |
| 251 | function log::docker_warning() { log::warn_context docker warning "$@"; } |
| 252 | function log::docker_error() { log::error_context docker error "$@"; } |
| 253 | |
| 254 | # ============================================ |
| 255 | # Build |
| 256 | # ============================================ |
| 257 | |
| 258 | function log::build() { log::context build log "$@"; } |
| 259 | function log::build_start() { log::context build start "$@"; } |
| 260 | function log::build_stop() { log::context build stop "$@"; } |
| 261 | function log::build_success() { log::success_context build success "$@"; } |
| 262 | function log::build_warning() { log::warn_context build warning "$@"; } |
| 263 | function log::build_error() { log::error_context build error "$@"; } |
| 264 | |
| 265 | # ============================================ |
| 266 | # Network |
| 267 | # ============================================ |
| 268 | |
| 269 | function log::network() { log::context network log "$@"; } |
| 270 | function log::network_setup() { log::context network setup "$@"; } |
| 271 | function log::network_stop() { log::context network stop "$@"; } |
| 272 | function log::network_success() { log::success_context network success "$@"; } |
| 273 | function log::network_warning() { log::warn_context network warning "$@"; } |
| 274 | function log::network_error() { log::error_context network error "$@"; } |
| 275 | |
| 276 | # ============================================ |
| 277 | # Auth |
| 278 | # ============================================ |
| 279 | |
| 280 | function log::auth() { log::context auth log "$@"; } |
| 281 | function log::auth_setup() { log::context auth setup "$@"; } |
| 282 | function log::auth_login() { log::context auth login "$@"; } |
| 283 | function log::auth_success() { log::success_context auth success "$@"; } |
| 284 | function log::auth_warning() { log::warn_context auth warning "$@"; } |
| 285 | function log::auth_error() { log::error_context auth error "$@"; } |
| 286 | |
| 287 | # ============================================ |
| 288 | # Env |
| 289 | # ============================================ |
| 290 | |
| 291 | function log::env() { log::context env log "$@"; } |
| 292 | function log::env_load() { log::context env load "$@"; } |
| 293 | function log::env_success() { log::success_context env success "$@"; } |
| 294 | function log::env_warning() { log::warn_context env warning "$@"; } |
| 295 | function log::env_error() { log::error_context env error "$@"; } |
| 296 | |
| 297 | # ============================================ |
| 298 | # Filesystem |
| 299 | # ============================================ |
| 300 | |
| 301 | function log::fs() { log::context fs log "$@"; } |
| 302 | function log::fs_read() { log::context fs read "$@"; } |
| 303 | function log::fs_write() { log::context fs write "$@"; } |
| 304 | function log::fs_success() { log::success_context fs success "$@"; } |
| 305 | function log::fs_warning() { log::warn_context fs warning "$@"; } |
| 306 | function log::fs_error() { log::error_context fs error "$@"; } |
| 307 | |
| 308 | # ============================================ |
| 309 | # Database |
| 310 | # ============================================ |
| 311 | |
| 312 | function log::db() { log::context db log "$@"; } |
| 313 | function log::db_start() { log::context db start "$@"; } |
| 314 | function log::db_migrate() { log::context db migrate "$@"; } |
| 315 | function log::db_success() { log::success_context db success "$@"; } |
| 316 | function log::db_warning() { log::warn_context db warning "$@"; } |
| 317 | function log::db_error() { log::error_context db error "$@"; } |
| 318 | |
| 319 | # ============================================ |
| 320 | # WireGuard |
| 321 | # ============================================ |
| 322 | |
| 323 | function log::wg() { log::context wg log "$@"; } |
| 324 | function log::wg_start() { log::context wg start "$@"; } |
| 325 | function log::wg_stop() { log::context wg stop "$@"; } |
| 326 | function log::wg_add() { log::context wg add "$@"; } |
| 327 | function log::wg_remove() { log::context wg remove "$@"; } |
| 328 | function log::wg_key() { log::context wg key "$@"; } |
| 329 | function log::wg_list() { log::context wg list "$@"; } |
| 330 | function log::wg_qr() { log::context wg qr "$@"; } |
| 331 | function log::wg_preset() { log::context wg preset "$@"; } |
| 332 | function log::wg_success() { log::success_context wg success "$@"; } |
| 333 | function log::wg_warning() { log::warn_context wg warning "$@"; } |
| 334 | function log::wg_error() { log::error_context wg error "$@"; } |
| 335 | |
| 336 | function log::wg_block() { |
| 337 | log::context wg block "$@" |
| 338 | } |
| 339 | |
| 340 | function log::wg_unblock() { |
| 341 | log::context wg unblock "$@" |
| 342 | } |
| 343 | |
| 344 | # ============================================ |
| 345 | # Run Step |
| 346 | # ============================================ |
| 347 | |
| 348 | function log::run_step() { |
| 349 | local context="$1" |
| 350 | local mode="strict" |
| 351 | local description |
| 352 | |
| 353 | shift |
| 354 | |
| 355 | if [[ "$1" == "soft" || "$1" == "strict" || "$1" == "info" ]]; then |
| 356 | mode="$1" |
| 357 | shift |
| 358 | fi |
| 359 | |
| 360 | description="$1" |
| 361 | shift |
| 362 | |
| 363 | local icon |
| 364 | icon=$(internal::get_context_icon "$context") |
| 365 | |
| 366 | if [[ "$mode" == "info" ]]; then |
| 367 | internal::log::info "$icon $description" |
| 368 | else |
| 369 | internal::log::info "🔄 $icon $description" |
| 370 | fi |
| 371 | |
| 372 | "$@" |
| 373 | local status=$? |
| 374 | |
| 375 | if [[ $status -eq 0 ]]; then |
| 376 | [[ "$mode" == "info" ]] && return 0 |
| 377 | internal::log::success "✅ $icon $description" |
| 378 | return 0 |
| 379 | fi |
| 380 | |
| 381 | if [[ "$mode" == "soft" || "$mode" == "info" ]]; then |
| 382 | internal::log::warn "⚠️ $icon $description → skipped" |
| 383 | return 0 |
| 384 | fi |
| 385 | |
| 386 | internal::log::error "❌ $icon $description → failed" |
| 387 | return $status |
| 388 | } |