From 6218657f366ac83784c0bce010cc88bb0c140523 Mon Sep 17 00:00:00 2001 From: Carlos Tello Date: Fri, 4 Sep 2026 23:56:37 -0300 Subject: [PATCH] fix(lxc): instalar sudo e implementar helper pg_cmd universal (sudo/runuser/su) para PostgreSQL --- backup_db.sh | 9 +++++++-- install.sh | 57 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/backup_db.sh b/backup_db.sh index 461d486..2d7999e 100644 --- a/backup_db.sh +++ b/backup_db.sh @@ -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..." - sudo -u postgres pg_dump -d "$DB_NAME" --no-owner --no-privileges > "$BACKUP_FILE" + 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." diff --git a/install.sh b/install.sh index 1bfb3c4..6d1d55d 100644 --- a/install.sh +++ b/install.sh @@ -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