Criar Script para testar saída do APT-GET e caso erro ignora instalação de pacotes e seguir a execuç

1. Criar Script para testar saída do APT-GET e caso erro ignora instalação de pacotes e seguir a execuç

Thiago Boeira
tcboeira

(usa Debian)

Enviado em 16/03/2020 - 18:04h

Boa Tarde!
Bem, depois de passar uns dias pesquisando e testando, venho pedir ajudar e compartilhar minha situação.

Já algum tempo, automatizamos a conclusão de instalação e adição do Ubuntu em nossa rede. Tudo funciona perfeitamente sem falhas e erros.
Agora, já prevendo o 20.04, estou tentando incrementar mais ainda.

Em algum momento da execução do Script principal, ele faz uma atualização (sudo apt-get update) verificação e chama uma tela - via Zenity - para instalação de alguns Apps. Alguns vem via repositórios, outros baixamos arquivos de nosso FIleserver.

Bem, no que toca a questão via repositórios, notei que as vezes há um erro no apt-get, mas que caso fosse executado novamente funciona bem. Como não era previsto antes, quero garantir que ele faça isso perfeitamente. Caso a falha persista, ele pule a parte que chama a tela de instalação de pacotes.

Então: Meu objetivo é criar Script para testar saída do APT-GET. Caso haja erro, o mesmo faz uma nova tentativa. Persistindo o erro, ele ignora a instalação de pacotes e seguir a execução do Script no próximo passo.

Por isso peço mais uma vez, ajuda nessa missão!

Bem, abaixo esta meu Script. Sendo sincero, ele esta meio bagunçado pois testei muitas alternativas e acabou ficando assim.

#!/bin/bash

LOG="${0##*/}".log
exec 1> >(tee -a $LOG)
exec 2>&1

UPDATE_PC () {
sudo rm -r UP.log
sudo rm -r FAILUP
sudo rm -r testaupdate.inst.log
FAIL=

sudo apt-get update > UP.log | zenity --progress --auto-close --width 350 --pulsate --text "Realizando atualização de conteúdo de repositórios.\n Aguarde \n" --title "Ubuntu PROCERGS 20.04" --auto-close
cat UP.log | grep "Falha temporária" > FAILUP
FAIL=$(grep -c ".*" FAILUP)
}

UPDATE_PC

while :; do
if [ "$FAIL" == "0" ]; then
echo "OK"
break
else
clear
echo "erro de conteudo"
echo "repetindo o teste"
echo ""
for i in $(seq 3); do
UPDATE_PC
done
echo "NÃO FUNCIONA"
break
fi
done


  


2. Re: Criar Script para testar saída do APT-GET e caso erro ignora instalação de pacotes e seguir a ex

Rogerio
RogerDez

(usa Outra)

Enviado em 16/03/2020 - 19:30h

#!/bin/bash

LOG="${0##*/}".log
exec 1> >(tee -a $LOG)
exec 2>&1

UPDATE_PC () {
#sleep 1

sudo rm -r UP.log FAILUP testaupdate.inst.log

zenity --progress --auto-close --width 350 --pulsate --text "Realizando atualização de conteúdo de repositórios.\n Aguarde \n" --title "Ubuntu PROCERGS 20.04" --auto-close

sudo apt-get update 2>&1 | grep -q 'Falha temporária' && return 1 || return 0
}

for ((tentativa=0;tentativa<3;tentativa++)); do
if UPDATE_PC; then
echo "OK "
break
else
printf 'erro de conteudo, tentativa %s \r' "$((tentativa+1))" 1>&2
sleep 1
false
fi
done || echo "NÃO FUNCIONA " 1>&2


Faça um teste com o grep mesmo e use mais os sinais de saída dos comandos..

Acho que tem caixas de diálogo demais aí. Se você executou o comando, deve saber do que se trata, não precisa imprimir dizendo que o programa está sendo executado. Só precisa imprimir mensagem caso haja algum ERRO.

De forma que poderia ser algo mais simples do tipo:
UPDATE_PC || UPDATE_PC || UPDATE_PC || echo 'erro fazendo updates' 1>&2 


O '\r' vai dar uma impressão de sobrescrever a última linha caso haja mais erros. Precisa dos espaços em branco para sobrescrever textos longos antigos..

obs: me bati um pouco no teste com grep mas agora talkey! Se houver 'Falha temporária' sai com return 1, do contrário com return 0


3. Re: Criar Script para testar saída do APT-GET e caso erro ignora instalação de pacotes e seguir a execuç

Thiago Boeira
tcboeira

(usa Debian)

Enviado em 17/03/2020 - 14:48h

Então Roger ... Muito Obrigado pela luz...
Na verdade existe "varias" janelas, pq justamente não sou eu que executo. Isso faz parte de uma serie de processos que implementa maquinas no domínio da empresa.
Como são terceiros que fazem isso, e o time de forma geral não tem conhecimento profundo de Linux, resolvemos "scriptar" tudo... A evolução da necessidade nos trouxe até este momento.

