curl verificar se o arquivo é mais recente e, em vez de baixar, executar um script bash (ou python)

4

Estou tendo um problema.

Eu tenho um arquivo hospedado em um servidor remoto ( link ). Eu também tenho algumas caixas de Linux embutidas (rodando openelec OS). As caixas têm comandos bastante limitados, mas eles ainda têm o básico - curl, bash, etc. Todos eles têm o arquivo armazenado neles (/storage/file.zip)

O que estou tentando fazer é - eu preciso configurar um script, que é executado no primeiro minuto após o dispositivo ser totalmente inicializado, e provavelmente usará o curl para verificar se o arquivo do servidor remoto (mywebsite / file. zip) é mais recente que o local (/storage/file.zip), e em vez de baixá-lo se for mais recente - ele precisa executar um script bash (/storage/scripts/script.sh)

Eu geralmente uso este comando "curl -o /storage/file.zip -z /storage/file.zip link " mas eu não tenho idéia de como executá-lo, em vez de fazer o download do arquivo. Nem tenho certeza se é possível.

Toda ajuda é muito apreciada!

Além disso, apenas para ter certeza - ele precisa ser executado apenas se localfile for OLDER do que remotefile. Se localfile for mais recente que remotefile - não precisa executar o script, pois o script que é executado também está baixando o arquivo remoto do servidor, portanto, depois que ele for executado - localfile estará com um timestamp mais novo, que se não especificado o script é executado apenas no remotefile newer - ele pode terminar em um loop infinito.

    
por Stoyan Mihov 05.03.2016 / 23:27

2 respostas

4

Em vez de observar o nome do arquivo, você pode confiar em seu servidor HTTP para informar quando foi a última vez que o arquivo foi alterado e agir de acordo.

#!/bin/bash

remote_file="http://mywebsite/file.zip"
local_file="/storage/file.zip"

modified=$(curl --silent --head $remote_file | \
             awk '/^Last-Modified/{print $0}' | \
             sed 's/^Last-Modified: //')
remote_ctime=$(date --date="$modified" +%s)
local_ctime=$(stat -c %z "$local_file")
local_ctime=$(date --date="$local_ctime" +%s)

[ $local_ctime -lt $remote_ctime ] && /storage/scripts/script.sh

# end of file.
    
por 06.03.2016 / 07:35
0

Outra resposta foi ótima para o Linux comum, mas não funcionou para o OpenELEC. Então eu decidi comparar por tamanho, e funciona como um encanto! Aqui está o código:

#!/bin/bash
Local=$(wc -c < file.zip)
Remote=$(curl -sI http://server/file.zip | awk '/Content-Length/ {sub("\r",""); print $2}')
if [ $Local != $Remote ]; then
/bin/bash /storage/scripts/script.sh
else
echo "Same size."
fi
    
por 06.03.2016 / 17:38