Raspberry Pi und die Mirrors

Ich habe meine Resourcen für Raspberry Pi zur Verfügung gestellt, auch hier ist ein Mirror der Files verfügbar. Eigentlich sogar 2, ein weiterer liegt noch auf meiner JiffyBox. Jetzt am Donnerstag sollen ja die Tests der ersten Charge über die Bühne sein.

Leider steht vor dem Erfolg der Schweiß, oder so ähnlich. Aus diesem Grund konnte das mit dem Mirror auch nicht ‚einfach so‘ klappen. Zum einen wollte ich auf meinem virtuellen Server keinen FTP-Zugang einrichten und zum andern lässt der Tarif, den ich hier für meine Webseiten gebucht habe, Directory listing nicht zu. Ich wollte auch nicht unnötig viel Arbeit für die R-Pi-Leute machen, also musste mal eben eine eigene Lösung her. Bestimmt gibt’s dafür eine Lösung auch fertig irgendwo her, aber wo ist dann der Spaß?

Also die Aufgabenstellung: synchronisiere 2 Server mit einem 3. Server und erzeuge ein Directory Listing ohne das Apache-Modul. Meine Lösung sieht vor:

  1. rsync vom raspberry-pi Server auf meinen virtuellen Server
  2. index.html erstellen für jedes Verzeichnis, mit Auflistung aller Unterverzeichnisse und Dateien
  3. Alle Dateien (inklusive der erstellten index.html) vom virtuellen Server auf den Webhosting-Server synchronisieren.

Ist alles ja gar nicht so schwer. Zu 1. wird auf dem virtuellen Server rsync ausgeführt:

rsync -azPv rsync://rsync-source/ /var/www/mirror/

Ich weiß jetzt nicht so wirklich, ob die Leute von Raspberry Pi es so gut fänden, wenn ich die Serveradresse verrate, deshalb lasse ich die hier mal weg.

Zu 2. habe ich dann ein PHP-Skript geschrieben, dass rekursiv durch die Verzeichnisse geht und entsprechende Dateien schreibt. Ja, es ist Quick & Dirty…:

<?php
function createIndex($folderName,$displayRoot) {
    $output = "<html><head><title>$folderName</title></head><body><h1>Index of $displayRoot</h1><table>";
    $i=0;
    $allEntries = null;
    $currHandle = opendir($folderName);
    if ($currHandle !== FALSE) {
        $currEntry = readdir($currHandle);
        while ($currEntry !== FALSE) {
            $allEntries[$i++] = $currEntry;
            $currEntry = readdir($currHandle);
        }
        sort($allEntries);
        foreach ($allEntries as $currEntry) {
            $procThis = $folderName . '/' . $currEntry;
            if (is_dir($procThis)) {
                if ($currEntry != '.' && $currEntry != '..') {
                    createIndex($procThis, $displayRoot . '/' . $currEntry);
                }
                $fsize = 0;
            }
            else {
                $fsize = filesize ($procThis);
            }
            if ($currEntry != '.' && $currEntry != 'index.html') {
                $output .= "\n<tr><td><a href=\"$currEntry\">$currEntry</a></td>";
                if ($fsize > 0) {
                    $output .= '<td>' . $fsize . ' bytes</td><td>' . date ("Y-m-d H:i:s.", filemtime($procThis)) . '</td>';
                }
                else {
                    $output .= '<td></td><td></td>';
                }
            }
            $output .= '</tr>';
        }
    }
    $output .="</table></body></html>";
    $handle = fopen($folderName . '/index.html','w');
    fwrite($handle,$output);
    fflush($handle);
    fclose($handle);
}
createIndex("/var/www/mirror", "/mirror");
?>

Das ganze Verzeichnis wird dann zu 3. per lftp mit dem Webhosting-Server synchronisiert:

open ftp://user:password@ftp.loco-toys.de
mirror -R -v --only-newer /var/www/mirror/ /

Diese 2 Zeilen in eine Datei geschrieben (z.B. synch.lftp) und der Aufruf erfolgt dann mit

lftp -f synch.lftp

Diese 3 Schritte werden dann noch sinnvoll in der crontab eingetragen, und schon haben wir 2 weitere Mirrors für Raspberry Pi.

Bleibt nur noch zu hoffen, dass ich überhaupt einen der Dinger aus der ersten Charge bekomme, und dass meine Mirrors nicht so beliebt sind, dass mir die Domains geperrt werden.