onboard: niente piu' esiti verdi su passi falliti, git e AWS verificati davvero
- 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>
This commit is contained in:
@@ -6,12 +6,17 @@
|
||||
GITEA_URL="https://git.oto-farm.com"
|
||||
GITEA_HOST="git.oto-farm.com"
|
||||
AWS_REGIONE="eu-central-1"
|
||||
AWS_CONSOLE="https://170187898933.signin.aws.amazon.com/console"
|
||||
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
|
||||
@@ -50,11 +55,60 @@ token_gitea () {
|
||||
[ -s "$TOKEN_GITEA_FILE" ] && tr -d '[:space:]' < "$TOKEN_GITEA_FILE"
|
||||
}
|
||||
|
||||
# Stampa il nome utente Gitea del token, o niente se il token non vale.
|
||||
# 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 token
|
||||
token="$(token_gitea)" || return 1
|
||||
[ -n "$token" ] || return 1
|
||||
curl -s --max-time 10 -H "Authorization: token $token" "$GITEA_URL/api/v1/user" \
|
||||
| sed -n 's/.*"login":"\([^"]*\)".*/\1/p'
|
||||
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'
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user