最後活躍 3 weeks ago

nuno 已修改 3 weeks ago. 還原成這個修訂版本

1 file changed, 388 insertions

gistfile1.txt(檔案已創建)

@@ -0,0 +1,388 @@
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 + }
上一頁 下一頁