Mercurial > hg > bitsyblog
comparison blogme.py @ 0:e3823be6a423
initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
| author | k0s <k0scist@gmail.com> |
|---|---|
| date | Sat, 12 Sep 2009 16:06:57 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:e3823be6a423 |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 | |
| 3 import optparse | |
| 4 import os | |
| 5 import subprocess | |
| 6 import sys | |
| 7 import tempfile | |
| 8 import urllib2 | |
| 9 | |
| 10 # global variables | |
| 11 | |
| 12 EDITOR='emacs -nw' | |
| 13 SERVER='http://bitsyblog.biz' | |
| 14 dotfile='.blogme' | |
| 15 | |
| 16 parser = optparse.OptionParser() | |
| 17 parser.add_option('-s', '--server', default=SERVER) | |
| 18 parser.add_option('-u', '--user') | |
| 19 parser.add_option('-p', '--password') | |
| 20 parser.add_option('--private', action='store_true', default=False) | |
| 21 parser.add_option('--secret', action='store_true', default=False) | |
| 22 | |
| 23 options, args = parser.parse_args() | |
| 24 | |
| 25 if options.private and options.secret: | |
| 26 print "post can't be secret and private!" | |
| 27 sys.exit(1) | |
| 28 | |
| 29 # parse dotfile | |
| 30 | |
| 31 home = os.environ.get('HOME') | |
| 32 if home: | |
| 33 dotfile = os.path.join(home, dotfile) | |
| 34 if os.path.exists(dotfile): | |
| 35 prefs = file(dotfile).read().split('\n') | |
| 36 prefs = [ i for i in prefs if i.strip() ] | |
| 37 prefs = [ [ j.strip() for j in i.split(':', 1) ] for i in prefs | |
| 38 if ':' in i] # probably not necessary | |
| 39 prefs = dict(prefs) | |
| 40 else: | |
| 41 prefs = {} | |
| 42 | |
| 43 # determine user name and password | |
| 44 fields = [ 'user', 'password' ] | |
| 45 for field in fields: | |
| 46 globals()[field] = prefs.get(field) | |
| 47 | |
| 48 optval = getattr(options, field) | |
| 49 if optval: | |
| 50 password = None # needed to ensure prompting for pw from command line | |
| 51 globals()[field] = optval | |
| 52 | |
| 53 if globals()[field] is None: | |
| 54 globals()[field] = raw_input('%s: ' % field) | |
| 55 assert user is not None | |
| 56 assert password is not None | |
| 57 | |
| 58 # write the dotfile if it doesn't exist | |
| 59 if not os.path.exists(dotfile): | |
| 60 preffile = file(dotfile, 'w') | |
| 61 print >> preffile, 'user: %s' % user | |
| 62 print >> preffile, 'password: %s' % password | |
| 63 preffile.close() | |
| 64 os.chmod(dotfile, 0600) | |
| 65 | |
| 66 def tmpbuffer(editor=EDITOR): | |
| 67 """open an editor and retreive the resulting editted buffer""" | |
| 68 tmpfile = tempfile.mktemp(suffix='.txt') | |
| 69 cmdline = editor.split() | |
| 70 cmdline.append(tmpfile) | |
| 71 edit = subprocess.call(cmdline) | |
| 72 buffer = file(tmpfile).read().strip() | |
| 73 os.remove(tmpfile) | |
| 74 return buffer | |
| 75 | |
| 76 # get the blog | |
| 77 | |
| 78 if args: | |
| 79 msg = ' '.join(args) | |
| 80 else: | |
| 81 msg = tmpbuffer() | |
| 82 | |
| 83 # open the url | |
| 84 | |
| 85 url = '/'.join((options.server, user)) | |
| 86 url += '?auth=digest' # specify authentication method | |
| 87 | |
| 88 if options.private: | |
| 89 url += '&privacy=private' | |
| 90 if options.secret: | |
| 91 url += '&privacy=secret' | |
| 92 | |
| 93 authhandler = urllib2.HTTPDigestAuthHandler() | |
| 94 authhandler.add_password('bitsyblog', url, user, password) | |
| 95 opener = urllib2.build_opener(authhandler) | |
| 96 urllib2.install_opener(opener) | |
| 97 | |
| 98 try: | |
| 99 url = urllib2.urlopen(url, data=msg) | |
| 100 print url.url # print the blog post's url | |
| 101 except urllib2.HTTPError: | |
| 102 pass |
