O script de upgrade automático da porta Bash no cron não funciona corretamente?

3

Recentemente, tentei escrever um script para automatizar verificações de novas versões de portas e software instalados no meu servidor FreeBSD. Este script é adicionado ao crontab do root e é acionado diariamente. Se eu rodá-lo de sudo / caminho / para / script vai em frente decentemente enviar e-mail com conteúdo no meu endereço de e-mail. Se for executado pelo cron, recebo uma mensagem vazia. Eu acho que o motivo pode ser que, enquanto a janela de atualização, por vezes, aparece (a partir de make config eu acho) com opções de compilação, mas posso estar errado. Aqui está o script:

#!/usr/local/bin/bash
# DIRECTORIES SETUP
script_path_dir="/tmp"
working_dir="$script_path_dir/portsupgradescript"

# FILES SETUP
mail_file="$working_dir/mail.txt"
mail_address="MY_MAIL_ADDRESS"
mail_subject="Daily update"
pm_out="portmaster_log.txt"
pu_out="portupgrade_log.txt"


# START

if [ ! -d "$script_path_dir" ];
 then
  echo "Script base directory set does not exist. Creating..."
  mkdir $script_path_dir
 else
  echo "Script base directory set exists. OK"
fi

if [ ! -d "$working_dir" ];
 then
  echo "Script working directory set does not exist. Creating..."
  mkdir $working_dir
 else
  echo "Script working directory set exists. OK"
fi

if [ "$(ls -A $working_dir)" ]; then
 echo "Script working directory is empty. OK"
else
 echo "Script working directory is not empty. Cleaning..."
 rm -rf $working_dir/*
fi


rm -rf $pm_out
rm -rf $pu_out
rm -rf $mail_file

/usr/sbin/portsnap fetch update && \
/usr/local/sbin/portmaster -L --index-only | egrep '(ew|ort) version|total install' > $pm_out

linecount='wc -l $pm_out | awk {'print $1'}'
if [ "$linecount" != "0" ]
then
 echo "Master file log not empty. Concatenating..."
 cat $pm_out >> $mail_file
 else
  echo "Master file log empty... ( x )  "
fi


portupgrade -aqyP -l $pu_out

upg_linecount='wc -l $pu_out'
if [ "$upg_linecount" != "0" ]
 then
  echo "Upgrade file log not empty. Concatenating..."
  cat $pu_out >> $mail_file
 else
  echo "Upgrade file log empty... ( x ) "
 fi


echo "Seding mail report..."
 cat $mail_file | mail -s "$mail_subject" "$mail_address"

Existe alguma maneira de selecionar padrões na janela " make config " para que isso não seja um impedimento? Ou talvez eu deva rodar este script sudoed no cron do usuário, não no root?

    
por Adrian K. 26.11.2012 / 00:37

3 respostas

2

A atualização automática do cron é uma má ideia. Você deve realmente ler / usr / ports / UPDATING caso haja algum tipo de ação manual que precise ser executada. Tenho certeza que isso provavelmente não será muito popular, desculpe, mas é verdade. Existe uma razão para UPDATING existir.

No que diz respeito ao seu script, você pode definir BATCH = yes em /etc/make.conf e não será solicitada a configuração. Você também pode Mas isso não significa que suas atualizações irão bem.

    
por 29.11.2012 / 03:43
3

Se estiver executando portsnap do cron, você realmente deve usar a ação cron , em vez de fetch . Ele dorme por um período de tempo aleatório entre 1 segundo e uma hora, antes de se conectar ao servidor. Isso tem o objetivo de reduzir a probabilidade de um grande número de clientes ficarem online ao mesmo tempo e martelando os servidores.

portupgrade tem uma opção --batch , que tem como objetivo processar todas as portas de maneira totalmente automatizada, portanto, deve aceitar os padrões ou os resultados de uma chamada anterior de make config . Isso pode ser o que você está procurando.

    
por 26.11.2012 / 16:23
2

Eu vi os padrões selecionados em make config as:

yes '' | make config

yes faz um loop para sempre imprimir todos os seus argumentos separados por um espaço e os segue com um '\ n'. Se nenhum argumento é dado, ele imprime um 'y' seguido por uma nova linha a cada iteração. Aqui, nós demos a ele um argumento vazio para fazer com que ele simplesmente imprima as novas linhas, o que é como apertar enter para aceitar todos os padrões dos make config prompts.

    
por 26.11.2012 / 01:21