Mercurial > hg > bitsyblog
annotate bitsyblog/blogme.py @ 69:bcc3a59713c3
1st steps to have blog post entry handler plugins
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Wed, 07 Jul 2010 13:58:21 -0700 |
parents | 894a2e76bd40 |
children | 3da163e44b8a |
rev | line source |
---|---|
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
44 | 2 """ |
3 command line blogger | |
4 """ | |
5 | |
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
6 import optparse |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
7 import os |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
8 import subprocess |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
9 import sys |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
10 import tempfile |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
11 import urllib2 |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
12 |
44 | 13 from ConfigParser import ConfigParser |
45 | 14 from utils import datestamp |
44 | 15 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
16 # global variable |
44 | 17 CONFIG = '.blogme' |
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
18 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
19 def tmpbuffer(editor=None): |
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
20 """open an editor and retreive the resulting editted buffer""" |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
21 if not editor: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
22 editor = os.environ['EDITOR'] |
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
23 tmpfile = tempfile.mktemp(suffix='.txt') |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
24 cmdline = editor.split() |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
25 cmdline.append(tmpfile) |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
26 edit = subprocess.call(cmdline) |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
27 buffer = file(tmpfile).read().strip() |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
28 os.remove(tmpfile) |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
29 return buffer |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
30 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
31 def main(args=sys.argv[1:]): |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
32 |
44 | 33 # parse command line options |
67
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
34 parser = optparse.OptionParser(description=__doc__) |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
35 parser.add_option('-c', '--config', |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
36 help='configuration file to use [Default: ~/.blogme]') |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
37 parser.add_option('-f', '--file', |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
38 help='path to blog entries for the user; does not touch net') |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
39 parser.add_option('-H', '--host', |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
40 help='URL of bitsyblog instance') |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
41 parser.add_option('-u', '--user') |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
42 parser.add_option('-p', '--password') |
67
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
43 parser.add_option('--private', action='store_true', default=False, |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
44 help='denote this blog entry as private') |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
45 parser.add_option('--secret', action='store_true', default=False, |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
46 help='denote this blog entry as secret') |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
47 options, args = parser.parse_args() |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
48 |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
49 # sanity check |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
50 if options.private and options.secret: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
51 print "post can't be secret and private!" |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
52 sys.exit(1) |
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
53 |
45 | 54 if options.file: |
55 # get the blog | |
56 if args: | |
57 msg = ' '.join(args) | |
58 else: | |
59 msg = tmpbuffer() | |
60 options.file = os.path.join(options.file, 'entries') | |
61 for opt in 'private', 'secret': | |
62 if getattr(options, opt): | |
63 options.file = os.path.join(options.file, opt) | |
64 break | |
65 else: | |
66 options.file = os.path.join(options.file, 'public') | |
67 options.file = os.path.join(options.file, datestamp()) | |
68 f = file(options.file, 'w') | |
69 print >> f, msg | |
70 f.close() | |
71 sys.exit(0) | |
72 | |
44 | 73 # parse dotfile config |
74 config = ConfigParser() | |
45 | 75 _config = {} # config to write out |
44 | 76 if not options.config: |
77 home = os.environ['HOME'] | |
78 options.config = os.path.join(home, CONFIG) | |
79 if os.path.exists(options.config): | |
80 config.read(options.config) | |
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
81 |
45 | 82 # get default host, if available |
83 if options.host: | |
46
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
84 if not config.has_option('DEFAULTS', 'host'): |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
85 _config['default'] = options.host |
45 | 86 else: |
87 if config.has_option('DEFAULTS', 'host'): | |
88 options.host = config.get('DEFAULTS', 'host') | |
89 else: | |
90 print "Enter URL of host: ", | |
46
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
91 options.host = raw_input() |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
92 _config['default'] = options.host |
45 | 93 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
94 # determine user name and password |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
95 fields = [ 'user', 'password' ] |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
96 for field in fields: |
46
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
97 has_option = config.has_option(options.host, field) |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
98 |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
99 if getattr(options, field): |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
100 if (not has_option) or (config.get(options.host, field) != getattr(options, field)): |
45 | 101 _config[field] = getattr(options, field) |
102 else: | |
46
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
103 if has_option: |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
104 setattr(options, field, config.get(options.host, field)) |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
105 else: |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
106 print "%s: " % field, |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
107 setattr(options, field, raw_input()) |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
108 _config[field] = getattr(options, field) |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
109 |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
110 # write the dotfile if it doesn't exist |
45 | 111 if _config: |
112 if 'default' in _config: | |
113 if not config.has_section('DEFAULTS'): | |
114 config.add_section('DEFAULTS') | |
115 config.set('DEFAULTS', 'host', options.host) | |
116 if not config.has_section(options.host): | |
117 config.add_section(options.host) | |
118 for field in fields: | |
119 if not config.has_option(options.host, field): | |
120 config.set(options.host, field, getattr(options, field)) | |
46
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
121 config.write(file(options.config, 'w')) |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
122 |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
123 # get the blog |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
124 if args: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
125 msg = ' '.join(args) |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
126 else: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
127 msg = tmpbuffer() |
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
128 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
129 # open the url |
44 | 130 url = options.host |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
131 url += '?auth=digest' # specify authentication method |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
132 if options.private: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
133 url += '&privacy=private' |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
134 if options.secret: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
135 url += '&privacy=secret' |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
136 authhandler = urllib2.HTTPDigestAuthHandler() |
45 | 137 authhandler.add_password('bitsyblog', url, options.user, options.password) |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
138 opener = urllib2.build_opener(authhandler) |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
139 urllib2.install_opener(opener) |
61 | 140 attempts = 5 |
141 for i in range(attempts): | |
142 try: | |
143 connection = urllib2.urlopen(url, data=msg) | |
144 print connection.url # print the blog post's url | |
145 break | |
65
4e41e1084e56
better exception handling, i hope; i hate lost messages
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
146 except (urllib2.HTTPError, urllib2.URLError), e: |
4e41e1084e56
better exception handling, i hope; i hate lost messages
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
147 continue |
4e41e1084e56
better exception handling, i hope; i hate lost messages
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
148 else: |
4e41e1084e56
better exception handling, i hope; i hate lost messages
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
149 print >> sys.stderr, e |
4e41e1084e56
better exception handling, i hope; i hate lost messages
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
150 print msg |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
151 |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
152 if __name__ == '__main__': |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
153 main() |