fix(lxc): instalar sudo e implementar helper pg_cmd universal (sudo/runuser/su) para PostgreSQL
This commit is contained in:
+6
-1
@@ -71,8 +71,13 @@ if command -v pg_dump >/dev/null 2>&1; then
|
||||
--no-owner --no-privileges --clean --if-exists > "$BACKUP_FILE" 2>/dev/null; then
|
||||
ok "Volcado generado con éxito usando pg_dump"
|
||||
elif [[ $EUID -eq 0 ]] || sudo -n true 2>/dev/null; then
|
||||
info "Reintentando volcado como superusuario postgres..."
|
||||
if command -v sudo >/dev/null 2>&1; then
|
||||
sudo -u postgres pg_dump -d "$DB_NAME" --no-owner --no-privileges > "$BACKUP_FILE"
|
||||
elif command -v runuser >/dev/null 2>&1; then
|
||||
runuser -u postgres -- pg_dump -d "$DB_NAME" --no-owner --no-privileges > "$BACKUP_FILE"
|
||||
else
|
||||
su - postgres -c "pg_dump -d \"$DB_NAME\" --no-owner --no-privileges" > "$BACKUP_FILE"
|
||||
fi
|
||||
ok "Volcado generado como usuario postgres"
|
||||
else
|
||||
err "No se pudo realizar el backup. Verifica tus permisos y credenciales."
|
||||
|
||||
+35
-22
@@ -74,12 +74,23 @@ hdr "1. Actualizando repositorios y paquetes base"
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt-get update -qq
|
||||
apt-get install -y -qq \
|
||||
curl wget git ca-certificates gnupg lsb-release \
|
||||
sudo curl wget git ca-certificates gnupg lsb-release \
|
||||
build-essential libpq-dev \
|
||||
locales \
|
||||
> /dev/null 2>&1
|
||||
ok "Paquetes base instalados"
|
||||
|
||||
# Función auxiliar para ejecutar comandos psql como superusuario postgres de forma universal (sin depender de sudo)
|
||||
pg_cmd() {
|
||||
if command -v sudo >/dev/null 2>&1; then
|
||||
sudo -u postgres psql "$@"
|
||||
elif command -v runuser >/dev/null 2>&1; then
|
||||
runuser -u postgres -- psql "$@"
|
||||
else
|
||||
su - postgres -c "psql $(printf '%q ' "$@")"
|
||||
fi
|
||||
}
|
||||
|
||||
# ─── 2. Configurar Locale UTF-8 ────────────────────────────────────────────────
|
||||
hdr "2. Configurando soporte de codificación (Locales UTF-8)"
|
||||
if [ -f /etc/locale.gen ]; then
|
||||
@@ -142,7 +153,7 @@ service postgresql start 2>/dev/null || true
|
||||
# Esperar a que el socket de PostgreSQL esté completamente activo
|
||||
PG_READY=false
|
||||
for i in {1..20}; do
|
||||
if sudo -u postgres psql -c '\q' >/dev/null 2>&1; then
|
||||
if pg_cmd -c '\q' >/dev/null 2>&1; then
|
||||
PG_READY=true
|
||||
break
|
||||
fi
|
||||
@@ -170,6 +181,8 @@ else
|
||||
pg_lsclusters 2>/dev/null || true
|
||||
systemctl status "postgresql@${PG_MAJOR}-main" --no-pager -n 10 2>/dev/null || true
|
||||
journalctl -u postgresql -n 15 --no-pager 2>/dev/null || true
|
||||
info "Prueba directa de conexión psql:"
|
||||
pg_cmd -c '\q' || true
|
||||
err "No se pudo conectar al motor PostgreSQL. Verificá los registros del sistema."
|
||||
fi
|
||||
|
||||
@@ -238,24 +251,24 @@ hdr "6. Configurando motor PostgreSQL y credenciales de base de datos"
|
||||
# Configurar usuarios en PostgreSQL con privilegios completos
|
||||
for u in "${DB_USER}" "${DB_USERNAME:-}" eduspace_user; do
|
||||
if [[ -n "$u" && "$u" != "postgres" ]]; then
|
||||
sudo -u postgres psql -c "CREATE USER \"${u}\" WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 \
|
||||
|| sudo -u postgres psql -c "ALTER USER \"${u}\" WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 \
|
||||
pg_cmd -c "CREATE USER \"${u}\" WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 \
|
||||
|| pg_cmd -c "ALTER USER \"${u}\" WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 \
|
||||
|| true
|
||||
sudo -u postgres psql -c "ALTER USER \"${u}\" WITH SUPERUSER CREATEDB;" >/dev/null 2>&1 || true
|
||||
pg_cmd -c "ALTER USER \"${u}\" WITH SUPERUSER CREATEDB;" >/dev/null 2>&1 || true
|
||||
fi
|
||||
done
|
||||
|
||||
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 || true
|
||||
sudo -u postgres psql -c "ALTER USER postgres WITH SUPERUSER CREATEDB;" >/dev/null 2>&1 || true
|
||||
pg_cmd -c "ALTER USER postgres WITH PASSWORD '${DB_PASSWORD}';" >/dev/null 2>&1 || true
|
||||
pg_cmd -c "ALTER USER postgres WITH SUPERUSER CREATEDB;" >/dev/null 2>&1 || true
|
||||
|
||||
# Crear base de datos
|
||||
sudo -u postgres psql -c "CREATE DATABASE \"${DB_NAME}\" OWNER postgres;" >/dev/null 2>&1 \
|
||||
pg_cmd -c "CREATE DATABASE \"${DB_NAME}\" OWNER postgres;" >/dev/null 2>&1 \
|
||||
|| info "La base de datos '${DB_NAME}' ya existía."
|
||||
|
||||
for u in "${DB_USER}" "${DB_USERNAME:-}" postgres eduspace_user; do
|
||||
if [[ -n "$u" ]]; then
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"${DB_NAME}\" TO \"${u}\";" >/dev/null 2>&1 || true
|
||||
sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL ON SCHEMA public TO \"${u}\";" >/dev/null 2>&1 || true
|
||||
pg_cmd -c "GRANT ALL PRIVILEGES ON DATABASE \"${DB_NAME}\" TO \"${u}\";" >/dev/null 2>&1 || true
|
||||
pg_cmd -d "${DB_NAME}" -c "GRANT ALL ON SCHEMA public TO \"${u}\";" >/dev/null 2>&1 || true
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -291,11 +304,11 @@ if [[ -f "$SQL_BACKUP_FILE" ]]; then
|
||||
info "Restaurando volcado integral de aulas, comisiones, materias, reservas y usuarios..."
|
||||
|
||||
# Recrear base de datos limpia para carga sin colisiones
|
||||
sudo -u postgres psql -c "DROP DATABASE IF EXISTS \"${DB_NAME}\";" > /dev/null 2>&1 || true
|
||||
sudo -u postgres psql -c "CREATE DATABASE \"${DB_NAME}\" OWNER postgres;" > /dev/null 2>&1
|
||||
pg_cmd -c "DROP DATABASE IF EXISTS \"${DB_NAME}\";" > /dev/null 2>&1 || true
|
||||
pg_cmd -c "CREATE DATABASE \"${DB_NAME}\" OWNER postgres;" > /dev/null 2>&1
|
||||
|
||||
# Restaurar backup filtrando directivas específicas de PG18 si existiesen
|
||||
if sed '/^\\restrict/d' "$SQL_BACKUP_FILE" | sudo -u postgres psql -d "${DB_NAME}" > /dev/null 2>&1; then
|
||||
if sed '/^\\restrict/d' "$SQL_BACKUP_FILE" | pg_cmd -d "${DB_NAME}" > /dev/null 2>&1; then
|
||||
ok "Volcado SQL restaurado exitosamente."
|
||||
else
|
||||
warn "Restauración completada con avisos menores — aplicando permisos..."
|
||||
@@ -305,19 +318,19 @@ if [[ -f "$SQL_BACKUP_FILE" ]]; then
|
||||
info "Garantizando permisos y secuencias para ${DB_USER}..."
|
||||
for u in "${DB_USER}" "${DB_USERNAME:-}" postgres eduspace_user; do
|
||||
if [[ -n "$u" ]]; then
|
||||
sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON DATABASE \"${DB_NAME}\" TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL ON SCHEMA public TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
sudo -u postgres psql -d "${DB_NAME}" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
sudo -u postgres psql -d "${DB_NAME}" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
sudo -u postgres psql -d "${DB_NAME}" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON FUNCTIONS TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
pg_cmd -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON DATABASE \"${DB_NAME}\" TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
pg_cmd -d "${DB_NAME}" -c "GRANT ALL ON SCHEMA public TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
pg_cmd -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
pg_cmd -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
pg_cmd -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
pg_cmd -d "${DB_NAME}" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
pg_cmd -d "${DB_NAME}" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
pg_cmd -d "${DB_NAME}" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON FUNCTIONS TO \"${u}\";" > /dev/null 2>&1 || true
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "${DB_USER}" != "postgres" ]]; then
|
||||
sudo -u postgres psql -d "${DB_NAME}" -c "ALTER SCHEMA public OWNER TO \"${DB_USER}\";" > /dev/null 2>&1 || true
|
||||
pg_cmd -d "${DB_NAME}" -c "ALTER SCHEMA public OWNER TO \"${DB_USER}\";" > /dev/null 2>&1 || true
|
||||
fi
|
||||
|
||||
# Ejecutar init_db.py de forma idempotente para verificar roles y migraciones incrementales
|
||||
|
||||
Reference in New Issue
Block a user