annotate decoupage/cli.py @ 85:3262010f7f79

add command line serving
author Jeff Hammel <jhammel@mozilla.com>
date Sat, 28 Dec 2013 21:56:06 -0800
parents 95820b36d7e3
children a9f5b60006ba
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
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
16 from .formatters import Sort, Up
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
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
30 self._formatters = [Sort(), Up('..')]
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
31 def get_formatters(self, path):
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
32 return self._formatters
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
33
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
34
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
35 def main(args=sys.argv[1:]):
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
36
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
37 # parse command line options
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
38 usage = '%prog [options]'
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
39 parser = optparse.OptionParser(usage=usage, description=__doc__)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
40 parser.add_option('-p', '--port', dest='port',
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
41 type='int', default=1977,
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
42 help="port to serve on [DEFAULT: %default]")
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
43 parser.add_option('-a', '--address', dest='address',
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
44 default='0.0.0.0',
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
45 help="address to serve on [DEFAULT: %default]")
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
46 parser.add_option('--no-reload', dest='auto_reload',
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
47 action='store_false', default=True,
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
48 help="do not dynamically refresh indices")
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
49 parser.add_option('--no-print-ip', dest='print_ip',
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
50 action='store_false', default=True,
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
51 help="do not print resolvable IP address")
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
52 options, args = parser.parse_args(args)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
53 if not args:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
54 directory = os.getcwd()
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
55 elif len(args) == 1:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
56 directory = args[0]
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
57 if len(args) > 1:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
58 # TODO:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
59 # allow multiple directories with mount points
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
60 # e.g. `decoupage [options] directory [directory2=/foo] [...]`
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
61 # This may be done by creating a temporary directory with appropriate
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
62 # symbolic links (on OSes that allow them)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
63
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
64 parser.print_help()
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
65 parser.exit(1)
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
66 if not os.path.isdir(directory):
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
67 raise OSError("'%s' is not a directory" % directory)
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
69 # create WSGI app
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
70 # TODO:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71 # - allow CLI specification of formatters
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72 # - template specification
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
73 app = DecoupageServer(directory=directory,
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
74 auto_reload=options.auto_reload)
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
75
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
76
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
77 # create server
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
78 # TODO: allow choice amongst server classes
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
79 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
80 server = simple_server.make_server(options.address, options.port, app)
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
81 print 'serving directory %s ( %s ) at \nhttp://%s:%d/' % (directory,
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
82 'file://' + directory, # XXX
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
83 printable_address,
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
84 options.port)
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
85 if options.print_ip:
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
86 # 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
87 hostname = "google.com"
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
88 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
89 s.connect((hostname,80))
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
90 hostname = s.getsockname()[0]
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
91 print "http://%s:%s/" % (hostname, options.port)
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
92 s.close()
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
93
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
94 # serve directory contents via decoupage
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
95 try:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
96 server.serve_forever()
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
97 except KeyboardInterrupt:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
98 pass
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
99
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
100 if __name__ == '__main__':
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
101 main()