annotate decoupage/cli.py @ 88:c382bdd01751

directory indicator
author Jeff Hammel <k0scist@gmail.com>
date Sun, 12 Jan 2014 19:20:16 -0800
parents a9f5b60006ba
children 450aff4c97e3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 #!/usr/bin/env python
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 """
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4 serve directory with decoupage, e.g.
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6 ``decoupage --port 8080 /home/jhammel/tmp``
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8 If the directory is not specified, the current working directory is used
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
9 """
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
11 import optparse
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12 import os
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
13 import socket
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 import sys
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
15
88
c382bdd01751 directory indicator
Jeff Hammel <k0scist@gmail.com>
parents: 86
diff changeset
16 from .formatters import Datestamp, Sort, Up, DirectoryIndicator
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
17 from .web import Decoupage
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18 from wsgiref import simple_server
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
19
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
20 here = os.path.dirname(os.path.realpath(__file__))
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
21
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
22 class DecoupageServer(Decoupage):
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
23 """serve locally with decoupage"""
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
24 # TODO: deprecate; move Decoupage to a few classes
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
25 # with more flexible formatters
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
26 def __init__(self, *args, **kwargs):
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
27 Decoupage.__init__(self, **kwargs)
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
28 # default formatters
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
29 # TODO: make configurable
88
c382bdd01751 directory indicator
Jeff Hammel <k0scist@gmail.com>
parents: 86
diff changeset
30 self._formatters = [Sort(),
c382bdd01751 directory indicator
Jeff Hammel <k0scist@gmail.com>
parents: 86
diff changeset
31 DirectoryIndicator('/'),
c382bdd01751 directory indicator
Jeff Hammel <k0scist@gmail.com>
parents: 86
diff changeset
32 Up('..'),
c382bdd01751 directory indicator
Jeff Hammel <k0scist@gmail.com>
parents: 86
diff changeset
33 Datestamp('modified: %m %d, %Y')]
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
34 def get_formatters(self, path):
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
35 return self._formatters
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
36
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
37
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
38 def main(args=sys.argv[1:]):
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
39
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
40 # parse command line options
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
41 usage = '%prog [options]'
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
42 parser = optparse.OptionParser(usage=usage, description=__doc__)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
43 parser.add_option('-p', '--port', dest='port',
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
44 type='int', default=1977,
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
45 help="port to serve on [DEFAULT: %default]")
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
46 parser.add_option('-a', '--address', dest='address',
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
47 default='0.0.0.0',
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
48 help="address to serve on [DEFAULT: %default]")
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
49 parser.add_option('--no-reload', dest='auto_reload',
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
50 action='store_false', default=True,
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
51 help="do not dynamically refresh indices")
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
52 parser.add_option('--no-print-ip', dest='print_ip',
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
53 action='store_false', default=True,
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
54 help="do not print resolvable IP address")
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
55 options, args = parser.parse_args(args)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
56 if not args:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
57 directory = os.getcwd()
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
58 elif len(args) == 1:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
59 directory = args[0]
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
60 if len(args) > 1:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
61 # TODO:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
62 # allow multiple directories with mount points
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
63 # e.g. `decoupage [options] directory [directory2=/foo] [...]`
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
64 # This may be done by creating a temporary directory with appropriate
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
65 # symbolic links (on OSes that allow them)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
66
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
67 parser.print_help()
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68 parser.exit(1)
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
69 if not os.path.isdir(directory):
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
70 raise OSError("'%s' is not a directory" % directory)
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
72 # create WSGI app
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73 # TODO:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
74 # - allow CLI specification of formatters
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
75 # - template specification
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
76 app = DecoupageServer(directory=directory,
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
77 auto_reload=options.auto_reload)
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
78
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
79
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
80 # create server
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
81 # TODO: allow choice amongst server classes
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
82 printable_address = '127.0.0.1' if options.address == '0.0.0.0' else options.address
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
83 server = simple_server.make_server(options.address, options.port, app)
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
84 print 'serving directory %s ( %s ) at \nhttp://%s:%d/' % (directory,
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
85 'file://' + directory, # XXX
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
86 printable_address,
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
87 options.port)
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
88 if options.print_ip:
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
89 # from http://stackoverflow.com/questions/166506/finding-local-ip-addresses-using-pythons-stdlib
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
90 hostname = "google.com"
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
91 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
92 s.connect((hostname,80))
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
93 hostname = s.getsockname()[0]
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
94 print "http://%s:%s/" % (hostname, options.port)
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
95 s.close()
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
96
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
97 # serve directory contents via decoupage
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
98 try:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
99 server.serve_forever()
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
100 except KeyboardInterrupt:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
101 pass
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
102
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
103 if __name__ == '__main__':
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
104 main()