Verificando se uma data está na próxima semana

1

Total de iniciantes no Linux - Tentando criar um script para renovação automática de SSL com o LetsEncrypt.

O script diário começa com a verificação da expiração do SSL:

response="$(openssl x509 -enddate -noout -in ~/letsencrypt/www.mydomain.com/cert.pem)"

$response é notAfter=May 9 19:27:44 2018 GMT

Eu gostaria que ele fosse comparado com a data de hoje e verifique se a diferença de horário é menor ou igual a 7 dias. Pseudocódigo:

if [$response is less than 7 days away from today] then cd ~/letsencrypt $$ ~/dehydrated/dehydrated --cron --domain www.mydomain.com --out . --challenge http-01

Como faço para fazer isso?

Eu tentei converter $response em um formato mais viável por meio de date -d , mas recebi um erro date: extra operand ‘19:27:44’ .

    
por DDiran 09.02.2018 / 16:55

3 respostas

2

Eu abordarei sua preocupação real em vez da pergunta específica que você fez: dehydrated --cron já faz a verificação da data para você.

Documentação:

--cron (-c) Sign/renew non-existent/changed/expiring certificates.

Código:

# Check expire date of existing certificate
if [[ -e "${cert}" ]]; then
  echo " + Checking expire date of existing cert..."
  valid="$("${OPENSSL}" x509 -enddate -noout -in "${cert}" | cut -d= -f2- )"

  printf " + Valid till %s " "${valid}"
  if "${OPENSSL}" x509 -checkend $((RENEW_DAYS * 86400)) -noout -in "${cert}"; then
    printf "(Longer than %d days). " "${RENEW_DAYS}"
    if [[ "${force_renew}" = "yes" ]]; then
      echo "Ignoring because renew was forced!"
    else
      # Certificate-Names unchanged and cert is still valid
      echo "Skipping renew!"

( link )

RENEW_DAYS aparece como padrão para 30, mas você pode substituí-lo usando um arquivo de configuração; citando a documentação :

dehydrated is looking for a config file in a few different places, it will use the first one it can find in this order:

  • /etc/dehydrated/config
  • /usr/local/etc/dehydrated/config
  • The current working directory of your shell
  • The directory from which dehydrated was run

O arquivo de configuração de amostra contém esta linha:

# Minimum days before expiration to automatically renew certificate (default: 30)
#RENEW_DAYS="30"

Para diminuir o valor do padrão de 30 para 7 dias, por exemplo, edite a segunda linha:

RENEW_DAYS="7"
    
por 09.02.2018 / 17:30
1

Determine o número de segundos a 1 de janeiro de 1970 para a data de expiração, por enquanto e divida a diferença pelo número de segundos em um dia.

$ TZ=GMT date -d "May 9 19:27:44 2018 GMT" '+%s'
1525894064
$ TZ=GMT date '+%s'                             
1518192447
$ expr \( 1525894064 - 1518192447 \) / 86400
89
    
por 09.02.2018 / 17:09
1

Os comandos abaixo irão verificar a data fornecida pelo comando openssl em relação à data "7 dias a partir de agora"; se a data de abertura (em segundos desde a época) for inferior a 7 dias a partir de agora (em segundos desde a época), o comando if será bem-sucedido e você poderá fazer o que for necessário:

response="$(openssl x509 -enddate -noout -in ~/letsencrypt/www.mydomain.com/cert.pem)"
responsetime=${response##notAfter=}
responsetz={$responsetime##* }
if [ $(date -d "$responsetime" +%s) -lt $(TZ=$responsetz date -d "now + 7 days" +%s) ]
then
   ## do the needful
fi

A primeira atribuição (depois de receber a resposta $) retira o texto "notAfter=" inicial. A segunda atribuição captura o fuso horário da resposta; isso poderia ser simplificado se for sempre GMT.

Os dois comandos de data pedem data (GNU) para o tempo em segundos desde a época da data de abertura e para "now + 7 days", tendo o cuidado de definir o fuso horário para a segunda chamada para o fuso horário informado pelo openssl comando.

    
por 09.02.2018 / 17:30