Brauche Hilfe beim einem Shell Script

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Mr. Houch
Beiträge: 117
Registriert: 03.03.2007 13:31:20
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin-Reinickendof

Brauche Hilfe beim einem Shell Script

Beitrag von Mr. Houch » 19.08.2012 12:56:12

Hallo alle miteinander,

seit einer Woche läuft auf meinem Server ein Transmission- Bittorrent Server.

Auf diesem befinden sich unter anderem auch einige Images von Cyangenmod. Damit ich nicht selber täglich/wöchentlich nachsehen muss, ob es eine neuere Version gibt, würde ich gerne ein Script dafür schreiben.

Meine Idee ist schonmal soweit gereift:
  • Lade die HTML-Seite mit allen torrents herunter (via wget -c download.cyanogenmod.com/torrents
    Prüfe ob es eine aktuellere Version gibt (ich denke an Shell-Variablen und grep aber da gibt es bestimmt bessere Lösungen
    Wenn es einen neuren torrent gibt, alten löschen und neuen hinzufügen (da muss ich nur noch die transmission Befehle heraus suchen.
    Lass das Script täglich mit cron laufen
Mein Problem ist nun, das ich zwar die aktuelle Version finde, jedoch habe ich bis jetzt keinen Vergleich. Diesen Wollte ich mit einer Datei pro Torrent realisieren wo der Name des Torrents oder auch nur die Versionsnummer steht. Das ganze will ich auch für die nightlys machen.

Außerdem habe ich noch das Problem das ich mit meinem Aufruf bisjetzt nur soweit komme:

Code: Alles auswählen

:~$ wget -c download.cyanogenmod.com/torrents
 ...
 ...
2012-08-19 12:52:04 (272 KB/s) - »»torrents«« gespeichert [751987]

~$ cat torrents | grep cm-9.[0123456789].[0123456789]-galaxys2.zip.torrent

<a href="cm-9.0.0-galaxys2.zip.torrent">cm-9.0.0-galaxys2.zip.torrent</a>                      10-Aug-2012 07:26                5682
Nun weis ich nicht, wie ich NUR den Namen bzw. die Versionsnummer auslesen kann.

Ich bitte jeden der Scripten kann mir bitte zu helfen. Es ist schließlich für einen guten Zweck.

Danke im vorraus.
Zuletzt geändert von Mr. Houch am 07.12.2012 20:45:26, insgesamt 2-mal geändert.

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Phineas » 19.08.2012 13:21:15

Code: Alles auswählen

Version="$(grep -Po "(?<=<a href=\"cm-).*(?=-galaxys2.zip.torrent\">)" torrents)"
echo $Version

Benutzeravatar
Mr. Houch
Beiträge: 117
Registriert: 03.03.2007 13:31:20
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin-Reinickendof

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Mr. Houch » 19.08.2012 13:37:57

Danke für die schnelle Antwort und das verschieben. Hier macht das deutlich mehr Sinn.

Das Ergebnis sieht nun auch schon deutlich schöner aus. Könnte mir jemand die Syntax näher erkären? -o und -P leuchten mir trotz der Main-Page nicht wirklich ein. Wäre schön wenn ich demnächst dannsowas auch alleine könnte.

Benutzeravatar
Mr. Houch
Beiträge: 117
Registriert: 03.03.2007 13:31:20
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin-Reinickendof

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Mr. Houch » 19.08.2012 13:44:08

Gibt es für grep so etwas wie ein exclude? ich würde gerne alle Ergebnisse mit "NIGHTLY" drinnen noch ausschließen?

Gibt es die Möglichkeit einen String der Form -20120819- in seine Bestandteie zu zerlegen? So etwas wie $Jahr= erste 4 Zeichen , $Monat = nächste 2 Zeichen, etc. ?

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Phineas » 19.08.2012 13:47:14

-o liefert nur das gefundene Muster, anstatt der ganzen Zeile.
-P sind Perl-RegEx, dazu findest Du im Internet tonnenweise Erklärungen.

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Phineas » 19.08.2012 13:52:41

Code: Alles auswählen

Date="20120819"
Jahr="${Date:0:4}"
Monat="${Date:4:2}"
Tag="${Date:6:2}"
grep-Exclude ist -v

Benutzeravatar
Mr. Houch
Beiträge: 117
Registriert: 03.03.2007 13:31:20
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin-Reinickendof

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Mr. Houch » 19.08.2012 14:17:57

So, mittlerweile bin ich soweit gekommen:

Code: Alles auswählen

rm torrents #loesche Altlasten
wget -c download.cyanogenmod.com/torrents #hole aktuelle Daten

Version="$((grep -Po "(?<=<a href=\"cm-).*(?=-galaxys2.zip.torrent\">)" torrents) | grep -v "NIGHTLY" | grep -v "RC")"
Nun hänge ich daran, das $Version einen String mit mehreren Versionsnummern enthält. Nach deinem Datumsbeispiel gibt es doch bestimmt auch eine Möglichkeit, das ganze aufzuspalten, da ja Leerzeichen enthalten sind.

Unter welchen Begriff finde ich dazu Infos? Will dir/euch nicht allzuviel Zeit/Nerven rauben :)

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Phineas » 19.08.2012 14:37:17

Ich würde die Excludes zuerst machen. :wink:

Postest Du dann mal Befehl und Ergebnis?

Benutzeravatar
Mr. Houch
Beiträge: 117
Registriert: 03.03.2007 13:31:20
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin-Reinickendof

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Mr. Houch » 19.08.2012 14:54:23

Klar hier :)

