Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Web-Datei lokal zwischenspeichern, bei Änderung Befehl auslösen?

4 views
Skip to first unread message

Tim Landscheidt

unread,
Feb 13, 2024, 7:24:50 AMFeb 13
to
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

Ulli Horlacher

unread,
Feb 13, 2024, 2:24:40 PMFeb 13
to
Tim Landscheidt <t...@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: horl...@tik.uni-stuttgart.de
Allmandring 30a Tel: ++49-711-68565868
70569 Stuttgart (Germany) WWW: https://www.tik.uni-stuttgart.de/

Tim Landscheidt

unread,
Feb 14, 2024, 5:16:53 PMFeb 14
to
Ulli Horlacher <fram...@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

Ulli Horlacher

unread,
Feb 15, 2024, 4:32:17 AMFeb 15
to
Tim Landscheidt <t...@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.

Tim Landscheidt

unread,
Feb 15, 2024, 7:01:11 AMFeb 15
to
Ulli Horlacher <fram...@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

Stefan Reuther

unread,
Feb 15, 2024, 12:31:45 PMFeb 15
to
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
0 new messages