Files
FabioandClaude Opus 5.5 0705b6c0e7 progetti.sh e Claude chiedono dove scaricare, niente piu' ~/Work/workspace/oto
La cartella dei progetti era fissata in comune.sh su ~/Work/workspace/oto,
cioe' la cartella di chi ha scritto gli script, e il CLAUDE.md diceva di
clonare li' anche questo repository. Adesso la sceglie la persona:
progetti.sh la vuole con --in (o CARTELLA_PROGETTI), la chiede se puo' e
altrimenti si ferma; il CLAUDE.md ha la regola di chiederla sempre prima
di scaricare.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 09:48:41 +02:00

122 lines
4.7 KiB
Bash
Executable File

#!/bin/bash
#
# Valori e funzioni condivisi dagli script di questo repository.
# Qui non ci sono segreti: solo nomi di server e percorsi.
GITEA_URL="https://git.oto-farm.com"
GITEA_HOST="git.oto-farm.com"
AWS_REGIONE="eu-central-1"
AWS_ACCOUNT="170187898933"
AWS_CONSOLE="https://$AWS_ACCOUNT.signin.aws.amazon.com/console"
# Dove stanno le cose della persona, sul suo PC. Gli script dei progetti
# leggono da qui: non cambiarli senza cambiare anche loro.
TOKEN_GITEA_FILE="$HOME/.config/oto/gitea.token"
CHIAVE_SSH="$HOME/.ssh/oto_ed25519"
# I nomi con cui la cercano gli script dei progetti (STAGING_SSH_KEY e
# PRODUCTION_SSH_KEY in project.conf.sh): sono la stessa chiave, perche' sui
# server l'amministratore mette quella del profilo Gitea, cioe' questa.
CHIAVI_SSH_PROGETTI="$HOME/.ssh/oto_staging_ed25519 $HOME/.ssh/oto_production_ed25519"
# I server, con i nomi che usano gli script dei progetti. Staging e la
# produzione nuova stanno su rete privata: senza VPN non rispondono. Le
# produzioni sono due finche' i siti non sono migrati tutti: oto-production
# e' la macchina nuova (dal 05/10/2026), oto-production-old quella dove
# girano ancora i siti. Sulla nuova l'utente non e' admin.
STAGING_NOME="oto-staging"
STAGING_HOST="10.110.185.10"
STAGING_UTENTE="admin"
PRODUZIONE_NOME="oto-production"
PRODUZIONE_HOST="10.110.137.20"
PRODUZIONE_UTENTE="admin.produzione"
PRODUZIONE_VECCHIA_NOME="oto-production-old"
PRODUZIONE_VECCHIA_HOST="vps-production.oto-farm.com"
PRODUZIONE_VECCHIA_UTENTE="admin"
# Un parametro che ogni ruolo di sviluppo puo' leggere: serve a verifica.sh
# per sapere se l'accesso AWS arriva davvero alla cassaforte.
SSM_PROVA="/oto/_comune/MAILTRAP_SMTP_USER"
if [ -t 1 ] ; then
VERDE=$'\e[32m' ; ROSSO=$'\e[31m' ; GIALLO=$'\e[33m' ; GRASSETTO=$'\e[1m' ; FINE=$'\e[0m'
else
VERDE="" ; ROSSO="" ; GIALLO="" ; GRASSETTO="" ; FINE=""
fi
ok () { echo " ${VERDE}✔${FINE} $*" ; }
male () { echo " ${ROSSO}✘${FINE} $*" ; }
attento () { echo " ${GIALLO}!${FINE} $*" ; }
titolo () { echo ; echo "${GRASSETTO}$*${FINE}" ; }
c_e () { command -v "$1" > /dev/null 2>&1 ; }
# Su Mac Homebrew non si mette da solo nel PATH: senza, git e aws installati
# con brew sembrano mancare anche se ci sono.
if ! c_e brew ; then
for B in /opt/homebrew/bin/brew /usr/local/bin/brew ; do
[ -x "$B" ] && eval "$("$B" shellenv)" && break
done
fi
token_gitea () {
[ -s "$TOKEN_GITEA_FILE" ] && tr -d '[:space:]' < "$TOKEN_GITEA_FILE"
}
# Una chiamata all'API di Gitea col token salvato: il token passa a curl da
# stdin, non dalla riga di comando (che sul PC si vede con ps). Scrive il corpo
# della risposta e, sull'ultima riga, il codice HTTP (000 se Gitea non ha
# risposto). Gli argomenti in piu' vanno a curl (-X POST, -d ...).
api_gitea () {
local percorso="$1" ; shift
printf 'header = "Authorization: token %s"\n' "$(token_gitea)" \
| curl -s --max-time 15 -K - -w '\n%{http_code}' "$@" "$GITEA_URL/api/v1$percorso"
}
# Il valore di un campo testo da un JSON di Gitea, anche con gli spazi dopo i
# due punti. Basta per i campi che servono qui; un parser vero vorrebbe jq, che
# su Windows non c'e'.
campo_json () {
sed -n "s/.*\"$1\"[[:space:]]*:[[:space:]]*\"\([^\"]*\)\".*/\1/p" | head -n 1
}
# Stampa il nome utente Gitea del token. Esce 1 se il token manca o Gitea lo
# rifiuta, 2 se Gitea non risponde: "non vale" e "non so" sono due cose
# diverse, e la seconda non deve far chiedere di nuovo la password.
utente_gitea () {
local risposta codice
[ -n "$(token_gitea)" ] || return 1
risposta="$(api_gitea /user)"
codice="${risposta##*$'\n'}"
case "$codice" in
200) printf '%s' "${risposta%$'\n'*}" | campo_json login ;;
401|403) return 1 ;;
*) return 2 ;;
esac
}
# Controlla che l'identita' AWS (un ARN) sia l'utente IAM della persona
# nell'account di OTO, e non solo un utente con lo stesso nome altrove.
aws_e_di () {
[ "$1" = "arn:aws:iam::$AWS_ACCOUNT:user/$2" ]
}
# Le variabili che fanno usare alla AWS CLI un'altra chiave invece di quella
# scritta in ~/.aws/credentials: le stampa, senza i valori.
aws_variabili_in_conflitto () {
local v
for v in AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_PROFILE AWS_SHARED_CREDENTIALS_FILE ; do
[ -n "${!v:-}" ] && printf '%s ' "$v"
done
}
# La credenziale che git usa davvero per Gitea, chiesta a git e non letta da
# un file: e' quella che serve per clone e pull, qualunque gestore la tenga.
# Senza nessuna domanda: nel terminale di VS Code GIT_ASKPASS aprirebbe una
# finestra di login.
password_git_gitea () {
printf 'protocol=https\nhost=%s\n\n' "$GITEA_HOST" \
| env -u GIT_ASKPASS -u SSH_ASKPASS GIT_TERMINAL_PROMPT=0 GCM_INTERACTIVE=never \
git -c credential.interactive=never credential fill 2> /dev/null \
| sed -n 's/^password=//p'
}