Last active 1 month ago

nuno revised this gist 1 month ago. Go to revision

1 file changed, 326 insertions

gistfile1.txt(file created)

@@ -0,0 +1,326 @@
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 ;; # FIX: SUCCESS is informational, not above ERROR
18 + WARN) echo 2 ;;
19 + ERROR) echo 3 ;;
20 + *) echo 1 ;;
21 + esac
22 + }
23 +
24 + function 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 +
50 + function 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 +
132 + function 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 +
151 + function internal::log::info() { internal::log INFO "$*"; }
152 + function internal::log::warn() { internal::log WARN "$*"; }
153 + function internal::log::error() { internal::log ERROR "$*"; }
154 + function internal::log::success() { internal::log SUCCESS "$*"; }
155 + function internal::log::debug() { internal::log DEBUG "$*"; }
156 +
157 + # ============================================
158 + # Context Loggers
159 + # ============================================
160 +
161 + function log::context() {
162 + local context="$1"
163 + local action="$2"
164 + shift 2
165 + internal::log::info "$(internal::icon "$context" "$action") $*"
166 + }
167 +
168 + function log::warn_context() {
169 + local context="$1"
170 + local action="$2"
171 + shift 2
172 + internal::log::warn "$(internal::icon "$context" "$action") $*"
173 + }
174 +
175 + function log::error_context() {
176 + local context="$1"
177 + local action="$2"
178 + shift 2
179 + internal::log::error "$(internal::icon "$context" "$action") $*"
180 + }
181 +
182 + function log::success_context() {
183 + local context="$1"
184 + local action="$2"
185 + shift 2
186 + internal::log::success "$(internal::icon "$context" "$action") $*"
187 + }
188 +
189 + function 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 +
200 + function log::info() { log::context log info "$@"; }
201 + function log::warn() { log::warn_context log warn "$@"; }
202 + function log::error() { log::error_context log error "$@"; }
203 + function log::success() { log::success_context log success "$@"; }
204 + function log::debug() { log::debug_context log debug "$@"; } # FIX: was calling warn_context
205 +
206 + # ADDED: section separator for visual grouping in output
207 + function 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 +
217 + function log::docker() { log::context docker log "$@"; }
218 + function log::docker_start() { log::context docker start "$@"; }
219 + function log::docker_stop() { log::context docker stop "$@"; }
220 + function log::docker_success() { log::success_context docker success "$@"; } # FIX: was using context not success_context
221 + function log::docker_logs() { log::context docker logs "$@"; }
222 + function log::docker_list() { log::context docker list "$@"; }
223 + function log::docker_build() { log::context docker build "$@"; }
224 + function log::docker_warning() { log::warn_context docker warning "$@"; }
225 + function log::docker_error() { log::error_context docker error "$@"; }
226 +
227 + function log::build() { log::context build log "$@"; }
228 + function log::build_start() { log::context build start "$@"; }
229 + function log::build_stop() { log::context build stop "$@"; }
230 + function log::build_success() { log::success_context build success "$@"; }
231 + function log::build_warning() { log::warn_context build warning "$@"; }
232 + function log::build_error() { log::error_context build error "$@"; }
233 +
234 + function log::network() { log::context network log "$@"; }
235 + function log::network_setup() { log::context network setup "$@"; }
236 + function log::network_stop() { log::context network stop "$@"; }
237 + function log::network_success() { log::success_context network success "$@"; }
238 + function log::network_warning() { log::warn_context network warning "$@"; }
239 + function log::network_error() { log::error_context network error "$@"; }
240 +
241 + function log::auth() { log::context auth log "$@"; }
242 + function log::auth_setup() { log::context auth setup "$@"; }
243 + function log::auth_login() { log::context auth login "$@"; }
244 + function log::auth_success() { log::success_context auth success "$@"; }
245 + function log::auth_warning() { log::warn_context auth warning "$@"; }
246 + function log::auth_error() { log::error_context auth error "$@"; }
247 +
248 + function log::env() { log::context env log "$@"; }
249 + function log::env_load() { log::context env load "$@"; }
250 + function log::env_success() { log::success_context env success "$@"; }
251 + function log::env_warning() { log::warn_context env warning "$@"; }
252 + function log::env_error() { log::error_context env error "$@"; }
253 +
254 + function log::fs() { log::context fs log "$@"; }
255 + function log::fs_read() { log::context fs read "$@"; }
256 + function log::fs_write() { log::context fs write "$@"; }
257 + function log::fs_success() { log::success_context fs success "$@"; }
258 + function log::fs_warning() { log::warn_context fs warning "$@"; }
259 + function log::fs_error() { log::error_context fs error "$@"; }
260 +
261 + function log::db() { log::context db log "$@"; }
262 + function log::db_start() { log::context db start "$@"; }
263 + function log::db_migrate() { log::context db migrate "$@"; }
264 + function log::db_success() { log::success_context db success "$@"; }
265 + function log::db_warning() { log::warn_context db warning "$@"; }
266 + function log::db_error() { log::error_context db error "$@"; }
267 +
268 + # ADDED: WireGuard context helpers
269 + function log::wg() { log::context wg log "$@"; }
270 + function log::wg_start() { log::context wg start "$@"; }
271 + function log::wg_stop() { log::context wg stop "$@"; }
272 + function log::wg_add() { log::context wg add "$@"; }
273 + function log::wg_remove() { log::context wg remove "$@"; }
274 + function log::wg_block() { log::context wg block "$@"; }
275 + function log::wg_unblock() { log::context wg unblock "$@"; }
276 + function log::wg_key() { log::context wg key "$@"; }
277 + function log::wg_list() { log::context wg list "$@"; }
278 + function log::wg_qr() { log::context wg qr "$@"; }
279 + function log::wg_preset() { log::context wg preset "$@"; }
280 + function log::wg_success() { log::success_context wg success "$@"; }
281 + function log::wg_warning() { log::warn_context wg warning "$@"; }
282 + function log::wg_error() { log::error_context wg error "$@"; }
283 +
284 + function 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 + }
Newer Older