Code: Alles auswählen

 grep -v "NIGHTLY" torrents | grep -v "RC" |(grep -Po "(?<=<a href=\"cm-).*(?=-galaxys2.zip.torrent\">)")
7.2.0
9.0.0
Ab jetzt werde ich über mein Smartphone und Server arbeiten müssen, meinem Netbook geht der Saft aus (kotz) und ich habe das Kabel vergessen. Aber ich werde alles lesen, nur die Antworten werden länger dauern...

Die Befehle anders herum weil das schneller läuft oder nur der Schönheit halber? (Ich tippe ja auf ersteres)

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Phineas » 19.08.2012 15:07:59

Weil nach dem Perl-Regex, nichts mehr zum excluden über ist, da kommen doch nur die Versionsnummern raus.

Ich bin übrigens in der Bash. Sicherheitshalber solltest Du also einen Shebang ("#!/bin/bash", zwingend in der ersten Zeile) setzen.
Zum Verarbeiten der Versionsnummern bietet sich eine for-Schleife an:

Code: Alles auswählen

#!/bin/bash

wget ...

for v in $(grep -v "NIGHTLY" torrents | grep -v "RC" | grep -Po "(?<=<a href=\"cm-).*(?=-galaxys2.zip.torrent\">)")
do
    echo $v
done
Das "echo $v" steht für die weitere Verarbeitung.
Zuletzt geändert von Phineas am 19.08.2012 15:12:41, insgesamt 1-mal geändert.

Benutzeravatar
whisper
Beiträge: 3379
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Brauche Hilfe beim einem Shell Script

Beitrag von whisper » 19.08.2012 15:10:53

Phineas hat geschrieben:Weil nach dem Perl-Regex, nichts mehr zum excluden über ist, da kommen doch nur die Versionsnummern raus.

Ich bin übrigens in der Bash. Sicherheitshalber solltest Du also einen Shebang ("#/bin/bash", zwingend in der ersten Zeile) setzen.
Da fehlt ein Ausrufezeichen

Code: Alles auswählen

#!/bin/bash
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Phineas » 19.08.2012 15:13:32

Jau, Danke. Habe ich korrigiert.

Benutzeravatar
FANA
Beiträge: 482
Registriert: 30.03.2005 17:50:55

Re: Brauche Hilfe beim einem Shell Script

Beitrag von FANA » 19.08.2012 16:01:20

Code: Alles auswählen

apt-get install lynx transmission-cli

Code: Alles auswählen

#!/bin/bash

LATEST=$(lynx -dump download.cyanogenmod.com/torrents | grep -v -P "(NIGHTLY|RC)" | grep -P "http.*galaxys2.zip.torrent.*" | grep -P -o "\d+\.\d+\.\d+" | sort -n -r | head -1)

CURRENT=$(transmission-remote  -l | grep -P -o "cm-.*" | grep -P -o "\d+\.\d+\.\d+" | sort -n -r | head -1)

if [ "$LATEST" \> "$CURRENT" ]
 then

  transmission-remote -a http://download.cyanogenmod.com/torrents/cm-${LATEST}-galaxys2.zip.torrent

fi

Benutzeravatar
Mr. Houch
Beiträge: 117
Registriert: 03.03.2007 13:31:20
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin-Reinickendof

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Mr. Houch » 25.08.2012 15:05:25

FANA, danke erst einmal für die umfangreiche Antwort. Allerdings ist hier ein kleiner Fehler (für alle die den Thread vllt auch lesen):

Code: Alles auswählen

LATEST=$(lynx -dump download.cyanogenmod.com/torrents | grep -v -P "(NIGHTLY|RC)" | grep -P "http.*galaxys2.zip.torrent.*" | grep -P -o "\d+\.\d+\.\d+" | sort -n -r | head -1)
Es müsste

Code: Alles auswählen

LATEST=$(lynx -dump download.cyanogenmod.com/torrents | grep -v -P "(NIGHTLY|RC)" | grep -P "(cm-)*(galaxys2.zip.torrent)" | grep -P -o "\d+\.\d+\.\d+" | sort -n -r | head -1)
lauten.

Ich habe da aber gleich noch eine Frage an dich/euch: Ist es bei

Code: Alles auswählen

grep -P -o "\d+\.\d+\.\d+"
möglich so etwas wie eine Wildcard einzufügen? den es kommt vor, das eine Versionsnummer 4 stellig ist.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Cae » 25.08.2012 17:02:09

Mr. Houch hat geschrieben:Ich habe da aber gleich noch eine Frage an dich/euch: Ist es bei

Code: Alles auswählen

grep -P -o "\d+\.\d+\.\d+"
möglich so etwas wie eine Wildcard einzufügen? den es kommt vor, das eine Versionsnummer 4 stellig ist.
Also a.b.c.d anstatt a.b.c? Ja, klar geht das, du hast das oben schon (unbewusst?) gemacht. ? ist ja oder nein, * ist 0-n, + ist 1-n Vorkommen. Weiteres in pcrepattern(3). Der Ausdruck kommt in eine normale Klammer ():

Code: Alles auswählen

\d+\.\d+\.\d+(\.\d)?
Ich würde da übrigens von vierstufig sprechen, zumindest nicht von vierstellig, da 1234 vierstellig ist und von \d+ gematcht wird.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Mr. Houch
Beiträge: 117
Registriert: 03.03.2007 13:31:20
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin-Reinickendof

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Mr. Houch » 28.08.2012 20:13:43

Hey Leute, erst noch einmal ganz lieben Dank für eure Hilfe.

Das hier ist das was ich jetzt habe:

Code: Alles auswählen

#!/bin/bash

modelname=${1}

echo $modelname

if [ -n "$modelname" ];then

        LATEST_VERSION=$(lynx -dump download.cyanogenmod.com/torrents | grep -v -P "(NIGHTLY|RC)" | grep -P "(cm-)*(${modelname}.zip.torrent)" | grep -P -o "\d+\.\d+\.\d+(\.\d+)?" | sort -n -r | head -1)

        CURRENT_VERSION=$(transmission-remote localhost:9091 -n user:password -l | grep -P "(cm-)*(${modelname}.zip)" | grep -P -o "\d+\.\d+\.\d+(\.\d+)?" | sort -n -r | head -1)

        echo "Latest:  $LATEST_VERSION"

        echo "Current: $CURRENT_VERSION"

        if [ "$LATEST_VERSION" \> "$CURRENT_VERSION" ];then

                echo "if Abfrage"

                transmission-remote localhost:9091 -n user:password --add http://download.cyanogenmod.com/torrents/cm-${LATEST_VERSION}-${modelname}.zip.torrent

                transmission-remote localhost:9091 -n user:password --remove-and-delete cm-${CURRENT_VERSION}-${modelname}.zip

        else

        echo "You have already the newest version"

        fi
fi

exit 0
Der Modelname muss jetzt beim aufrufen angegeben werden somit muss ich nicht für jedes Smartphone eine eigene Datei pflegen :)

Es funktioniert soweit alles, bis auf diesen Aufruf:

Code: Alles auswählen

transmission-remote localhost:9091 -n user:password --remove-and-delete cm-${CURRENT_VERSION}-${modelname}.zip
Dieser müsste unter Transmission-remote so aussehen:

Code: Alles auswählen

transmission-remote localhost:9091 -n user:password -t${torrent_id} --remove-and-delete 
Und da sind wir dann auch schon bei dem Problem. Wie lese ich aus einem String die erste Zahl aus bzw. die Torrent-ID?

Mein Aufruf ist soweit gereift:

Code: Alles auswählen

~$ torrent_id=$(transmission-remote localhost:9091 -n user:password -l | grep -P "cm-9.0.0-galaxysmtd.zip" | grep -P -o "\d+"); echo $torrent_id
8 100 142 9 0 0 0 0 0 00 9 0 0
Die erste Zahl ist die ID. Wie sieht eurer Meinung nach die beste/smarteste Variante aus? (Ich muss mir echt nen Shell-Scripting Buch zulegen).

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Cae » 28.08.2012 22:16:20

Wenn du dir ganz sicher bist, dass nur das erste Char (fast immer gleich Buchstabe) interessant ist, die erste Variante. Falls nicht, die zweite. Ansonsten ist awk recht narrensicher:

Code: Alles auswählen

$ echo '3 456 21 8970' | cut -c1
3
$ echo '23 456 1 8970' | cut -d\  -f1
23
$ echo '23 456 1 8970' | awk '{ print $1}'
23
Beachte, dass bei cut -d\ -f1(Minus Delta Backslash Space Space Minus Foxtrott eins) auch wirklich nur ein Space als Feldtrenner wirkt, bei awk trennen auch andere Whitespaces.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Mr. Houch
Beiträge: 117
Registriert: 03.03.2007 13:31:20
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin-Reinickendof

Re: [gelöst] Brauche Hilfe beim einem Shell Script

Beitrag von Mr. Houch » 11.10.2012 17:45:47

So, ich möchte mich hier noch einmal ganz herzlich für eure Mithilfe bedanken.

Die Scripte sind mittlerweile im produktiven Einsatz und erfüllen ihre Aufgabe.

Falls wer Zeit und Lust hat, kann sie sich gerne auf Github ansehen. Anregungen, Verbesserungsvorschläge und Rechtschreibkontrolle für die Kommentare sind herzlich willkommen.

Danke noch einmal.

Benutzeravatar
Mr. Houch
Beiträge: 117
Registriert: 03.03.2007 13:31:20
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin-Reinickendof

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Mr. Houch » 07.12.2012 20:47:55

Ich bin gerade dabei die Scripte zu verfeinern. Sie haben sich im Produktiveinsatz schon bewährt. Jedoch fehlt mir noch eine Prüfung, ob lynx und transmission-remote-cli installiert sind. Wie realisiere ich sie am besten?

Bis jetzt habe ich nur die Idee zu prüfen, ob sie unter /usr/bin/ exisiteren, aber funktioniert das plattformübergreiden?

Falls wer eine bessere Methode kennt, bitte melden :)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Brauche Hilfe beim einem Shell Script

Beitrag von Cae » 07.12.2012 23:43:59

Mr. Houch hat geschrieben:Jedoch fehlt mir noch eine Prüfung, ob lynx und transmission-remote-cli installiert sind. Wie realisiere ich sie am besten?
Besser geht bestimmt, aber

Code: Alles auswählen

$ prog_there() {
> 	test -x "$(which $1)"
> 	return $?
> }
$ prog_there rm  || echo nix
$ prog_there foo || echo nix
nix
$ 
funktioniert. which ueberprueft, ob das Programm *irgendwo* im $PATH liegt, d.h. man koennte beispielsweise auch ein eigenes lynx in /usr/local/bin/ verwenden, welches dann als vorhanden erkannt wird. Ob dieses ausfuehrbare Etwas auch tatsaechlich die Funktion hat, die man erwartet, wird natuerlich nicht getestet.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten