Last active 1 month ago

gistfile1.txt Raw
1#!/usr/bin/env bash
2
3# ============================================
4# Core
5# ============================================
6
7LOG_LEVEL=${LOG_LEVEL:-INFO}
8
9# ============================================
10# Internal
11# ============================================
12
13function internal::get_log_priority() {
14 case "$1" in
15 DEBUG) echo 0 ;;
16 INFO) echo 1 ;;
17 SUCCESS) echo 1 ;; # FIX: SUCCESS is informational, not above ERROR
18 WARN) echo 2 ;;
19 ERROR) echo 3 ;;
20 *) echo 1 ;;
21 esac
22}
23
24function internal::log() {
25 local level="$1"
26 shift
27
28 local current_priority
29 local message_priority
30
31 current_priority=$(internal::get_log_priority "$LOG_LEVEL")
32 message_priority=$(internal::get_log_priority "$level")
33
34 if (( message_priority < current_priority )); then
35 return 0
36 fi
37
38 local color
39 case "$level" in
40 DEBUG) color="\033[0;36m" ;; # FIX: actual cyan (was white \033[0;37m)
41 INFO) color="\033[1;34m" ;; # blue
42 WARN) color="\033[1;33m" ;; # yellow
43 ERROR) color="\033[1;31m" ;; # red
44 SUCCESS) color="\033[1;32m" ;; # green
45 esac
46
47 echo -e "${color}=> ${level}:\033[0m $*"
48}
49
50function internal::icon() {
51 local context="$1"
52 local action="$2"
53
54 case "$context:$action" in
55 docker:log) echo "🐳 " ;;
56 docker:start) echo "🟒 🐳 " ;;
57 docker:stop) echo "πŸ”΄ 🐳 " ;;
58 docker:success) echo "βœ… 🐳 " ;;
59 docker:warning) echo "⚠️ 🐳 " ;;
60 docker:error) echo "❌ 🐳 " ;;
61 docker:logs) echo "πŸ“œ 🐳 " ;;
62 docker:list) echo "πŸ” 🐳 " ;;
63 docker:build) echo "πŸ“¦ 🐳 " ;;
64
65 build:log) echo "πŸ—οΈ " ;;
66 build:start) echo "🟒 πŸ—οΈ " ;;
67 build:stop) echo "πŸ”΄ πŸ—οΈ " ;;
68 build:success) echo "βœ… πŸ—οΈ " ;;
69 build:warning) echo "⚠️ πŸ—οΈ " ;;
70 build:error) echo "❌ πŸ—οΈ " ;;
71
72 network:log) echo "🌐 " ;;
73 network:setup) echo "βš™οΈ 🌐 " ;;
74 network:stop) echo "πŸ”΄ 🌐 " ;;
75 network:success) echo "βœ… 🌐 " ;;
76 network:warning) echo "⚠️ 🌐 " ;;
77 network:error) echo "❌ 🌐 " ;;
78
79 auth:log) echo "πŸ”‘ " ;;
80 auth:setup) echo "βš™οΈ πŸ”‘ " ;;
81 auth:login) echo "πŸ” πŸ”‘ " ;;
82 auth:success) echo "βœ… πŸ”‘ " ;;
83 auth:warning) echo "⚠️ πŸ”‘ " ;;
84 auth:error) echo "❌ πŸ”‘ " ;;
85
86 env:log) echo "βš™οΈ " ;;
87 env:load) echo "πŸ“₯ βš™οΈ " ;;
88 env:success) echo "βœ… βš™οΈ " ;;
89 env:warning) echo "⚠️ βš™οΈ " ;;
90 env:error) echo "❌ βš™οΈ " ;;
91
92 fs:log) echo "πŸ“ " ;;
93 fs:read) echo "πŸ“₯ πŸ“ " ;;
94 fs:write) echo "πŸ“€ πŸ“ " ;;
95 fs:success) echo "βœ… πŸ“ " ;;
96 fs:warning) echo "⚠️ πŸ“ " ;;
97 fs:error) echo "❌ πŸ“ " ;;
98
99 db:log) echo "πŸ—„οΈ " ;;
100 db:start) echo "🟒 πŸ—„οΈ " ;;
101 db:migrate) echo "πŸ“œ πŸ—„οΈ " ;;
102 db:success) echo "βœ… πŸ—„οΈ " ;;
103 db:warning) echo "⚠️ πŸ—„οΈ " ;;
104 db:error) echo "❌ πŸ—„οΈ " ;;
105
106 # ADDED: WireGuard context
107 wg:log) echo "πŸ”’ " ;;
108 wg:start) echo "🟒 πŸ”’ " ;;
109 wg:stop) echo "πŸ”΄ πŸ”’ " ;;
110 wg:add) echo "βž• πŸ”’ " ;;
111 wg:remove) echo "βž– πŸ”’ " ;;
112 wg:block) echo "🚫 πŸ”’ " ;;
113 wg:unblock) echo "βœ… πŸ”’ " ;;
114 wg:key) echo "πŸ”‘ πŸ”’ " ;;
115 wg:success) echo "βœ… πŸ”’ " ;;
116 wg:warning) echo "⚠️ πŸ”’ " ;;
117 wg:error) echo "❌ πŸ”’ " ;;
118 wg:list) echo "πŸ” πŸ”’ " ;;
119 wg:qr) echo "πŸ“± πŸ”’ " ;;
120 wg:preset) echo "πŸ“‹ πŸ”’ " ;;
121
122 log:info) echo "πŸ”Ή " ;;
123 log:warn) echo "⚠️ " ;;
124 log:error) echo "❌ " ;;
125 log:success) echo "βœ… " ;;
126 log:debug) echo "πŸ” " ;; # FIX: was missing, caused fallthrough
127
128 *) echo "πŸ”Ή" ;;
129 esac
130}
131
132function internal::get_context_icon() {
133 case "$1" in
134 docker) echo "🐳" ;;
135 build) echo "πŸ—οΈ" ;;
136 network) echo "🌐" ;;
137 auth) echo "πŸ”‘" ;;
138 env) echo "βš™οΈ" ;;
139 fs) echo "πŸ“" ;;
140 db) echo "πŸ—„οΈ" ;;
141 wg) echo "πŸ”’" ;; # ADDED: missing from original
142 log) echo "πŸ”Ή" ;; # ADDED: missing from original
143 *) echo "πŸ”Ή" ;;
144 esac
145}
146
147# ============================================
148# Loggers
149# ============================================
150
151function internal::log::info() { internal::log INFO "$*"; }
152function internal::log::warn() { internal::log WARN "$*"; }
153function internal::log::error() { internal::log ERROR "$*"; }
154function internal::log::success() { internal::log SUCCESS "$*"; }
155function internal::log::debug() { internal::log DEBUG "$*"; }
156
157# ============================================
158# Context Loggers
159# ============================================
160
161function log::context() {
162 local context="$1"
163 local action="$2"
164 shift 2
165 internal::log::info "$(internal::icon "$context" "$action") $*"
166}
167
168function log::warn_context() {
169 local context="$1"
170 local action="$2"
171 shift 2
172 internal::log::warn "$(internal::icon "$context" "$action") $*"
173}
174
175function log::error_context() {
176 local context="$1"
177 local action="$2"
178 shift 2
179 internal::log::error "$(internal::icon "$context" "$action") $*"
180}
181
182function log::success_context() {
183 local context="$1"
184 local action="$2"
185 shift 2
186 internal::log::success "$(internal::icon "$context" "$action") $*"
187}
188
189function log::debug_context() {
190 local context="$1"
191 local action="$2"
192 shift 2
193 internal::log::debug "$(internal::icon "$context" "$action") $*"
194}
195
196# ============================================
197# Logger Helpers
198# ============================================
199
200function log::info() { log::context log info "$@"; }
201function log::warn() { log::warn_context log warn "$@"; }
202function log::error() { log::error_context log error "$@"; }
203function log::success() { log::success_context log success "$@"; }
204function log::debug() { log::debug_context log debug "$@"; } # FIX: was calling warn_context
205
206# ADDED: section separator for visual grouping in output
207function log::section() {
208 local label="$1"
209 local width=48
210 local line
211 line=$(printf '─%.0s' $(seq 1 $width))
212 echo -e "\n\033[1;34m${line}\033[0m"
213 echo -e "\033[1;34m $label\033[0m"
214 echo -e "\033[1;34m${line}\033[0m"
215}
216
217function log::docker() { log::context docker log "$@"; }
218function log::docker_start() { log::context docker start "$@"; }
219function log::docker_stop() { log::context docker stop "$@"; }
220function log::docker_success() { log::success_context docker success "$@"; } # FIX: was using context not success_context
221function log::docker_logs() { log::context docker logs "$@"; }
222function log::docker_list() { log::context docker list "$@"; }
223function log::docker_build() { log::context docker build "$@"; }
224function log::docker_warning() { log::warn_context docker warning "$@"; }
225function log::docker_error() { log::error_context docker error "$@"; }
226
227function log::build() { log::context build log "$@"; }
228function log::build_start() { log::context build start "$@"; }
229function log::build_stop() { log::context build stop "$@"; }
230function log::build_success() { log::success_context build success "$@"; }
231function log::build_warning() { log::warn_context build warning "$@"; }
232function log::build_error() { log::error_context build error "$@"; }
233
234function log::network() { log::context network log "$@"; }
235function log::network_setup() { log::context network setup "$@"; }
236function log::network_stop() { log::context network stop "$@"; }
237function log::network_success() { log::success_context network success "$@"; }
238function log::network_warning() { log::warn_context network warning "$@"; }
239function log::network_error() { log::error_context network error "$@"; }
240
241function log::auth() { log::context auth log "$@"; }
242function log::auth_setup() { log::context auth setup "$@"; }
243function log::auth_login() { log::context auth login "$@"; }
244function log::auth_success() { log::success_context auth success "$@"; }
245function log::auth_warning() { log::warn_context auth warning "$@"; }
246function log::auth_error() { log::error_context auth error "$@"; }
247
248function log::env() { log::context env log "$@"; }
249function log::env_load() { log::context env load "$@"; }
250function log::env_success() { log::success_context env success "$@"; }
251function log::env_warning() { log::warn_context env warning "$@"; }
252function log::env_error() { log::error_context env error "$@"; }
253
254function log::fs() { log::context fs log "$@"; }
255function log::fs_read() { log::context fs read "$@"; }
256function log::fs_write() { log::context fs write "$@"; }
257function log::fs_success() { log::success_context fs success "$@"; }
258function log::fs_warning() { log::warn_context fs warning "$@"; }
259function log::fs_error() { log::error_context fs error "$@"; }
260
261function log::db() { log::context db log "$@"; }
262function log::db_start() { log::context db start "$@"; }
263function log::db_migrate() { log::context db migrate "$@"; }
264function log::db_success() { log::success_context db success "$@"; }
265function log::db_warning() { log::warn_context db warning "$@"; }
266function log::db_error() { log::error_context db error "$@"; }
267
268# ADDED: WireGuard context helpers
269function log::wg() { log::context wg log "$@"; }
270function log::wg_start() { log::context wg start "$@"; }
271function log::wg_stop() { log::context wg stop "$@"; }
272function log::wg_add() { log::context wg add "$@"; }
273function log::wg_remove() { log::context wg remove "$@"; }
274function log::wg_block() { log::context wg block "$@"; }
275function log::wg_unblock() { log::context wg unblock "$@"; }
276function log::wg_key() { log::context wg key "$@"; }
277function log::wg_list() { log::context wg list "$@"; }
278function log::wg_qr() { log::context wg qr "$@"; }
279function log::wg_preset() { log::context wg preset "$@"; }
280function log::wg_success() { log::success_context wg success "$@"; }
281function log::wg_warning() { log::warn_context wg warning "$@"; }
282function log::wg_error() { log::error_context wg error "$@"; }
283
284function log::run_step() {
285 local context="$1"
286 local mode="strict"
287 local description
288
289 shift
290
291 if [[ "$1" == "soft" || "$1" == "strict" || "$1" == "info" ]]; then
292 mode="$1"
293 shift
294 fi
295
296 description="$1"
297 shift
298
299 local icon
300 icon=$(internal::get_context_icon "$context")
301
302 if [[ "$mode" == "info" ]]; then
303 internal::log::info "$icon $description"
304 else
305 internal::log::info "πŸ”„ $icon $description"
306 fi
307
308 "$@"
309 local status=$?
310
311 if [[ $status -eq 0 ]]; then
312 if [[ "$mode" == "info" ]]; then
313 return 0
314 fi
315 internal::log::success "βœ… $icon $description"
316 return 0
317 fi
318
319 if [[ "$mode" == "soft" || "$mode" == "info" ]]; then
320 internal::log::warn "⚠️ $icon $description β†’ skipped"
321 return 0
322 fi
323
324 internal::log::error "❌ $icon $description β†’ failed"
325 return $status
326}
327