-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathverify.sh
More file actions
305 lines (268 loc) · 11.4 KB
/
verify.sh
File metadata and controls
305 lines (268 loc) · 11.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
#!/bin/bash
# =============================================================================
# verify.sh — IACT-db: verifica estado completo de las bases de datos
# =============================================================================
# Uso:
# bash verify.sh # sin root, verifica conectividad y .env
#
# Comprueba en orden:
# 1. Variables requeridas en .env
# 2. Herramientas CLI disponibles (mysql, psql, pg_isready)
# 3. MariaDB responde (socket Unix → TCP)
# 4. PostgreSQL responde (pg_isready → TCP)
# 5. Conexión Django → ivr_legacy (READ-ONLY — CNST-003)
# 6. Conexión Django → iact_analytics (READ+WRITE)
# 7. tbl_temp_prueba_ivr existe y tiene registros (si aplica)
#
# Muestra resumen final con contadores OK / WARN / ERROR.
# Equivalente a la sección "check_database_connectivity" de IACT-api check_tools.sh
# =============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$SCRIPT_DIR"
source "${PROJECT_ROOT}/utils/logging.sh"
source "${PROJECT_ROOT}/utils/core.sh"
source "${PROJECT_ROOT}/utils/network.sh"
source "${PROJECT_ROOT}/utils/database.sh"
# =============================================================================
# Cargar .env
# =============================================================================
ENV_FILE="${PROJECT_ROOT}/.env"
if [[ ! -f "$ENV_FILE" ]]; then
echo "[ERROR] Archivo .env no encontrado"
echo " Crea tu configuración: cp .env.example .env"
exit 1
fi
set -a; source "$ENV_FILE"; set +a
# Valores con defaults
MARIADB_HOST="${MARIADB_HOST:-127.0.0.1}"
MARIADB_PORT="${MARIADB_PORT:-3306}"
POSTGRES_HOST="${POSTGRES_HOST:-127.0.0.1}"
POSTGRES_PORT="${POSTGRES_PORT:-5432}"
DB_MARIADB_NAME="${DB_MARIADB_NAME:-ivr_legacy}"
DB_MARIADB_USER="${DB_MARIADB_USER:-django_user}"
DB_MARIADB_PASSWORD="${DB_MARIADB_PASSWORD:-django_pass}"
DB_POSTGRES_NAME="${DB_POSTGRES_NAME:-iact_analytics}"
DB_POSTGRES_USER="${DB_POSTGRES_USER:-django_user}"
DB_POSTGRES_PASSWORD="${DB_POSTGRES_PASSWORD:-django_pass}"
# =============================================================================
# Contadores
# =============================================================================
OK=0; WARN=0; ERR=0
ok() { log_success "$1"; OK=$(( OK + 1 )); }
warn() { log_warn "$1"; WARN=$(( WARN + 1 )); }
fail() { log_error "$1"; ERR=$(( ERR + 1 )); }
# =============================================================================
# Sección 1 — Variables de .env
# =============================================================================
check_env_vars() {
log_header "1/7 Variables de entorno (.env)"
local required=(
"MARIADB_HOST" "MARIADB_PORT"
"DB_MARIADB_NAME" "DB_MARIADB_USER" "DB_MARIADB_PASSWORD"
"POSTGRES_HOST" "POSTGRES_PORT"
"DB_POSTGRES_NAME" "DB_POSTGRES_USER" "DB_POSTGRES_PASSWORD"
)
for var in "${required[@]}"; do
if [[ -n "${!var:-}" ]]; then
ok " ${var}=${!var}"
else
fail " ${var} no configurado en .env"
fi
done
}
# =============================================================================
# Sección 2 — Herramientas CLI
# =============================================================================
check_tools() {
log_header "2/7 Herramientas CLI"
local tools=(
"mysqladmin:MariaDB health check"
"mysql:MariaDB client"
"pg_isready:PostgreSQL health check"
"psql:PostgreSQL client"
)
for entry in "${tools[@]}"; do
local cmd="${entry%%:*}"
local desc="${entry##*:}"
if command -v "$cmd" &>/dev/null; then
ok " ${cmd} disponible (${desc})"
else
warn " ${cmd} no encontrado — instala: sudo bash scripts/install-clients.sh"
fi
done
}
# =============================================================================
# Sección 3 — MariaDB activo
# =============================================================================
check_mariadb_running() {
log_header "3/7 MariaDB — conectividad"
# Intentar socket Unix primero
local socket_ok=false
for sock in /run/mysqld/mysqld.sock /var/run/mysqld/mysqld.sock; do
if [[ -S "$sock" ]] && \
mysqladmin --socket="$sock" ping --silent >/dev/null 2>&1; then
ok "MariaDB activo via socket: ${sock}"
socket_ok=true
break
fi
done
if [[ "$socket_ok" == "false" ]]; then
if mariadb_is_running "$MARIADB_HOST" "$MARIADB_PORT"; then
ok "MariaDB activo via TCP: ${MARIADB_HOST}:${MARIADB_PORT}"
else
fail "MariaDB NO responde en ${MARIADB_HOST}:${MARIADB_PORT}"
warn " Arranca con: sudo bash bootstrap.sh"
fi
fi
}
# =============================================================================
# Sección 4 — PostgreSQL activo
# =============================================================================
check_postgres_running() {
log_header "4/7 PostgreSQL — conectividad"
if command -v pg_isready &>/dev/null && \
pg_isready -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -q 2>/dev/null; then
ok "PostgreSQL activo (pg_isready): ${POSTGRES_HOST}:${POSTGRES_PORT}"
elif pg_is_running "$POSTGRES_HOST" "$POSTGRES_PORT"; then
ok "PostgreSQL activo via TCP: ${POSTGRES_HOST}:${POSTGRES_PORT}"
else
fail "PostgreSQL NO responde en ${POSTGRES_HOST}:${POSTGRES_PORT}"
warn " Arranca con: sudo bash bootstrap.sh"
fi
}
# =============================================================================
# Sección 5 — Conexión Django → ivr_legacy (READ-ONLY)
# =============================================================================
check_mariadb_django() {
log_header "5/7 Django → ivr_legacy (READ-ONLY — CNST-003)"
if ! command -v mysql &>/dev/null; then
warn "mysql CLI no disponible — saltar verificación"
warn " Instala: sudo bash scripts/install-clients.sh"
return
fi
local result
result=$(mysql -h "$MARIADB_HOST" -P "$MARIADB_PORT" \
-u "$DB_MARIADB_USER" -p"${DB_MARIADB_PASSWORD}" \
--batch --silent --skip-column-names \
-e "SELECT CONCAT(DATABASE(), '@', USER());" \
"$DB_MARIADB_NAME" 2>&1) \
&& ok "Conexion Django a ivr_legacy OK: ${result}" \
|| fail "No se pudo conectar a ivr_legacy como ${DB_MARIADB_USER}"
# Verificar que es READ-ONLY (CNST-003)
if command -v mysql &>/dev/null; then
local write_privs
write_privs=$(mysql -h "$MARIADB_HOST" -P "$MARIADB_PORT" \
-u "$DB_MARIADB_USER" -p"${DB_MARIADB_PASSWORD}" \
--batch --silent --skip-column-names \
-e "SELECT COUNT(*) FROM information_schema.USER_PRIVILEGES
WHERE GRANTEE LIKE \"'${DB_MARIADB_USER}'%\"
AND PRIVILEGE_TYPE IN
('INSERT','UPDATE','DELETE','DROP','CREATE','ALTER');" \
2>/dev/null || echo "?")
if [[ "$write_privs" == "0" ]]; then
ok "CNST-003: ${DB_MARIADB_USER} es READ-ONLY en ${DB_MARIADB_NAME}"
elif [[ "$write_privs" == "?" ]]; then
warn "CNST-003: no se pudo verificar privilegios de escritura"
else
fail "CNST-003: ${DB_MARIADB_USER} tiene ${write_privs} privilegio(s) de ESCRITURA en ${DB_MARIADB_NAME}"
fi
fi
}
# =============================================================================
# Sección 6 — Conexión Django → iact_analytics (READ+WRITE)
# =============================================================================
check_postgres_django() {
log_header "6/7 Django → iact_analytics (READ+WRITE)"
if ! command -v psql &>/dev/null; then
warn "psql CLI no disponible — saltar verificación"
warn " Instala: sudo bash scripts/install-clients.sh"
return
fi
local result
result=$(PGPASSWORD="$DB_POSTGRES_PASSWORD" \
psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
-U "$DB_POSTGRES_USER" -d "$DB_POSTGRES_NAME" \
-tAq -c "SELECT current_database() || '@' || current_user;" 2>&1) \
&& ok "Conexion Django a iact_analytics OK: ${result}" \
|| fail "No se pudo conectar a iact_analytics como ${DB_POSTGRES_USER}"
# Verificar que puede crear tablas (necesario para migrate)
if command -v psql &>/dev/null && PGPASSWORD="$DB_POSTGRES_PASSWORD" \
psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" \
-U "$DB_POSTGRES_USER" -d "$DB_POSTGRES_NAME" \
-c "CREATE TABLE IF NOT EXISTS _verify_tmp (id SERIAL PRIMARY KEY);
DROP TABLE IF EXISTS _verify_tmp;" \
&>/dev/null 2>&1; then
ok "Permisos DDL OK (puede crear tablas — necesario para migrate)"
else
warn "No se pudo verificar permisos DDL en iact_analytics"
fi
}
# =============================================================================
# Sección 7 — tbl_temp_prueba_ivr (datos de prueba ivr_legacy)
# =============================================================================
check_seed_table() {
log_header "7/7 tbl_temp_prueba_ivr (datos de prueba ivr_legacy)"
if ! command -v mysql &>/dev/null; then
warn "mysql CLI no disponible — saltar verificación"
return
fi
local count
count=$(mysql -h "$MARIADB_HOST" -P "$MARIADB_PORT" \
-u "$DB_MARIADB_USER" -p"${DB_MARIADB_PASSWORD}" \
--batch --silent --skip-column-names \
-e "SELECT COUNT(*) FROM tbl_temp_prueba_ivr;" \
"$DB_MARIADB_NAME" 2>/dev/null || echo "-1")
if [[ "$count" -ge 3000 ]]; then
ok "tbl_temp_prueba_ivr: ${count} registros disponibles"
elif [[ "$count" -ge 0 ]]; then
warn "tbl_temp_prueba_ivr: solo ${count} registros (esperado 3000+)"
warn " Ejecuta: sudo bash provisioners/mariadb/schema_seed.sh"
else
warn "tbl_temp_prueba_ivr no existe o no es accesible"
warn " Ejecuta: sudo bash provisioners/mariadb/schema_seed.sh"
fi
}
# =============================================================================
# MAIN
# =============================================================================
log_header "IACT-db — Verificación completa"
echo " MariaDB: ${MARIADB_HOST}:${MARIADB_PORT} / ${DB_MARIADB_NAME}"
echo " PostgreSQL: ${POSTGRES_HOST}:${POSTGRES_PORT} / ${DB_POSTGRES_NAME}"
echo ""
check_env_vars
echo ""
check_tools
echo ""
check_mariadb_running
echo ""
check_postgres_running
echo ""
check_mariadb_django
echo ""
check_postgres_django
echo ""
check_seed_table
# =============================================================================
# Resumen
# =============================================================================
echo ""
log_separator 60 "="
echo ""
log_success "OK: ${OK}"
log_warn "Advertencias: ${WARN}"
[[ $ERR -gt 0 ]] && log_error "Errores: ${ERR}" || log_success "Errores: ${ERR}"
echo ""
if [[ $ERR -eq 0 && $WARN -eq 0 ]]; then
log_success "Entorno listo para desarrollo."
elif [[ $ERR -eq 0 ]]; then
log_warn "Entorno funcional con advertencias — revisar items marcados."
echo ""
log_info " sudo bash scripts/install-clients.sh # si faltan clientes CLI"
log_info " sudo bash provisioners/mariadb/schema_seed.sh # si faltan datos"
else
log_error "Entorno incompleto — corregir errores antes de continuar."
echo ""
log_info " sudo bash bootstrap.sh # reinstalar y configurar todo"
fi
exit $(( ERR > 0 ? 1 : 0 ))