# Script creazione database cliente PostgreSQL Questo script Bash automatizza la creazione di un nuovo database PostgreSQL per un cliente, comprensivo di: - **Tablespace dedicata** con nome cliente in MAIUSCOLO - **Utente PostgreSQL** dedicato con nome cliente in minuscolo - **Database** con prefisso di prodotto (es. `hr_nomecliente`) - **Permessi e privilegi** configurati in modo coerente con gli ambienti Zucchetti - **Registrazione credenziali** e parametri di connessione nel file `/root/db.list` --- ## Requisiti - Sistema Linux con: - Bash - PostgreSQL 16 installato e funzionante - Comando `psql` disponibile nel `PATH` - Cluster PostgreSQL che accetta connessioni: - host: `localhost` - utente: `postgres` - password: `postgres` (modificabile nello script se necessario) - Locale `it_IT.UTF-8` installato sul sistema (usato per `LC_COLLATE` e `LC_CTYPE`) - Directory delle tablespace disponibile: - `/zucchetti/infinity/PostgreSQL/16/data/` - Lo script **deve essere eseguito come root** (per poter gestire `chown`/`chmod` sulla directory della tablespace e scrivere in `/root/db.list`). --- ## Cosa fa lo script Per ogni esecuzione, lo script: 1. **Chiede il nome del cliente** - Esempio input: `VillaMafalda` - Internamente: - `CLIENT_UPPER` → `VILLAMAFALDA` (per tablespace e directory) - `CLIENT_LOWER` → `villamafalda` (per utente database) 2. **Chiede il prodotto** per cui si installa il database: - Opzioni: - `AGO` - `HR` - `AHRW` - `AHI` - `ERP` - `ALTRO` (prefisso personalizzato) - Il prodotto viene usato come **prefisso del database** (in minuscolo). Esempi: - Prodotto `HR`, cliente `VillaMafalda` → database `hr_villamafalda` - Prodotto `ALTRO` con prefisso `crm`, cliente `Acme` → database `crm_acme` 3. **Chiede una password** per l’utente: - Se inserita → viene usata così com’è (tranne apice `'` che non è ammesso). - Se lasciata vuota → viene **generata automaticamente**: - 16 caratteri alfanumerici `[A-Za-z0-9]` - nessun carattere speciale - In entrambi i casi la password viene mostrata a video e salvata in `/root/db.list`. 4. **Calcola nomi e percorsi**: - Tablespace: - Nome: `VILLAMAFALDA` (sempre MAIUSCOLO) - Directory: `/zucchetti/infinity/PostgreSQL/16/data/VILLAMAFALDA` - Utente DB: - Nome: `villamafalda` (sempre minuscolo) - Database: - Nome: ad es. `hr_villamafalda` 5. **Crea la directory della tablespace** (se non esiste): - `mkdir -p /zucchetti/infinity/PostgreSQL/16/data/VILLAMAFALDA` - `chown postgres:postgres` - `chmod 700` 6. **Si collega a PostgreSQL come utente `postgres`** (password `postgres`) e: - Crea/aggiorna il **ruolo utente** del cliente con: - `LOGIN SUPERUSER CREATEDB CREATEROLE INHERIT BYPASSRLS` - Crea/aggiorna la **tablespace**: - `CREATE TABLESPACE VILLAMAFALDA OWNER villamafalda LOCATION '...'` - Se già esiste → `ALTER TABLESPACE ... OWNER TO villamafalda` - Crea/aggiorna il **database**: - `CREATE DATABASE OWNER TABLESPACE ` - `ENCODING 'UTF8' LC_COLLATE 'it_IT.UTF-8' LC_CTYPE 'it_IT.UTF-8'` - Se già esiste → `ALTER DATABASE ... OWNER TO ` - Imposta i **privilegi**: - `REVOKE ALL ON DATABASE ... FROM utente` - `GRANT ALL PRIVILEGES ON DATABASE ... TO utente` - `REVOKE ALL ON TABLESPACE ... FROM utente` - `GRANT CREATE ON TABLESPACE ... TO utente WITH GRANT OPTION` - In pgAdmin vedrai: - Nel database: privilegi tipo `CTc` per l’utente - Nella tablespace: privilegi tipo `C*` per l’utente, con grantor `postgres` 7. **Aggiorna il file `/root/db.list`** Per ogni nuova creazione aggiunge un blocco con il seguente formato: ```text Cliente: Host: IP: User: Password: Database: Tablespace: