Hallo
Es sollen unterschiedliche Raspberry Pi's von einer Website automatisch
regelmäßig config Dateien und Videos herunterladen.
Das ganze "webseitig" per php mit get-parameter eindeutige ID evtl +
Passwort. Also jedes Pi ruft mit seiner eigenen Kennung das Script auf
der Seite auf und bekommt eine individuelle config zum download
angeboten. Darin steht der Dateiname des Videos und von wann bis wann es
laufen soll. Daraus wird per shell ein Cronjob erzeugt und das Video
ggf. heruntergeladen, falls nicht schon vorhanden.
Ich muss beide Enden, die Website und das Pi aufbauen.
Jetzt habe ich diverse Möglichkeiten gefunden, entweder per wget, per
ftp, per url-aufruf...
Wie würdet ihr das ganze aufbauen?
Viele Grüße
Phillip
> Dateiname des Videos
Die Config Datei soll vom PHP-Script erzeugt werden, die Videodatei
liegt fertig in einem Verzeichnis, das der Webserver ausliefern kann -
Ist das so richtig?
> Daraus wird per Shell ein Cronjob erzeugt
Soll die gesamte Client-Seite als Cronjob und Shell-Script geschrieben
werden? Alles als Cronjob ist einfacher als /etc/init Script.
Wget bzw. curl dürfte dann das einfachste sein. Arbeit macht der
Kleinkram. Configdatei mit sed und grep auswerten. Fehlerbehandlung bei
Verbindungsabbruch...
Zu 1. Ja, richtig.
2. Auf dem Pi bin ich noch nicht so richtig weit. Die Dinger liegen
nachher grob gesagt irgendwo in nem Schaufenster und hängen an nem
surfstick. (Datenvolumen etc. ist kein Thema und nicht mein Problem, für
mich gilt:"so viel Internet wie ich brauche per surfstick ist da! ")
dadurch sind so aber nicht von außen erreichbar und müssen selbst aktiv
werden. Idee ist, daß sie in" Auslieferungszustand" jede Minute schauen
ob es auf der Website eine neue config für "nicht initialisierte" gibt
und diese runterladen. Diese enthält eine ID, Dateinamen des Videos und
Start und Endzeit für die Wiedergabe. Dann wird das Video gezogen und
ein cronjob erzeugt. Von da an wird das Video entsprechen gestartet und
gestoppt und einmal täglich geschaut, ob es eine neue config gibt, die
ggf wieder gezogen und der cronjob geändert wird. So können alle Pi's
mit dem selben klon der sd Karte bestückt werden und alles an Setup
geschieht via Website per config.
Da sehe ich keine echten Probleme. Ob du auf dem Raspi Bash, Python oder
sonst irgendeine Scriptsprache nimmst - der Aufwand bleibt in Summe so
ziemlich gleich. wget oder curl als Programm aufrufen geht einfacher,
als sich in eine Python Library einarbeiten.
Wenn keiner was dagegen hat - in der Config Datei noch eine Anweisung
zum Aufbau eines Reverse-Ssh-Tunnels vorsehen. Dann kann man Bugfixes
auch nach Auslieferung noch installieren.
Noch einer schrieb:> wget ..... als Programm aufrufen geht einfacher,
echt, ich habs aufgegeben,
mal kamen nur 10 Byte von meiner Weseite, mal die gesamte Webseite,
ich habe solange versucht zu laden mit wget bis die richtige Größe im
download war, sobald ich es skriptete gings wieder nicht, nach dutzenden
Versuchen mit allen Parameter habe ich das aufgegeben.
Kein Browser, IE oder FF hat derlei Probleme, klar ist mein Webserver
lahm AVR mega 1284p aber normal geht es immer, nur gelegentlich
brrauchts ein reload.
Das mit dem ssh Tunnel klingt interessant, danke für den Tipp.
Habe mich mal etwas eingelesen bzgl. der Cronjobs. Soweit ich das
verstehe ist es einfacher, jedes mal eine neue Datei mit allen Jobs zu
erzeugen, dann alle löschen und die neue Datei zu laden oder wie wird
das normalerweise gemacht?
Noch eine Frage zum download: mit wget - N kann ich den download ja auf
neue Dateien beschränken. Wenn du Datei aber per php vom Server
angeboten wird, funktioniert das dann? Oder anders gefragt: womit prüft
wget wie alt die Datei auf dem Server ist, und kann ich diese
Information beeinflussen?
Lg
Im Http-Header kann der Server ein Last-Modified senden. Weiß jetzt
nicht, ob wget ein Http-Head-Request sendet oder bei einem
Http-Get-Request die Verbindung abbricht, sobald es Last-Modified
bekommen hat. Lässt sich mit Wireshark herausfinden.
Im Prinzip kann dein PHP Script den Header selbst setzen. Aber ist der
Aufwand wirklich erforderlich? Warum nicht nur das Config mit PHP
zusammenbauen und die Videodatei direkt mit dem Webserver ausliefern?
Hallo Phillip,
Phillip Hommel schrieb:> Noch eine Frage zum download: mit wget - N kann ich den download ja auf> neue Dateien beschränken. Wenn du Datei aber per php vom Server> angeboten wird, funktioniert das dann? Oder anders gefragt: womit prüft> wget wie alt die Datei auf dem Server ist, und kann ich diese> Information beeinflussen?
Habe ich Dich richtig verstanden: da soll ein Haufen Raspis (mit
Monitoren) in einem Schaufenster stehen, in einer Endlosschleife Videos
abspielen, und wenn über einen zentralen Webserver neue Videos
bereitgestellt werden, sollen diese heruntergeladen und abgespielt
werden? Wozu denn dann die Konfigurationsdateien, was wird damit
konfiguriert? Und warum möchtest Du unterdessen die Cron-Konfiguration
manipulieren?
Liebe Grüße,
Karl
Die Video dürfen nicht den ganzen Tag laufen sondern, je nach Standort
von x bis. Was sich auch mal ändern kann. Im Moment laufen die Videos
von uralten CF Playern und jeden Morgen fährt einer die Runde und
schaltet alle an, abends das gleiche wieder aus. Da das ganze aber auch
langsam expandiert wird das etwas viel und ich habe als
Freundschaftsdienst eine bedienerfreundliche Lösung versprochen, sprich
Chef kann alles vom Büro aus machen und Hiwi muss nur einmal das ganze
aufstellen oder a-/umbauen.
Hat jemand noch eine Antwort zu meiner Frage? Mir ist noch nicht ganz
klar, was genau passiert wenn wget auf eine PHP zugreift die dann eine
Datei zum download erstellt bzw. anbietet. Ich nehme an da wird erstmal
der Dateiheader angeschaut und daraus das File Datum gelesen? Aber wie
schaut das aus wenn eben die php die Datei anbietet, was steht dann im
Header? Auf diesem Gebiet bin ich leider völlig neu...
Am besten du installierst Wireshark und schaust dir an, was wget und
Webserver ohne/mit PHP hin und her senden.
Im PHP gibt es eine Funktion, mit der du zusätzliche Http-Header senden
kannst. Ich glaube, die hieß sogar header().
Wenn es sich irgendwie machen lässt, solltest du aber die Videos direkt
vom Webserver ausliefern lassen. PHP ist nicht wirklich für so große
Datenmengen konzipiert.
Erinnere ich mich noch an ein Problem: Wollte einzelne Videos als ein
großes Video zusammengesetzt ausliefern - Das Script war schneller als
das Netzwerk - Speicher voll - Rechner langsam - zufällig irgendwelche
Programme abgestürzt. Hatte ich nicht gelöst bekommen, stattdessen dann
eine Playlist ausgeliefert.
P.S. wget und Webserver haben einen Mechanismus, der nach einem
Netzwerkfehler nur den fehlenden Teil der riesigen Datei überträgt.
Geht auch viel einfacher, manchmal hilft es, wenn ein Freund einfach
nicht so nah mit der Nase im Projekt steckt:
In der Cfg steht einfach der jeweils aktuelle Dateiname (Videodatei +
Timestamp oder Version). In Intervallen wird die neue Cfg runtergeladen
(sind nur ja nur inige Zeilen mehr als der Header alleine). Die
Videodateien bekommen eine fortlaufende Kennung am Ende und die Aktuell
gültige steht jeweils in der Config. Wenn nicht vorhanden wird dann
einfach per wget die Aktuelle version gezogen.
Was in deinem Projekt noch fehlt ist eine Sicherung gegen
Übertragungsfehler.
Mach noch ein Prüfsumme über das Video und sende es mit der CFG.
Falls fehlt schlägt CFG und Video noch mal.
Man kann auch einfach die videos auf den server schmeißen und rsync über
ssh (mit passwortlosem schlüssel) lädt von sich aus nur die neuen videos
vom server, die noch nicht da sind oder löscht die videos auf den pi's,
die nicht mehr auf dem server sind (rsync option --delete )
also ne chron machen die den server-ordner auf den pi synchronisiert.
wenn also auf den PIs mehrere videos vorgehalten werden sollen, dann
könte man dem chron job sagen, welches gestartet werden soll, indem
chron immer den dateinamen "video" abspielt. und auf dem server erstellt
man dann einen symlink names video auf das video was gerade gespielt
werden soll...
wer angst vor hackern hat kann den schlüssel auch restricten:
http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/
bin kein Fan von Chron-gefrickel, aber wers mag...
Vielen Dank erstmal für die Zahlreichen Tipps.
Die ersten Sachen laufen bereits, jetzt setze ich mich gerade mit den
Dateiheadern auseinander.
Dort kann ich ja optional auch ein lastmodified-Datum angeben. Ist das
dann auch das Datum, was auf dem Zielrechner als Lastmod in der Datei
übernommen wird? Ich nehme an wget mit -N (falls ich das für die
Config-Files nutzen sollte) checkt diesen Header und vergleicht mit der
Lokalen datei?
Oder macht es das über diesen MD5 hash?
Hallo rogger,
rogger schrieb:> bin kein Fan von Chron-gefrickel, aber wers mag...
Das Gesuchte heißt eigentlich "Cron" und ist ein bereits seit
Jahrzehnten etablierter Standard zur zeitgesteuerten Ausführung von
Hintergrund-Jobs unter unix-artigen Betriebssystemen. Wie kommst Du bloß
darauf, daß das "Gefrickel" sei?
Liebe Grüße,
Karl
>Ist das dann auch das Datum, was auf dem Zielrechner als Lastmod in der>Datei übernommen wird?
Ja, mtime kommt vom Server, für ctime wird des jetzige Datum genommen.