Marco Laterza, amministratore, si e' visto dire "produzione: non entri (normale se non hai il ruolo di rilascio...)" con la chiave gia' sul server: al suo PC mancava la chiave host della macchina nuova, e con BatchMode=yes ssh rifiuta un host sconosciuto senza provare la chiave. configura.sh scrive in ~/.ssh/known_hosts le chiavi di server.known_hosts, lette sulle tre macchine l'08/10/2026, togliendo prima quelle vecchie per gli stessi nomi. verifica.sh legge l'errore di ssh: giallo solo se il server rifiuta la chiave personale, rosso con il rimedio per chiave host mancante o cambiata e per il blocco dopo troppi tentativi. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
121 lines
5.1 KiB
Bash
Executable File
121 lines
5.1 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# DICE VERDE O ROSSO PER OGNI ACCESSO, e per ogni rosso cosa fare.
|
|
#
|
|
# ./verifica.sh
|
|
#
|
|
# Non modifica niente e non chiede niente: si puo' lanciare quando si vuole,
|
|
# anche da Claude. Esce 0 se e' tutto verde, 1 altrimenti.
|
|
|
|
set -u
|
|
cd "$(dirname "$0")" || exit 1
|
|
. ./comune.sh
|
|
|
|
ROSSI=0
|
|
rosso () { male "$@" ; ROSSI=$((ROSSI + 1)) ; }
|
|
|
|
titolo "Programmi"
|
|
for P in git docker aws curl ssh ; do
|
|
if c_e "$P" ; then ok "$P" ; else rosso "$P non installato" ; fi
|
|
done
|
|
if c_e docker ; then
|
|
if docker info > /dev/null 2>&1 ; then ok "Docker risponde"
|
|
else rosso "Docker installato ma non risponde (e' acceso? il tuo utente e' nel gruppo docker?)" ; fi
|
|
fi
|
|
if c_e claude ; then ok "Claude Code" ; else attento "Claude Code non installato (non obbligatorio, ma ti guida)" ; fi
|
|
|
|
titolo "AWS"
|
|
# Chi e' la persona lo dice Gitea: una chiave AWS di un altro sul PC vuol dire
|
|
# che tutto quello che fa su AWS risulta fatto da lui.
|
|
UTENTE="$(utente_gitea)"
|
|
if c_e aws && IDENTITA="$(aws sts get-caller-identity --query Arn --output text 2> /dev/null)" ; then
|
|
if [ -n "$UTENTE" ] && [ "${IDENTITA##*/}" != "$UTENTE" ] ; then
|
|
rosso "la chiave AWS di questo PC e' di ${IDENTITA##*/}, non tua ($UTENTE): rilancia ./configura.sh, che la sostituisce"
|
|
else
|
|
ok "accesso: ${IDENTITA##*/}"
|
|
fi
|
|
if aws ssm get-parameter --region "$AWS_REGIONE" --name "$SSM_PROVA" --query Parameter.Name --output text > /dev/null 2>&1 ; then
|
|
ok "legge i segreti comuni su SSM"
|
|
else
|
|
rosso "non legge SSM: all'amministratore serve darti il ruolo di sviluppo"
|
|
fi
|
|
else
|
|
rosso "AWS non configurato: rilancia ./configura.sh, che ti dice dove crearti la chiave nella console ($AWS_CONSOLE)"
|
|
fi
|
|
|
|
titolo "Gitea"
|
|
if [ -n "$UTENTE" ] ; then
|
|
ok "token valido (utente $UTENTE)"
|
|
if grep -q "@$GITEA_HOST" "$HOME/.git-credentials" 2> /dev/null || [ -n "$(git config --global credential.helper)" ] ; then
|
|
ok "git sa come entrare su $GITEA_HOST"
|
|
else
|
|
rosso "git non ha le credenziali di Gitea: rilancia ./configura.sh"
|
|
fi
|
|
else
|
|
rosso "token Gitea mancante o non valido: rilancia ./configura.sh"
|
|
fi
|
|
|
|
titolo "Chiave SSH"
|
|
if [ -f "$CHIAVE_SSH" ] ; then ok "$CHIAVE_SSH" ; else rosso "chiave mancante: rilancia ./configura.sh" ; fi
|
|
|
|
titolo "VPN e server"
|
|
# La VPN si riconosce da una cosa sola: staging, che sta su rete privata,
|
|
# risponde sulla porta SSH. Niente `timeout`: sul Mac non c'e'.
|
|
porta_aperta () {
|
|
bash -c "exec 3<>/dev/tcp/$1/$2" 2> /dev/null & local pid=$!
|
|
( sleep 5 ; kill "$pid" 2> /dev/null ) & local sveglia=$!
|
|
wait "$pid" 2> /dev/null ; local esito=$?
|
|
kill "$sveglia" 2> /dev/null
|
|
return "$esito"
|
|
}
|
|
# Un tentativo, e il motivo se non si entra: "non entri" da solo faceva
|
|
# pensare ai ruoli anche quando mancava la chiave del server su questo PC.
|
|
# Esce 0 se si entra, 1 se e' la chiave tua, 2 se e' altro (scritto in MOTIVO).
|
|
entra () {
|
|
local errore
|
|
errore="$(ssh -o BatchMode=yes -o ConnectTimeout=8 "$1" true 2>&1 > /dev/null)" && return 0
|
|
case "$errore" in
|
|
*"Permission denied"*) return 1 ;;
|
|
*"Host key verification failed"*|*"IDENTIFICATION HAS CHANGED"*)
|
|
MOTIVO="questo PC non ha la chiave giusta del server: rilancia ./configura.sh, che la registra" ;;
|
|
*"Connection closed"*|*"Connection reset"*)
|
|
MOTIVO="il server ha chiuso la connessione: dopo troppi tentativi sbagliati la chiude per qualche minuto, aspetta e rilancia" ;;
|
|
*) MOTIVO="ssh dice: $(printf '%s\n' "$errore" | grep -v '^\*\*' | tail -1)" ;;
|
|
esac
|
|
return 2
|
|
}
|
|
if porta_aperta "$STAGING_HOST" 22 ; then
|
|
ok "VPN attiva (staging raggiungibile)"
|
|
entra "$STAGING_NOME" ; ESITO=$?
|
|
if [ "$ESITO" = "0" ] ; then ok "entri su staging ($STAGING_NOME)"
|
|
elif [ "$ESITO" = "1" ] ; then rosso "staging non accetta la tua chiave: l'amministratore deve ancora aggiungerla"
|
|
else rosso "staging ($STAGING_NOME): $MOTIVO" ; fi
|
|
else
|
|
rosso "staging non raggiungibile: la VPN e' accesa?"
|
|
fi
|
|
# Le produzioni sono due finche' i siti non sono migrati tutti. La nuova sta
|
|
# dietro la stessa VPN di staging. Un tentativo solo per macchina: la nuova
|
|
# chiude le porte per un po' a chi sbaglia il login piu' volte di fila.
|
|
# Solo il rifiuto della chiave dipende dal ruolo: il resto si sistema da qui.
|
|
NON_AUTORIZZATO="il server non accetta la tua chiave (normale se non hai il ruolo di rilascio; se ce l'hai, chiedi a chi amministra di aggiungerla)"
|
|
if porta_aperta "$PRODUZIONE_HOST" 22 ; then
|
|
entra "$PRODUZIONE_NOME" ; ESITO=$?
|
|
if [ "$ESITO" = "0" ] ; then ok "entri in produzione ($PRODUZIONE_NOME)"
|
|
elif [ "$ESITO" = "1" ] ; then attento "produzione ($PRODUZIONE_NOME): $NON_AUTORIZZATO"
|
|
else rosso "produzione ($PRODUZIONE_NOME): $MOTIVO" ; fi
|
|
else
|
|
attento "produzione ($PRODUZIONE_NOME): non raggiungibile (sta dietro la VPN, come staging)"
|
|
fi
|
|
entra "$PRODUZIONE_VECCHIA_NOME" ; ESITO=$?
|
|
if [ "$ESITO" = "0" ] ; then ok "entri nella produzione vecchia ($PRODUZIONE_VECCHIA_NOME)"
|
|
elif [ "$ESITO" = "1" ] ; then attento "produzione vecchia ($PRODUZIONE_VECCHIA_NOME): $NON_AUTORIZZATO"
|
|
else rosso "produzione vecchia ($PRODUZIONE_VECCHIA_NOME): $MOTIVO" ; fi
|
|
|
|
titolo "Risultato"
|
|
if [ "$ROSSI" = "0" ] ; then
|
|
ok "tutto a posto. Prossimo passo: ./progetti.sh"
|
|
exit 0
|
|
fi
|
|
male "$ROSSI cose da sistemare (sopra, in rosso)"
|
|
exit 1
|