Mercurial > hg > bitsyblog
annotate bitsyblog/blogme.py @ 133:ce478807848e default tip
py3
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Mon, 28 Dec 2020 21:18:19 +0000 |
parents | c29d58e79fc6 |
children |
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 | |
92 | 6 import datetime |
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 |
93 | 9 import socket |
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
10 import subprocess |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
11 import sys |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
12 import tempfile |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
13 import urllib2 |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
14 |
44 | 15 from ConfigParser import ConfigParser |
45 | 16 from utils import datestamp |
44 | 17 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
18 # global variable |
44 | 19 CONFIG = '.blogme' |
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
20 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
21 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
|
22 """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
|
23 if not editor: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
24 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
|
25 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
|
26 cmdline = editor.split() |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
27 cmdline.append(tmpfile) |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
28 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
|
29 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
|
30 os.remove(tmpfile) |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
31 return buffer |
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
32 |
96
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
33 def save(msg): |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
34 """save msg if somethingbadhappen""" |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
35 filename = 'blog-%s.txt' % datetime.datetime.now().strftime("%Y%m%d") |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
36 with file(filename, 'w') as f: |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
37 f.write(msg) |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
38 print filename |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
39 print msg |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
40 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
41 def main(args=sys.argv[1:]): |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
42 |
44 | 43 # parse command line options |
67
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
44 parser = optparse.OptionParser(description=__doc__) |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
45 parser.add_option('-c', '--config', |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
46 help='configuration file to use [Default: ~/.blogme]') |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
47 parser.add_option('-f', '--file', |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
48 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
|
49 parser.add_option('-H', '--host', |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
50 help='URL of bitsyblog instance') |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
51 parser.add_option('-u', '--user') |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
52 parser.add_option('-p', '--password') |
67
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
53 parser.add_option('--private', action='store_true', default=False, |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
54 help='denote this blog entry as private') |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
55 parser.add_option('--secret', action='store_true', default=False, |
894a2e76bd40
add documentation to the OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
56 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
|
57 options, args = parser.parse_args() |
96
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
58 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
59 # sanity check |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
60 if options.private and options.secret: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
61 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
|
62 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
|
63 |
45 | 64 if options.file: |
65 # get the blog | |
66 if args: | |
67 msg = ' '.join(args) | |
68 else: | |
69 msg = tmpbuffer() | |
70 options.file = os.path.join(options.file, 'entries') | |
71 for opt in 'private', 'secret': | |
72 if getattr(options, opt): | |
73 options.file = os.path.join(options.file, opt) | |
74 break | |
75 else: | |
76 options.file = os.path.join(options.file, 'public') | |
77 options.file = os.path.join(options.file, datestamp()) | |
78 f = file(options.file, 'w') | |
79 print >> f, msg | |
80 f.close() | |
77
3da163e44b8a
print the absolute path to the blog file
Jeff Hammel <jhammel@mozilla.com>
parents:
67
diff
changeset
|
81 print os.path.abspath(options.file) |
45 | 82 sys.exit(0) |
83 | |
44 | 84 # parse dotfile config |
85 config = ConfigParser() | |
45 | 86 _config = {} # config to write out |
44 | 87 if not options.config: |
88 home = os.environ['HOME'] | |
89 options.config = os.path.join(home, CONFIG) | |
90 if os.path.exists(options.config): | |
91 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
|
92 |
45 | 93 # get default host, if available |
94 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
|
95 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
|
96 _config['default'] = options.host |
45 | 97 else: |
98 if config.has_option('DEFAULTS', 'host'): | |
99 options.host = config.get('DEFAULTS', 'host') | |
100 else: | |
101 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
|
102 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
|
103 _config['default'] = options.host |
45 | 104 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
105 # determine user name and password |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
106 fields = [ 'user', 'password' ] |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
107 for field in fields: |
96
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
108 has_option = config.has_option(options.host, 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
|
109 |
66bfcceea3b4
improvements to blogme....it works except for a mysterious conncection reset by peer error"
k0s <k0scist@gmail.com>
parents:
45
diff
changeset
|
110 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
|
111 if (not has_option) or (config.get(options.host, field) != getattr(options, field)): |
45 | 112 _config[field] = getattr(options, field) |
113 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
|
114 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
|
115 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
|
116 else: |
96
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
117 print "%s: " % 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
|
118 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
|
119 _config[field] = getattr(options, field) |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
120 |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
121 # write the dotfile if it doesn't exist |
45 | 122 if _config: |
123 if 'default' in _config: | |
124 if not config.has_section('DEFAULTS'): | |
125 config.add_section('DEFAULTS') | |
126 config.set('DEFAULTS', 'host', options.host) | |
127 if not config.has_section(options.host): | |
128 config.add_section(options.host) | |
129 for field in fields: | |
130 if not config.has_option(options.host, field): | |
131 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
|
132 config.write(file(options.config, 'w')) |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
133 |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
134 # get the blog |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
135 if args: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
136 msg = ' '.join(args) |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
137 else: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
138 msg = tmpbuffer() |
0
e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
139 |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
140 # open the url |
44 | 141 url = options.host |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
142 url += '?auth=digest' # specify authentication method |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
143 if options.private: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
144 url += '&privacy=private' |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
145 if options.secret: |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
146 url += '&privacy=secret' |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
147 authhandler = urllib2.HTTPDigestAuthHandler() |
45 | 148 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
|
149 opener = urllib2.build_opener(authhandler) |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
150 urllib2.install_opener(opener) |
61 | 151 attempts = 5 |
152 for i in range(attempts): | |
153 try: | |
154 connection = urllib2.urlopen(url, data=msg) | |
155 print connection.url # print the blog post's url | |
156 break | |
96
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
157 except urllib2.HTTPError, e: |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
158 if (e.code == 404) and (options.secret or options.private): |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
159 # we are still anonymous so we can't see our own post |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
160 break |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
161 continue |
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
162 except (urllib2.URLError, socket.error), e: |
65
4e41e1084e56
better exception handling, i hope; i hate lost messages
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
163 continue |
92 | 164 except: |
165 print >> sys.stderr, "An error has occured:" | |
166 print >> sys.stderr, sys.exc_info() # XXX pretty crappy | |
96
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
167 save(msg) |
92 | 168 break |
65
4e41e1084e56
better exception handling, i hope; i hate lost messages
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
169 else: |
4e41e1084e56
better exception handling, i hope; i hate lost messages
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
170 print >> sys.stderr, e |
96
c29d58e79fc6
better command line handling
Jeff Hammel <jhammel@mozilla.com>
parents:
93
diff
changeset
|
171 save(msg) |
43
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
172 |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
173 if __name__ == '__main__': |
8b9aa9f40fa5
moving most of blogme to its own function
k0s <k0scist@gmail.com>
parents:
42
diff
changeset
|
174 main() |