X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=cmd%2Fweb-cmd.py;h=2ddc0b1a345737ee7998afecd1005a9a58a7948b;hb=96d4110838158be0f60484cfc84ac3a56772e09b;hp=484041ac112c8993fd8e37652451ae7975203133;hpb=68738a00ae985161a291a4feebbe9ea85512bf4f;p=bup.git diff --git a/cmd/web-cmd.py b/cmd/web-cmd.py index 484041a..2ddc0b1 100755 --- a/cmd/web-cmd.py +++ b/cmd/web-cmd.py @@ -1,7 +1,15 @@ -#!/usr/bin/env python -import sys, stat, urllib, mimetypes, posixpath, time +#!/bin/sh +"""": # -*-python-*- +bup_python="$(dirname "$0")/bup-python" || exit $? +exec "$bup_python" "$0" ${1+"$@"} +""" +# end of bup preamble + +import mimetypes, os, posixpath, stat, sys, time, urllib, webbrowser + from bup import options, git, vfs -from bup.helpers import * +from bup.helpers import debug1, handle_ctrl_c, log, resource_path + try: import tornado.httpserver import tornado.ioloop @@ -10,6 +18,7 @@ except ImportError: log('error: cannot find the python "tornado" module; please install it\n') sys.exit(1) + handle_ctrl_c() @@ -47,21 +56,22 @@ def _compute_dir_contents(n, path, show_hidden=False): if path != "/": yield('..', '../' + url_append, '') for sub in n: - display = link = sub.name + display = sub.name + link = urllib.quote(sub.name) # link should be based on fully resolved type to avoid extra # HTTP redirect. if stat.S_ISDIR(sub.try_resolve().mode): - link = sub.name + "/" + link += "/" if not show_hidden and len(display)>1 and display.startswith('.'): continue size = None if stat.S_ISDIR(sub.mode): - display = sub.name + '/' + display += '/' elif stat.S_ISLNK(sub.mode): - display = sub.name + '@' + display += '@' else: size = sub.size() size = (opt.human_readable and format_filesize(size)) or size @@ -103,7 +113,7 @@ class BupRequestHandler(tornado.web.RequestHandler): try: show_hidden = int(self.request.arguments.get('hidden', [0])[-1]) - except ValueError, e: + except ValueError as e: show_hidden = False self.render( @@ -143,6 +153,8 @@ class BupRequestHandler(tornado.web.RequestHandler): self.request.connection.stream.write(blob, callback=lambda: me(me)) write_more(write_more) + else: + self.finish() def _guess_type(self, path): """Guess the type of a file. @@ -184,6 +196,7 @@ optspec = """ bup web [[hostname]:port] -- human-readable display human readable file sizes (i.e. 3.9K, 4.7M) +browser open the site in the default browser """ o = options.Options(optspec) (opt, flags, extra) = o.parse(sys.argv[1:]) @@ -213,16 +226,18 @@ application = tornado.web.Application([ (r"(/.*)", BupRequestHandler), ], **settings) -if __name__ == "__main__": - http_server = tornado.httpserver.HTTPServer(application) - http_server.listen(address[1], address=address[0]) +http_server = tornado.httpserver.HTTPServer(application) +http_server.listen(address[1], address=address[0]) - try: - sock = http_server._socket # tornado < 2.0 - except AttributeError, e: - sock = http_server._sockets.values()[0] +try: + sock = http_server._socket # tornado < 2.0 +except AttributeError as e: + sock = http_server._sockets.values()[0] - print "Serving HTTP on %s:%d..." % sock.getsockname() - loop = tornado.ioloop.IOLoop.instance() - loop.start() +print "Serving HTTP on %s:%d..." % sock.getsockname() +loop = tornado.ioloop.IOLoop.instance() +if opt.browser: + browser_addr = 'http://' + address[0] + ':' + str(address[1]) + loop.add_callback(lambda : webbrowser.open(browser_addr)) +loop.start()