{"id":1033,"date":"2011-04-10T00:13:45","date_gmt":"2011-04-09T22:13:45","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=1033"},"modified":"2011-04-10T00:21:42","modified_gmt":"2011-04-09T22:21:42","slug":"dropbox-und-verzeichnis-listings","status":"publish","type":"post","link":"https:\/\/blog.benny-baumann.de\/?p=1033","title":{"rendered":"Dropbox und Verzeichnis-Listings"},"content":{"rendered":"<p>Manche Leute nutzen ja ihre Dropbox ja als Fileserver. Was in dem Zusammenhang aber etwas st\u00f6rend ist, sind die Fehlenden Directory-Indizes. Aber da l\u00e4sst sich, auch ohne einen lauff\u00e4higen Apache, schnell Abhilfe schaffen.<!--more--><\/p>\n<p>Statt n\u00e4mlich 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\u00fcr die Erzeugung bietet sich hierbei ein kleines PHP-Script an, f\u00fcr welches zwar PHP installiert sein muss, was aber auf vielen Entwicklerrechnern bereits der Fall sein d\u00fcrfte. Sollte PHP wider Erwarten nicht verf\u00fcgbar sein, ben\u00f6tigt man einfach eine normale Installation, in der die CLI-Binaries (php.exe oder php-cgi.exe) enthalten sind &#8211; ob Thread-Safe oder nicht, VC6 oder VC9 ist hierbei egal.<\/p>\n<p>Ist PHP installiert, kann es auch bereits losgehen:<\/p>\n<pre lang=\"php\" escaped=\"true\">&lt;?php\r\n\r\n$listdir = 'C:\/Dropbox\/My Dropbox\/Public';\r\n$outdir = 'C:\/Dropbox\/My Dropbox\/Public\/listings';\r\n$baselink = 'http:\/\/dl.dropbox.com\/u\/0123456\/listings';\r\n\r\nfunction DirToIndexName($dirname){\r\n    $dirname = trim($dirname, '\/\\\\');\r\n    echo \"$dirname\\n\";\r\n    return empty($dirname) ? 'index.html' : sprintf('index_%08x.html', crc32($dirname));\r\n}\r\n\r\nfunction getDirPaths($base, $dir='') {\r\n    $filelist = scandir($base.$dir);\r\n    sort($filelist);\r\n    $dirs = array('');\r\n    foreach($filelist as $file) {\r\n        if('.' == $file[0]) {\r\n            continue;\r\n        }\r\n        if(!is_dir($base.$dir.'\/'.$file)) {\r\n            continue;\r\n        }\r\n        $dirlist = getDirPaths($base, $dir.'\/'.$file);\r\n        foreach($dirlist as $dirname) {\r\n            $dirs[] = $file.'\/'.$dirname;\r\n        }\r\n    }\r\n    return $dirs;\r\n}\r\n\r\n$dirs = getDirPaths($listdir);\r\n\r\nforeach($dirs as $directory) {\r\n    $filelist = scandir($listdir.'\/'.$directory);\r\n    $listingfile = $outdir . '\/' . DirToIndexName($directory);\r\n    $listingfile_handle = fopen($listingfile, 'w');\r\n    $htmlhead = &lt;&lt;&lt;HEAD\r\n&lt;!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 3.2 Final\/\/EN\"&gt;\r\n&lt;html&gt;\r\n &lt;head&gt;\r\n  &lt;title&gt;Index of \/{$directory}&lt;\/title&gt;\r\n &lt;\/head&gt;\r\n &lt;body&gt;\r\n  &lt;h1&gt;Index of \/{$directory}&lt;\/h1&gt;\r\n  &lt;table&gt;\r\n   &lt;tr&gt;\r\n    &lt;th&gt;&lt;img src=\"\/icons\/blank.gif\" alt=\"[ICO]\"&gt;&lt;\/th&gt;\r\n    &lt;th&gt;Name&lt;\/th&gt;\r\n    &lt;th&gt;Last modified&lt;\/th&gt;\r\n    &lt;th&gt;Size&lt;\/th&gt;\r\n    &lt;th&gt;Description&lt;\/th&gt;\r\n   &lt;\/tr&gt;\r\n   &lt;tr&gt;\r\n    &lt;th colspan=\"5\"&gt;&lt;hr \/&gt;&lt;\/th&gt;\r\n   &lt;\/tr&gt;\r\nHEAD;\r\n    fputs($listingfile_handle, $htmlhead);\r\n\r\n    foreach($filelist as $file) {\r\n        if('.' == $file[0]) {\r\n            continue;\r\n        }\r\n        if(!is_dir($listdir.'\/'.$directory.'\/'.$file)) {\r\n            $filelink = htmlspecialchars(\"$baselink\/$directory$file\");\r\n            $filename = htmlspecialchars($file);\r\n            $filemtime = date('d.m.Y H:i:s', filemtime($listdir.'\/'.$directory.'\/'.$file));\r\n            $filesize = filesize($listdir.'\/'.$directory.'\/'.$file);\r\n            $icon = 'unknown';\r\n        } else {\r\n            $filelink = htmlspecialchars(DirToIndexName($directory.$file));\r\n            $filename = htmlspecialchars($file.'\/');\r\n            $filemtime = date('d.m.Y H:i:s', filemtime($listdir.'\/'.$directory.'\/'.$file));\r\n            $filesize = htmlspecialchars('&lt;DIR&gt;');\r\n            $icon = 'dir';\r\n        }\r\n        $htmlsource = &lt;&lt;&lt;LINE\r\n   &lt;tr&gt;\r\n    &lt;td valign=\"top\"&gt;&lt;img src=\"\/icons\/{$icon}.gif\" alt=\"[FILE]\"&gt;&lt;\/td&gt;\r\n    &lt;td&gt;&lt;a href=\"$filelink\"&gt;$filename&lt;\/a&gt;&lt;\/td&gt;\r\n    &lt;td align=\"right\"&gt;$filemtime&lt;\/td&gt;\r\n    &lt;td align=\"right\"&gt;$filesize&lt;\/td&gt;\r\n    &lt;td&gt;&amp;nbsp;&lt;\/td&gt;\r\n   &lt;\/tr&gt;\r\nLINE;\r\n        fputs($listingfile_handle, $htmlsource);\r\n    }\r\n\r\n    $htmltail = &lt;&lt;&lt;TAIL\r\n   &lt;tr&gt;\r\n    &lt;th colspan=\"5\"&gt;&lt;hr \/&gt;&lt;\/th&gt;\r\n   &lt;\/tr&gt;\r\n  &lt;\/table&gt;\r\n  &lt;address&gt;BenBEFileLister\/0.42 (Debilian) Server at foo.bar.baz Port 4711&lt;\/address&gt;\r\n &lt;\/body&gt;\r\n&lt;\/html&gt;\r\nTAIL;\r\n    fputs($listingfile_handle, $htmltail);\r\n\r\n    fclose($listingfile_handle);\r\n}\r\n?&gt;<\/pre>\n<p>Das Script bekommt durch die oben definierten 3 Variablen eine Reihe von Daten \u00fcbergeben. 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\u00fcckfrage \u00fcberschrieben, was genutzt werden kann, um einen bestehenden Index zu aktualisieren. Das Script l\u00f6scht keine alten Dateien, die nicht mehr ben\u00f6tigt werden. Die dritte Variable schlie\u00dflich gibt an, wo die zu indizierenden Dateien in der Dropbox zu finden sind. Alle 3 Variablen M\u00dcSSEN ohne abschlie\u00dfenden Slash angegeben werden. Zudem sollte man generell \/ als Pfadtrennzeichen verwenden.<\/p>\n<p>F\u00fcr die ganz Faulen unter uns darf das Ausgabe-Verzeichnis nat\u00fcrlich auch gleich in der Dropbox liegen \ud83d\ude09<\/p>\n<p class=\"wp-flattr-button\"><a href=\"https:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=1033&amp;md5=425a0d161c73d92fd300dda82fb7bfe4\" title=\"Flattr\" target=\"_blank\"><img src=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" srcset=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" alt=\"Flattr this!\"\/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Manche Leute nutzen ja ihre Dropbox ja als Fileserver. Was in dem Zusammenhang aber etwas st\u00f6rend ist, sind die Fehlenden Directory-Indizes. Aber da l\u00e4sst sich, auch ohne einen lauff\u00e4higen Apache, schnell Abhilfe schaffen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[29],"tags":[156,98,69,21],"class_list":["post-1033","post","type-post","status-publish","format-standard","hentry","category-software","tag-apache","tag-developement","tag-internet","tag-php"],"_links":{"self":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1033"}],"version-history":[{"count":5,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1033\/revisions"}],"predecessor-version":[{"id":1035,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/1033\/revisions\/1035"}],"wp:attachment":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1033"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1033"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}