- configura.sh e progetti.sh escono 1 se un passo non riesce (scrittura di ~/.ssh/config, chiave SSH, clone, chiave AWS), e lo dicono in rosso; - git: per l'indirizzo di Gitea si usa solo il gestore "store", e un token vecchio rimasto in ~/.git-credentials si sostituisce (prima si aggiungeva solo se mancava: API buona e git clone rotto). verifica.sh chiede a git la credenziale che userebbe davvero, invece di accontentarsi di un gestore qualsiasi; - AWS: la chiave si controlla PRIMA di salvarla, e deve essere l'utente della persona nell'account di OTO (ARN completo, non solo il nome). Senza Gitea il passo si salta e verifica.sh non da' piu' verde a una chiave qualsiasi. Avviso se AWS_PROFILE o AWS_ACCESS_KEY_ID... fanno usare un'altra chiave; - API di Gitea: codice HTTP controllato, "Gitea non risponde" distinto da "token non valido", elenco dei progetti interrotto solo su una pagina vuota vera; token passato a curl da stdin; JSON letto anche con gli spazi; - progetti.sh: nomi confrontati in modo esatto, accetta organizzazione/nome e dice quando un nome corto e' ambiguo; - la chiave ~/.ssh/oto_ed25519 viene collegata anche ai nomi che cercano i deploy dei progetti (oto_staging_ed25519, oto_production_ed25519): su un PC preparato da qui il primo deploy si fermava con "Chiave privata non trovata"; - verifica.sh --senza-vpn, per chi non ha la VPN: staging giallo e non rosso. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
115 lines
4.5 KiB
Bash
Executable File
115 lines
4.5 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"
|
|
CARTELLA_PROGETTI="${CARTELLA_PROGETTI:-$HOME/Work/workspace/oto}"
|
|
|
|
# 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 ; }
|
|
|
|
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'
|
|
}
|