Bem, diretamente, a ideia que eu tinha era que em algum momento da instalação, ele abra uma tela para selecionar alguns simples apps - pois a instalação padrão é minima - e depois seguir todo o resto do processo. Ocorreu que notei que por vezes, o "apt-get update" dava um erro, e mesmo que selecionasse a tela de instalação de apps, isso não ocorria pq havia erro no apt.

O desejo era que ele fizesse o apt-get e caso ocorresse erro, repetisse o teste. Geralmente isso resolve e assim sendo, abrisse a tela de seleção de pacotes. Porém, me deu uma ideia que caso o erro persistisse, não deveria abrir esta tela. Ele deveria seguir para o passo seguinte. Essa persistência deveria ter um máximo de vezes pq o processo - de inclusão de maquina no domínio + usuário de rede como Administrador local - deve ter um fim.

Em resumo... Usei tua ideia e acho que cheguei mais perto do que eu desejava... Perto não é o desejado hehehehe mas estamos quase lá.... Ficou assim - ainda bagunçado - mas compartilho para verem e sugerir melhoras....


#!/bin/bash

LOG="${0##*/}".log
exec 1> >(tee -a $LOG)
exec 2>&1

UPDATE_PC () {
sudo rm -r UP.log
sudo rm -r FAILUP
sudo rm -r testaupdate.inst.log
FAIL=

sudo apt-get update | zenity --progress --auto-close --width 350 --pulsate --text "Realizando atualização de conteúdo de repositórios.\nAguarde \n" --title "Ubuntu EMPRESA 20.04" --auto-close
sudo apt-get update > UP.log

cat UP.log | grep "Falha temporária" > FAILUP
FAIL=$(grep -c ".*" FAILUP)
}

UPDATE_PC

while :; do
if [ "$FAIL" == "0" ]; then
sleep 4 | zenity --progress --auto-close --width 350 --pulsate --text "Carregado com sucesso.\nAguarde \n" --title "Ubuntu EMPRESA 20.04" --auto-close
break
else
sleep 4 | zenity --progress --auto-close --width 350 --pulsate --text "Erro ao carregar conteúdo.\nNova tentativa...\nAguarde \n" --title "Ubuntu EMPRESA 20.04" --auto-close
for i in $(seq 3); do
UPDATE_PC
if [ "$FAIL" == "0" ]; then
sleep 4 | zenity --progress --auto-close --width 350 --pulsate --text "Carregado com sucesso.\nAguarde \n" --title "Ubuntu EMPRESA 20.04" --auto-close
echo "carregou belezinha"
break
else
zenity --question --width=250 --height=150 --title="Instalado Ubuntu EMPRESA 20.04" --text="Erro persistente. Se necessario, contatar: \[email protected] \n \n \nProssiga!"
case $? in
0) #SIM
echo "VC escolheu REPETIR"
UPDATE_PC
;;
1) #NÃO
echo "VC escolheu sair"
break
;;
esac

break
fi
done
fi
done



Sei que há algumas entradas repetidas, mas ainda não sei como mudar isso ainda...
Com estas ocorrencias de Coronavirus, tenho centrado esforços para o Home Office dos colegas...

Bem, de qq forma, agradeço a ajuda


4. Re: Criar Script para testar saída do APT-GET e caso erro ignora instalação de pacotes e seguir a execuç

Thiago Boeira
tcboeira

(usa Debian)

Enviado em 09/04/2020 - 20:56h

Olá... Resolvido da seguinte forma....

[code
]#!/bin/bash


# INICIA verificação de APT-GET

UPDATE_PC () {
sudo rm -r UP.log
sudo rm -r FAILUP
FAIL=

sudo apt-get update > UP.log

cat UP.log | grep "Falha temporária" > FAILUP
FAIL=$(grep -c ".*" FAILUP)
}

UPDATE_PC

while :; do
if [ "$FAIL" == "0" ]; then
sleep 4 | echo "Carregado com sucesso.Aguarde..."
break
else
sleep 4 | echo "Erro ao carregar. Nova tentativa..."
for i in $(seq 3); do
UPDATE_PC
if [ "$FAIL" == "0" ]; then
sleep 4 | echo "Carregado com sucesso. Aguarde..."
sleep 4 | echo "Carregando opções! Aguarde..."
break
else
echo "Erro persisti. Se deseja tentar mais tarde, 1 para SIM. Para pular. 2 para Não"
case $? in
0) #SIM
sleep 4 | echo "Repetindo teste... Aguarde..."
UPDATE_PC
;;
1) #NÃO
sleep 4 | echo "Pulando esta etapa... Aguarde ..."
break
;;
esac

break
fi
done
fi
done

sudo rm -r UP.log
sudo rm -r FAILUP
FAIL=

