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