Add-Database-PSQL/add_database_psql16.sh

188 lines
5.8 KiB
Bash

#!/bin/bash
# Autor: Mattia Tadini
# File: add_database_psql16.sh
# Version: 1.00
# Date 14/11/2025
set -e
set -o pipefail
LC_ALL=C
echo "=== Creazione database cliente PostgreSQL ==="
# === Controllo privilegi ===
if [[ "$EUID" -ne 0 ]]; then
echo "Devi eseguire questo script come root (per poter fare chown/chmod sulla tablespace)."
exit 1
fi
# === Input nome cliente ===
read -rp "Inserisci il nome del cliente (es. ACME): " CLIENT_RAW
# Rimpiazzo spazi con underscore
CLIENT_RAW=${CLIENT_RAW// /_}
if [[ -z "$CLIENT_RAW" ]]; then
echo "Nome cliente non valido."
exit 1
fi
# Maiuscolo/minuscolo
CLIENT_UPPER=${CLIENT_RAW^^}
CLIENT_LOWER=${CLIENT_RAW,,}
# === Scelta prodotto / prefisso database ===
echo "Seleziona il prodotto per cui si installa il database:"
echo " - AGO"
echo " - HR"
echo " - AHRW"
echo " - ERP"
echo " - AHI"
echo " - ALTRO (prefisso personalizzato)"
read -rp "Prodotto (AGO/HR/AHRW/ERP/ALTRO): " PROD_RAW
PROD_RAW=${PROD_RAW^^}
DB_PREFIX=""
case "$PROD_RAW" in
AGO|HR|AHRW|ERP)
DB_PREFIX=${PROD_RAW,,}
;;
ALTRO)
read -rp "Inserisci il prefisso desiderato per il database (es. crm, test): " CUSTOM_PREFIX
CUSTOM_PREFIX=${CUSTOM_PREFIX// /_}
if [[ -z "$CUSTOM_PREFIX" ]]; then
echo "Prefisso non valido."
exit 1
fi
DB_PREFIX=${CUSTOM_PREFIX,,}
;;
*)
echo "Prodotto non valido. Usa AGO, HR, AHRW, ERP o ALTRO."
exit 1
;;
esac
# === Input password (opzionale) ===
read -rsp "Inserisci la password per l'utente (lascia vuoto per generarla automaticamente): " CLIENT_PWD
echo
if [[ -z "${CLIENT_PWD}" ]]; then
# Genera password randomica 16 caratteri [A-Za-z0-9]
CLIENT_PWD=$(tr -dc 'A-Za-z0-9' </dev/urandom | head -c 16 || true)
if [[ -z "$CLIENT_PWD" ]]; then
echo "Errore nella generazione della password random."
exit 1
fi
echo "Password generata automaticamente: ${CLIENT_PWD}"
fi
# Niente apici singoli
if [[ "$CLIENT_PWD" == *"'"* ]]; then
echo "La password non può contenere l'apice singolo (')."
exit 1
fi
# === Nomi e path in base al cliente/prodotto ===
TS_NAME="${CLIENT_UPPER}" # tablespace in MAIUSCOLO
TS_DIR="/zucchetti/infinity/PostgreSQL/16/data/${CLIENT_UPPER}" # directory tablespace
DB_USER="${CLIENT_LOWER}" # utente in minuscolo
DB_NAME="${DB_PREFIX}_${CLIENT_LOWER}" # es: hr_villamafalda
echo
echo ">>> Configurazione:"
echo " Nome cliente : ${CLIENT_UPPER}"
echo " Tablespace name : ${TS_NAME}"
echo " Tablespace dir : ${TS_DIR}"
echo " Database : ${DB_NAME}"
echo " Utente : ${DB_USER}"
echo " Prodotto : ${DB_PREFIX}"
echo
# === Creazione directory tablespace con permessi richiesti ===
echo ">>> Creo la directory della tablespace..."
mkdir -p "${TS_DIR}"
chown postgres:postgres "${TS_DIR}"
chmod 700 "${TS_DIR}"
# === Connessione a Postgres come utente postgres / password postgres ===
export PGPASSWORD='postgres'
PSQL_BASE="psql -h localhost -U postgres -d postgres -v ON_ERROR_STOP=1"
echo ">>> Verifico/creo ROLE utente con privilegi (superuser, createdb, createrole, inherit, bypassrls)..."
ROLE_EXISTS=$($PSQL_BASE -tAc "SELECT 1 FROM pg_roles WHERE rolname='${DB_USER}'" || true)
if [[ -z "$ROLE_EXISTS" ]]; then
$PSQL_BASE -c "CREATE ROLE ${DB_USER}
WITH LOGIN SUPERUSER CREATEDB CREATEROLE INHERIT BYPASSRLS PASSWORD '${CLIENT_PWD}';"
else
echo "Ruolo ${DB_USER} già esistente, aggiorno privilegi e password..."
$PSQL_BASE -c "ALTER ROLE ${DB_USER}
WITH LOGIN SUPERUSER CREATEDB CREATEROLE INHERIT BYPASSRLS PASSWORD '${CLIENT_PWD}';"
fi
echo ">>> Verifico/creo TABLESPACE (owner = utente cliente)..."
TS_EXISTS=$($PSQL_BASE -tAc "SELECT 1 FROM pg_tablespace WHERE spcname='${TS_NAME}'" || true)
if [[ -z "$TS_EXISTS" ]]; then
$PSQL_BASE -c "CREATE TABLESPACE ${TS_NAME} OWNER ${DB_USER} LOCATION '${TS_DIR}';"
else
echo "Tablespace ${TS_NAME} già esistente, imposto owner = ${DB_USER}..."
$PSQL_BASE -c "ALTER TABLESPACE ${TS_NAME} OWNER TO ${DB_USER};"
fi
echo ">>> Verifico/creo DATABASE..."
DB_EXISTS=$($PSQL_BASE -tAc "SELECT 1 FROM pg_database WHERE datname='${DB_NAME}'" || true)
if [[ -z "$DB_EXISTS" ]]; then
$PSQL_BASE -c "CREATE DATABASE ${DB_NAME}
OWNER ${DB_USER}
TABLESPACE ${TS_NAME}
ENCODING 'UTF8'
LC_COLLATE 'it_IT.UTF-8'
LC_CTYPE 'it_IT.UTF-8'
TEMPLATE template0;"
else
echo "Database ${DB_NAME} già esistente, cambio owner se necessario..."
$PSQL_BASE -c "ALTER DATABASE ${DB_NAME} OWNER TO ${DB_USER};"
fi
echo ">>> Sistemo privilegi sul database (grantor = postgres)..."
$PSQL_BASE -c "REVOKE ALL ON DATABASE ${DB_NAME} FROM ${DB_USER};"
$PSQL_BASE -c "GRANT ALL PRIVILEGES ON DATABASE ${DB_NAME} TO ${DB_USER};"
echo ">>> Sistemo privilegi sulla tablespace (grantor = postgres)..."
$PSQL_BASE -c "REVOKE ALL ON TABLESPACE ${TS_NAME} FROM ${DB_USER};"
$PSQL_BASE -c "GRANT CREATE ON TABLESPACE ${TS_NAME} TO ${DB_USER} WITH GRANT OPTION;"
# === Aggiornamento /root/db.list ===
echo ">>> Aggiorno /root/db.list..."
HOSTNAME_FQDN=$(hostname -f 2>/dev/null || hostname)
SERVER_IP=$(hostname -I 2>/dev/null | awk '{print $1}')
if [[ -z "$SERVER_IP" ]]; then
SERVER_IP=$(ip -4 addr show scope global 2>/dev/null | awk '/inet /{print $2}' | cut -d/ -f1 | head -n1)
fi
DB_LIST_FILE="/root/db.list"
{
echo "Host: ${HOSTNAME_FQDN}"
echo "IP: ${SERVER_IP}"
echo "User: ${DB_USER}"
echo "Password: ${CLIENT_PWD}"
echo "Database: ${DB_NAME}"
echo "Tablespace: ${TS_DIR}"
echo
echo
} >> "$DB_LIST_FILE"
echo
echo ">>> Operazione completata per il cliente ${CLIENT_UPPER}."
echo
echo "Credenziali di accesso al database:"
echo " Database : ${DB_NAME}"
echo " Utente : ${DB_USER}"
echo " Password : ${CLIENT_PWD}"
echo
echo "Tablespace : ${TS_NAME}"
echo "Directory : ${TS_DIR}"
echo
echo "Blocco aggiunto a /root/db.list"