# Conclui verificação de APT-GET
[/code]

Eu quero agradecer a ajuda ... Vcs não sabem como esta contribuição é importantissima!


5. Re: Criar Script para testar saída do APT-GET e caso erro ignora instalação de pacotes e seguir a ex

Rogerio
RogerDez

(usa Outra)

Enviado em 10/04/2020 - 08:10h

fiquei sem ver a sua resposta e acabei esquecendo deste tópico e por isso não tentei ajudar mais..

mas.... vc conseguiu por enquanto, qq vai postando ae
flww

eu estou dando mais um olhada, vou mandar mais uma sugestão abaixo, mas na vdd como eu nem posso testar aqui no meu sistema, vale mais as seguintes considerações:
vi que vc exec'd para que uma cópia do stdout (fd 1) vá para o arquivo definido por $LOG..

como eu não uso esse tipo de redirecionamento abrangente, eu retirei isso para o meu exemplo ficar coerente..
mas enfim, vamos considerar que isso não vai te atrapalhar em outras etapas do script e focar só neste trecho que vc mandou..

tb devo admitir que não sei como esse zenity funciona, mas imaginei de acordo com o seu código..

modifiquei a função UPDATE_PC para usar os sinais de saída diretamente ao invés de fazer testes para saber se o apt-update saiu com erro ou sem erro... mas isso depende da saída do apt-update e eu não uso ele e espero que ele saia com erro (?=1) quando houver o erro que vc quer capturar..

então eu usei o tee para gerar três cópias, uma vai para o $LOG, a outra vai para o zenity e o stdout ainda vai passar pelo
grep no modo quiet '-q' para ver se tem o seu erro, mas na verdade você deveria usar um set -o pipefail na cabeça da função:

set -o pipefail This setting prevents errors in a pipeline from being masked. If any command in a pipeline fails, that return code will be used as the return code of the whole pipeline. By default, the pipeline's return code is that of the last command - even if it succeeds.


para evitar que precisemos retirar a opção de pipefail depois que executar o apt-update, colocamos a função para executar dentro de uma subshell, repare nos parênteses perto das chaves { ( .. );}

o importante é que a função vai sair com 1 se houver erro, ou com 0 se sair sem erros..

depois me arrisquei com esse for loop aritmético, no primeiro erro ele não pede para selecionar no zenity se quer tentar novamente ou não..

#!/bin/bash

LOG="${0##*/}".log

UPDATE_PC () {
sudo rm -r testaupdate.inst.log

sudo apt-get update |
tee "$LOG" >(zenity --progress --auto-close --width 350 --pulsate --text "Realizando atualização de conteúdo de repositórios.\nAguarde \n" --title "Ubuntu EMPRESA 20.04" --auto-close) |
grep -q 'Falha temporária' && return 1 || return 0
}

UPDATE_PC () { (
sudo rm -r testaupdate.inst.log
#capturar saida de erro dentro da pipeline
set -o pipefail
sudo apt-get update |
tee "$LOG" |
zenity --progress --auto-close --width 350 --pulsate --text "Realizando atualização de conteúdo de repositórios.\nAguarde \n" --title "Ubuntu EMPRESA 20.04" --auto-close
);}

for ((i=1;i<4;i++)); do
if UPDATE_PC; then
sleep 4 | zenity --progress --auto-close --width 350 --pulsate --text "Carregado com sucesso.\nAguarde \n" --title "Ubuntu EMPRESA 20.04" --auto-close
break
else
sleep 4 | zenity --progress --auto-close --width 350 --pulsate --text "Erro ao carregar conteúdo.\nNova tentativa...\nAguarde \n" --title "Ubuntu EMPRESA 20.04" --auto-close
((i<=1)) && continue
if zenity --question --width=250 --height=150 --title="Instalado Ubuntu EMPRESA 20.04" --text="Erro persistente. Se necessario, contatar: \[email protected] \n \n \nProssiga!"; then
echo "VC escolheu REPETIR"
else
echo "VC escolheu sair"
break
fi
fi
done

#se depois da terceira tentativa, i.e. i=4 , avisar que vai prosseguir mesmo assim
((i-4)) || echo 'erro na atualização, prosseguindo..' 1>&2


estou ainda dando umas modificadas no script, mas não encontro a definição de 'testaupdate.log' , entãp imagino que isso vem de uma outra parte de um script completo.

por fim, usamos o teste artimético para saber se a terceira tentativa foi de sucesso ou não. para isso, o loop do 'for' vai contar até i=4 mas só vai executar o loop até i=3. se em i=3 a tentativa for sucesso, o loop vai quebrar e não chegará a contar i=4..
então, mais um teste do 'i' fora do loop vai perceber se i=4 , o teste ((i-4)) = ((0)) vai sair com sinal 1..
me desculpe pelos testes artiméticos, são bem estranhos..






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts