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:
+50
-19
@@ -8,25 +8,38 @@
|
||||
# Li mette in $CARTELLA_PROGETTI (di solito ~/Work/workspace/oto). Un progetto
|
||||
# gia' scaricato non si tocca. Vedi solo i repository che l'amministratore ti
|
||||
# ha dato: se ne manca uno, e' da chiedere a lui.
|
||||
# Esce 1 se un progetto chiesto non e' stato scaricato.
|
||||
|
||||
set -u
|
||||
cd "$(dirname "$0")" || exit 1
|
||||
. ./comune.sh
|
||||
|
||||
TOKEN="$(token_gitea)"
|
||||
if [ -z "$TOKEN" ] || [ -z "$(utente_gitea)" ] ; then
|
||||
male "token Gitea mancante o non valido: lancia prima ./configura.sh"
|
||||
if [ -z "$(token_gitea)" ] ; then
|
||||
male "token Gitea mancante: lancia prima ./configura.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Tutti i repository visibili, pagina per pagina.
|
||||
# Tutti i repository visibili, pagina per pagina. Ci si ferma solo su una
|
||||
# pagina vuota vera ("[]"): un errore di Gitea a meta' non deve diventare
|
||||
# "non vedi nessun progetto", ne' un elenco tagliato senza dirlo.
|
||||
ELENCO=""
|
||||
PAGINA=1
|
||||
while : ; do
|
||||
BLOCCO="$(curl -s --max-time 15 -H "Authorization: token $TOKEN" \
|
||||
"$GITEA_URL/api/v1/user/repos?limit=50&page=$PAGINA" \
|
||||
| grep -o '"full_name":"[^"]*"' | sed 's/"full_name":"\(.*\)"/\1/')"
|
||||
[ -z "$BLOCCO" ] && break
|
||||
RISPOSTA="$(api_gitea "/user/repos?limit=50&page=$PAGINA")"
|
||||
CODICE="${RISPOSTA##*$'\n'}"
|
||||
CORPO="${RISPOSTA%$'\n'*}"
|
||||
case "$CODICE" in
|
||||
200) ;;
|
||||
401|403) male "Gitea non accetta il tuo token: rilancia ./configura.sh" ; exit 1 ;;
|
||||
000) male "Gitea ($GITEA_URL) non risponde: controlla la connessione e rilancia" ; exit 1 ;;
|
||||
*) male "Gitea ha risposto HTTP $CODICE alla pagina $PAGINA dell'elenco: rilancia, e se si ripete avvisa l'amministratore" ; exit 1 ;;
|
||||
esac
|
||||
[ "$(printf '%s' "$CORPO" | tr -d '[:space:]')" = "[]" ] && break
|
||||
BLOCCO="$(printf '%s' "$CORPO" | grep -o '"full_name"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"\([^"]*\)"$/\1/')"
|
||||
if [ -z "$BLOCCO" ] ; then
|
||||
male "non capisco la risposta di Gitea alla pagina $PAGINA dell'elenco: avvisa l'amministratore"
|
||||
exit 1
|
||||
fi
|
||||
ELENCO="$ELENCO
|
||||
$BLOCCO"
|
||||
PAGINA=$((PAGINA + 1))
|
||||
@@ -38,46 +51,64 @@ if [ -z "$ELENCO" ] ; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# I nomi si scelgono corti (apulia_ecommerce) o completi (oto/apulia_ecommerce).
|
||||
# Si tiene il nome completo: lo stesso nome corto in due organizzazioni e'
|
||||
# ambiguo, e lo si dice invece di prendere il primo.
|
||||
if [ "$#" -gt 0 ] ; then
|
||||
SCELTI="$*"
|
||||
else
|
||||
titolo "Progetti che puoi scaricare"
|
||||
printf '%s\n' "$ELENCO" | sed 's#.*/##' | nl -w3 -s'. '
|
||||
printf '%s\n' "$ELENCO" | nl -w3 -s'. '
|
||||
echo
|
||||
read -r -p "Numeri o nomi, separati da spazio (invio = nessuno, 'tutti' = tutti): " RISPOSTA
|
||||
[ -z "$RISPOSTA" ] && exit 0
|
||||
if [ "$RISPOSTA" = "tutti" ] ; then
|
||||
SCELTI="$(printf '%s\n' "$ELENCO" | sed 's#.*/##')"
|
||||
SCELTI="$ELENCO"
|
||||
else
|
||||
SCELTI=""
|
||||
for R in $RISPOSTA ; do
|
||||
case "$R" in
|
||||
*[!0-9]*) SCELTI="$SCELTI $R" ;;
|
||||
*) SCELTI="$SCELTI $(printf '%s\n' "$ELENCO" | sed -n "${R}p" | sed 's#.*/##')" ;;
|
||||
*) SCELTI="$SCELTI $(printf '%s\n' "$ELENCO" | sed -n "${R}p")" ;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
ERRORI=0
|
||||
mkdir -p "$CARTELLA_PROGETTI"
|
||||
titolo "Scarico in $CARTELLA_PROGETTI"
|
||||
for NOME in $SCELTI ; do
|
||||
COMPLETO="$(printf '%s\n' "$ELENCO" | grep -E "/$NOME\$" | head -n 1)"
|
||||
if [ -z "$COMPLETO" ] ; then
|
||||
male "$NOME: non lo vedi su Gitea"
|
||||
# Confronto esatto, non una regex: il nome lo scrive la persona.
|
||||
COMPLETI="$(printf '%s\n' "$ELENCO" | awk -v n="$NOME" '$0 == n || substr($0, index($0, "/") + 1) == n')"
|
||||
if [ -z "$COMPLETI" ] ; then
|
||||
male "$NOME: non lo vedi su Gitea (se ti serve, chiedilo all'amministratore)"
|
||||
ERRORI=$((ERRORI + 1))
|
||||
continue
|
||||
fi
|
||||
if [ -d "$CARTELLA_PROGETTI/$NOME/.git" ] ; then
|
||||
ok "$NOME: gia' scaricato"
|
||||
if [ "$(printf '%s\n' "$COMPLETI" | wc -l)" -gt 1 ] ; then
|
||||
male "$NOME: c'e' in piu' di un'organizzazione ($(printf '%s ' $COMPLETI)): scrivi il nome completo"
|
||||
ERRORI=$((ERRORI + 1))
|
||||
continue
|
||||
fi
|
||||
if git clone -q "$GITEA_URL/$COMPLETO.git" "$CARTELLA_PROGETTI/$NOME" ; then
|
||||
ok "$NOME"
|
||||
CORTO="${COMPLETI#*/}"
|
||||
if [ -d "$CARTELLA_PROGETTI/$CORTO/.git" ] ; then
|
||||
ok "$CORTO: gia' scaricato"
|
||||
continue
|
||||
fi
|
||||
if git clone -q "$GITEA_URL/$COMPLETI.git" "$CARTELLA_PROGETTI/$CORTO" ; then
|
||||
ok "$CORTO"
|
||||
else
|
||||
male "$NOME: git clone non riuscito"
|
||||
male "$CORTO: git clone non riuscito (il messaggio di git e' qui sopra)"
|
||||
ERRORI=$((ERRORI + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
if [ "$ERRORI" != "0" ] ; then
|
||||
if [ "$ERRORI" = "1" ] ; then male "un progetto non scaricato (sopra, in rosso)"
|
||||
else male "$ERRORI progetti non scaricati (sopra, in rosso)" ; fi
|
||||
exit 1
|
||||
fi
|
||||
echo " In ogni progetto: ./start.sh (progetti con pannello) oppure bin/local-init.sh"
|
||||
echo " (Drupal e WordPress). Apri claude nella cartella del progetto: ti spiega il resto."
|
||||
|
||||
Reference in New Issue
Block a user