Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.os.unix.linux.misc > #137650 > unrolled thread
| Started by | Tim Landscheidt <tim@tim-landscheidt.de> |
|---|---|
| First post | 2024-02-13 12:24 +0000 |
| Last post | 2024-02-15 18:26 +0100 |
| Articles | 6 — 3 participants |
Back to article view | Back to de.comp.os.unix.linux.misc
Web-Datei lokal zwischenspeichern, bei Änderung Befehl auslösen? Tim Landscheidt <tim@tim-landscheidt.de> - 2024-02-13 12:24 +0000
Re: Web-Datei lokal zwischenspeichern, bei Änderung Befehl auslösen? Ulli Horlacher <framstag@rus.uni-stuttgart.de> - 2024-02-13 19:24 +0000
Re: Web-Datei lokal zwischenspeichern, bei Änderung Befehl auslösen? Tim Landscheidt <tim@tim-landscheidt.de> - 2024-02-14 22:16 +0000
Re: Web-Datei lokal zwischenspeichern, bei Änderung Befehl auslösen? Ulli Horlacher <framstag@rus.uni-stuttgart.de> - 2024-02-15 09:32 +0000
Re: Web-Datei lokal zwischenspeichern, bei Änderung Befehl auslösen? Tim Landscheidt <tim@tim-landscheidt.de> - 2024-02-15 12:01 +0000
Re: Web-Datei lokal zwischenspeichern, bei Änderung Befehl auslösen? Stefan Reuther <stefan.news@arcor.de> - 2024-02-15 18:26 +0100
| From | Tim Landscheidt <tim@tim-landscheidt.de> |
|---|---|
| Date | 2024-02-13 12:24 +0000 |
| Subject | Web-Datei lokal zwischenspeichern, bei Änderung Befehl auslösen? |
| Message-ID | <87a5o45z75.fsf@vagabond.tim-landscheidt.de> |
Hi,
ich möchte regelmäßig kleine und große Dateien aus dem Web
atomar auffrischen, falls sie neu sind oder geändert wurden,
und in diesem Fall nach erfolgreichem Download einen Befehl
auslösen. Beispiel:
https://src.fedoraproject.org/repo/rpm-specs-latest.tar.xz
soll jeden Tag heruntergeladen und bei Änderung in
$directory entpackt werden.
Für die Eigenschaft der Änderung scheint der HTTP-Header
ETag der richtige Ansatzpunkt zu sein. Von meinen beiden
Hoflieferanten curl und wget scheint nur curl dieses mittels
--etag-compare und --etag-save zu beherrschen.
Problem: curl liefert den Rückgabewert 0 zurück sowohl für
den Fall, dass die Datei (bzw. dessen ETag-Header) geändert
wurde, als auch, falls gar nichts heruntergeladen wurde.
Das heißt, ich müsste bei --etag-compare und --etag-save
verschiedene Dateien angeben und deren Inhalt, falls curl
erfolgreich war, dann vergleichen und bei Unterschied dann
ETag-Datei und eigentliche Datei überschreiben und meinen
Befehl auslösen à la:
| origfile=/tmp/cfwu.rss
| origetag="${origfile}.etag"
| dldir="$(mktemp -d)"
| if curl -s --etag-compare "$origetag" --etag-save "$dldir/tmp.etag" -o "$dldir/tmp.rss" https://www.comeflywithus.de/feed/mp3/; then
| if [ -s "$origetag" ] && cmp -s "$origetag" "$dldir/tmp.etag"; then
| rm -f "$dldir/tmp.etag"
| else
| mv -f "$dldir/tmp.rss" "$origfile"
| mv -f "$dldir/tmp.etag" "$origetag"
| echo "Do something useful here."
| fi
| fi
| rmdir "$dldir"
Das funktioniert, und dank des „-s“-Tests sogar für Webres-
sourcen, die keinen ETag-Header haben (auch wenn dann in je-
dem Fall der Befehl ausgelöst wird).
Aber das kann ja 2024 nicht der Stand der Technik sein :-).
Gibt es (für curl oder andere weit verbreitete Programme)
Möglichkeiten, das kürzer/einfacher/eleganter/one-liner-kom-
patibel zu formulieren?
Tim
[toc] | [next] | [standalone]
| From | Ulli Horlacher <framstag@rus.uni-stuttgart.de> |
|---|---|
| Date | 2024-02-13 19:24 +0000 |
| Message-ID | <uqgflm$ojp$1@news2.informatik.uni-stuttgart.de> |
| In reply to | #137650 |
Tim Landscheidt <tim@tim-landscheidt.de> wrote: > Hi, > > ich möchte regelmäßig kleine und große Dateien aus dem Web > atomar auffrischen, falls sie neu sind oder geändert wurden, > und in diesem Fall nach erfolgreichem Download einen Befehl > auslösen. Beispiel: > https://src.fedoraproject.org/repo/rpm-specs-latest.tar.xz > soll jeden Tag heruntergeladen und bei Änderung in > $directory entpackt werden. Ist zwar nicht ganz korrekt, duerfte hier aber funktionieren: Nimm den Header Content-Length: curl -I https://src.fedoraproject.org/repo/rpm-specs-latest.tar.xz | grep -i Content-Length Wenn der Wert von der gespeicherten Datei abweicht, hat sich was geaendert. Last-Modified Header ist leider kein ISO Datum und eignet sich nicht als String-Vergleich. -- Ullrich Horlacher Server und Virtualisierung Rechenzentrum TIK Universitaet Stuttgart E-Mail: horlacher@tik.uni-stuttgart.de Allmandring 30a Tel: ++49-711-68565868 70569 Stuttgart (Germany) WWW: https://www.tik.uni-stuttgart.de/
[toc] | [prev] | [next] | [standalone]
| From | Tim Landscheidt <tim@tim-landscheidt.de> |
|---|---|
| Date | 2024-02-14 22:16 +0000 |
| Message-ID | <87cysyelny.fsf@vagabond.tim-landscheidt.de> |
| In reply to | #137652 |
Ulli Horlacher <framstag@rus.uni-stuttgart.de> wrote: >> ich möchte regelmäßig kleine und große Dateien aus dem Web >> atomar auffrischen, falls sie neu sind oder geändert wurden, >> und in diesem Fall nach erfolgreichem Download einen Befehl >> auslösen. Beispiel: >> https://src.fedoraproject.org/repo/rpm-specs-latest.tar.xz >> soll jeden Tag heruntergeladen und bei Änderung in >> $directory entpackt werden. > Ist zwar nicht ganz korrekt, duerfte hier aber funktionieren: > Nimm den Header Content-Length: > curl -I https://src.fedoraproject.org/repo/rpm-specs-latest.tar.xz | grep -i Content-Length > Wenn der Wert von der gespeicherten Datei abweicht, hat sich was geaendert. > Last-Modified Header ist leider kein ISO Datum und eignet sich nicht als > String-Vergleich. Sorry, da habe ich nicht präzise genug formuliert: Mir geht es nicht um das Kriterium der Änderung, sondern eine Alter- native zu dem Boilerplate-Code. Ein Beispiel wäre lwp-mirror (https://metacpan.org/dist/libwww-perl/view/bin/lwp-mirror). Das nutzt aber keinen ETag-Header und der Rückgabewert ist (für meine Zwecke) unbrauchbar (und dass man User-Agent nicht setzen kann, ist auch für manche Server blöd). Ich suche ein fertiges Tool, das dieses leistet und mög- lichst in den gängigen Distributionen enthalten ist. Tim
[toc] | [prev] | [next] | [standalone]
| From | Ulli Horlacher <framstag@rus.uni-stuttgart.de> |
|---|---|
| Date | 2024-02-15 09:32 +0000 |
| Message-ID | <uqklmv$lc7$1@news2.informatik.uni-stuttgart.de> |
| In reply to | #137672 |
Tim Landscheidt <tim@tim-landscheidt.de> wrote: >> Nimm den Header Content-Length: > >> curl -I https://src.fedoraproject.org/repo/rpm-specs-latest.tar.xz | grep -i Content-Length > >> Wenn der Wert von der gespeicherten Datei abweicht, hat sich was geaendert. > >> Last-Modified Header ist leider kein ISO Datum und eignet sich nicht als >> String-Vergleich. > > Sorry, da habe ich nicht präzise genug formuliert: Mir geht > es nicht um das Kriterium der Änderung, sondern eine Alter- > native zu dem Boilerplate-Code. Was soll das sein? > Ich suche ein fertiges Tool, das dieses leistet und mög- > lichst in den gängigen Distributionen enthalten ist. Und das alles sofort und kostenlos? Dann musst du selber weitersuchen. -- Ullrich Horlacher Server und Virtualisierung Rechenzentrum TIK Universitaet Stuttgart E-Mail: horlacher@tik.uni-stuttgart.de Allmandring 30a Tel: ++49-711-68565868 70569 Stuttgart (Germany) WWW: https://www.tik.uni-stuttgart.de/
[toc] | [prev] | [next] | [standalone]
| From | Tim Landscheidt <tim@tim-landscheidt.de> |
|---|---|
| Date | 2024-02-15 12:01 +0000 |
| Message-ID | <87zfw20we3.fsf@vagabond.tim-landscheidt.de> |
| In reply to | #137677 |
Ulli Horlacher <framstag@rus.uni-stuttgart.de> wrote:
>>> Nimm den Header Content-Length:
>>> curl -I https://src.fedoraproject.org/repo/rpm-specs-latest.tar.xz | grep -i Content-Length
>>> Wenn der Wert von der gespeicherten Datei abweicht, hat sich was geaendert.
>>> Last-Modified Header ist leider kein ISO Datum und eignet sich nicht als
>>> String-Vergleich.
>> Sorry, da habe ich nicht präzise genug formuliert: Mir geht
>> es nicht um das Kriterium der Änderung, sondern eine Alter-
>> native zu dem Boilerplate-Code.
> Was soll das sein?
| origfile=/tmp/cfwu.rss
| origetag="${origfile}.etag"
| dldir="$(mktemp -d)"
| if curl -s --etag-compare "$origetag" --etag-save "$dldir/tmp.etag" -o "$dldir/tmp.rss" https://www.comeflywithus.de/feed/mp3/; then
| if [ -s "$origetag" ] && cmp -s "$origetag" "$dldir/tmp.etag"; then
| rm -f "$dldir/tmp.etag"
| else
| mv -f "$dldir/tmp.rss" "$origfile"
| mv -f "$dldir/tmp.etag" "$origetag"
| echo "Do something useful here."
| fi
| fi
| rmdir "$dldir"
>> Ich suche ein fertiges Tool, das dieses leistet und mög-
>> lichst in den gängigen Distributionen enthalten ist.
> Und das alles sofort und kostenlos?
Richtig.
> Dann musst du selber weitersuchen.
Danke für den Hinweis!
Tim
[toc] | [prev] | [next] | [standalone]
| From | Stefan Reuther <stefan.news@arcor.de> |
|---|---|
| Date | 2024-02-15 18:26 +0100 |
| Message-ID | <uqll12.25s.1@stefan.msgid.phost.de> |
| In reply to | #137650 |
Am 13.02.2024 um 13:24 schrieb Tim Landscheidt:
> Problem: curl liefert den Rückgabewert 0 zurück sowohl für
> den Fall, dass die Datei (bzw. dessen ETag-Header) geändert
> wurde, als auch, falls gar nichts heruntergeladen wurde.
>
> Das heißt, ich müsste bei --etag-compare und --etag-save
> verschiedene Dateien angeben und deren Inhalt, falls curl
> erfolgreich war, dann vergleichen und bei Unterschied dann
> ETag-Datei und eigentliche Datei überschreiben und meinen
> Befehl auslösen à la:
Hilft es, stattdessen den Timestamp der Datei zu sichern/zu prüfen
("touch --reference", "test -nt")? Zum Thema Timestamps gibt es auch
"wget -N", das die Datei nur herunterlädt (...und den Timestamp
aktualisiert), wenn sich der Timestamp auf dem Server geändert hat.
Zumindest bei Dingen wie einer Paketliste würde ich erwarten, dass der
Server passende Header liefert, weil das schon vor Äonen der Weg der
Wahl war, einen Spiegelserver mit Inhalten vom Hauptserver zu bestücken.
Ansonsten pack halt dein Shellskript in eine Datei, und ruf das als
oneliner auf. (ernstgemeint.)
Stefan
[toc] | [prev] | [standalone]
Back to top | Article view | de.comp.os.unix.linux.misc
csiph-web