Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/virtual/benny-baumann.de/blog/htdocs/wp-includes/post-template.php on line 316

Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/virtual/benny-baumann.de/blog/htdocs/wp-includes/post-template.php on line 316

BenBE's humble thoughts Thoughts the world doesn't need yet …

10.04.2011

Dropbox und Verzeichnis-Listings

Filed under: Software — Schlagwörter: , , , — BenBE @ 00:13:45

Manche Leute nutzen ja ihre Dropbox ja als Fileserver. Was in dem Zusammenhang aber etwas störend ist, sind die Fehlenden Directory-Indizes. Aber da lässt sich, auch ohne einen lauffähigen Apache, schnell Abhilfe schaffen.

Statt nämlich die Index-Listings vom Apache schreiben zu lassen, reicht es normalerweise vollkommen aus, die Dateien einmal statisch zu indizieren und nur die resultierenden Index-Dateien in seine Dropbox zu legen. Für die Erzeugung bietet sich hierbei ein kleines PHP-Script an, für welches zwar PHP installiert sein muss, was aber auf vielen Entwicklerrechnern bereits der Fall sein dürfte. Sollte PHP wider Erwarten nicht verfügbar sein, benötigt man einfach eine normale Installation, in der die CLI-Binaries (php.exe oder php-cgi.exe) enthalten sind – ob Thread-Safe oder nicht, VC6 oder VC9 ist hierbei egal.

Ist PHP installiert, kann es auch bereits losgehen:

<?php
 
$listdir = 'C:/Dropbox/My Dropbox/Public';
$outdir = 'C:/Dropbox/My Dropbox/Public/listings';
$baselink = 'http://dl.dropbox.com/u/0123456/listings';
 
function DirToIndexName($dirname){
    $dirname = trim($dirname, '/\\');
    echo "$dirname\n";
    return empty($dirname) ? 'index.html' : sprintf('index_%08x.html', crc32($dirname));
}
 
function getDirPaths($base, $dir='') {
    $filelist = scandir($base.$dir);
    sort($filelist);
    $dirs = array('');
    foreach($filelist as $file) {
        if('.' == $file[0]) {
            continue;
        }
        if(!is_dir($base.$dir.'/'.$file)) {
            continue;
        }
        $dirlist = getDirPaths($base, $dir.'/'.$file);
        foreach($dirlist as $dirname) {
            $dirs[] = $file.'/'.$dirname;
        }
    }
    return $dirs;
}
 
$dirs = getDirPaths($listdir);
 
foreach($dirs as $directory) {
    $filelist = scandir($listdir.'/'.$directory);
    $listingfile = $outdir . '/' . DirToIndexName($directory);
    $listingfile_handle = fopen($listingfile, 'w');
    $htmlhead = <<<HEAD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /{$directory}</title>
 </head>
 <body>
  <h1>Index of /{$directory}</h1>
  <table>
   <tr>
    <th><img src="/icons/blank.gif" alt="[ICO]"></th>
    <th>Name</th>
    <th>Last modified</th>
    <th>Size</th>
    <th>Description</th>
   </tr>
   <tr>
    <th colspan="5"><hr /></th>
   </tr>
HEAD;
    fputs($listingfile_handle, $htmlhead);
 
    foreach($filelist as $file) {
        if('.' == $file[0]) {
            continue;
        }
        if(!is_dir($listdir.'/'.$directory.'/'.$file)) {
            $filelink = htmlspecialchars("$baselink/$directory$file");
            $filename = htmlspecialchars($file);
            $filemtime = date('d.m.Y H:i:s', filemtime($listdir.'/'.$directory.'/'.$file));
            $filesize = filesize($listdir.'/'.$directory.'/'.$file);
            $icon = 'unknown';
        } else {
            $filelink = htmlspecialchars(DirToIndexName($directory.$file));
            $filename = htmlspecialchars($file.'/');
            $filemtime = date('d.m.Y H:i:s', filemtime($listdir.'/'.$directory.'/'.$file));
            $filesize = htmlspecialchars('<DIR>');
            $icon = 'dir';
        }
        $htmlsource = <<<LINE
   <tr>
    <td valign="top"><img src="/icons/{$icon}.gif" alt="[FILE]"></td>
    <td><a href="$filelink">$filename</a></td>
    <td align="right">$filemtime</td>
    <td align="right">$filesize</td>
    <td>&nbsp;</td>
   </tr>
LINE;
        fputs($listingfile_handle, $htmlsource);
    }
 
    $htmltail = <<<TAIL
   <tr>
    <th colspan="5"><hr /></th>
   </tr>
  </table>
  <address>BenBEFileLister/0.42 (Debilian) Server at foo.bar.baz Port 4711</address>
 </body>
</html>
TAIL;
    fputs($listingfile_handle, $htmltail);
 
    fclose($listingfile_handle);
}
?>

Das Script bekommt durch die oben definierten 3 Variablen eine Reihe von Daten übergeben. Die erste Variable gibt dabei an, WO im Dateisystem die zu indizierenden Verzeichnisse (lokal) zu finden sind. Die zweite Variable gibt das (existierende) Verzeichnis an, wo die Index-Dateien hingeschrieben werden sollen. Bestehende Dateien in diesem Ausgabe-Verzeichnis werden ohne Rückfrage überschrieben, was genutzt werden kann, um einen bestehenden Index zu aktualisieren. Das Script löscht keine alten Dateien, die nicht mehr benötigt werden. Die dritte Variable schließlich gibt an, wo die zu indizierenden Dateien in der Dropbox zu finden sind. Alle 3 Variablen MÜSSEN ohne abschließenden Slash angegeben werden. Zudem sollte man generell / als Pfadtrennzeichen verwenden.

Für die ganz Faulen unter uns darf das Ausgabe-Verzeichnis natürlich auch gleich in der Dropbox liegen 😉

Flattr this!

Keine Kommentare »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress