最后活跃于 1 month ago

gistfile1.txt 原始文件
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