view bitsyblog/blogme.py @ 43:8b9aa9f40fa5

moving most of blogme to its own function
author k0s <k0scist@gmail.com>
date Wed, 11 Nov 2009 19:25:21 -0500
parents ffe95e34066f
children 0e7f56709c90
line wrap: on
line source

#!/usr/bin/env python

import optparse
import os
import subprocess
import sys
import tempfile
import urllib2

# global variable
dotfile='.blogme'

def tmpbuffer(editor=None):
    """open an editor and retreive the resulting editted buffer"""
    if not editor:
        editor = os.environ['EDITOR']
    tmpfile = tempfile.mktemp(suffix='.txt')
    cmdline = editor.split()
    cmdline.append(tmpfile)
    edit = subprocess.call(cmdline)
    buffer = file(tmpfile).read().strip()
    os.remove(tmpfile)
    return buffer

def main(args=sys.argv[1:]):

    # create the option parser
    parser = optparse.OptionParser()
    parser.add_option('-s', '--server')
    parser.add_option('-u', '--user')
    parser.add_option('-p', '--password')
    parser.add_option('--private', action='store_true', default=False)
    parser.add_option('--secret', action='store_true', default=False)

    options, args = parser.parse_args()
    
    # sanity check
    if options.private and options.secret:
        print "post can't be secret and private!"
        sys.exit(1)

    # parse dotfile
    home = os.environ.get('HOME')
    if home:
        dotfile = os.path.join(home, dotfile)
        if os.path.exists(dotfile):
            prefs = file(dotfile).read().split('\n')
            prefs = [ i for i in prefs if i.strip() ]
            prefs = [ [ j.strip() for j in i.split(':', 1) ] for i in prefs
                      if ':' in i] # probably not necessary
            prefs = dict(prefs)
        else:
            prefs = {}

    # determine user name and password
    fields = [ 'user', 'password' ]
    for field in fields:
        globals()[field] = prefs.get(field)

        optval = getattr(options, field)
        if optval:
            password = None # needed to ensure prompting for pw from command line
            globals()[field] = optval

        if globals()[field] is None:
            globals()[field] = raw_input('%s: ' % field)
    assert user is not None
    assert password is not None

    # write the dotfile if it doesn't exist
    if not os.path.exists(dotfile):
        preffile = file(dotfile, 'w')
        print >> preffile, 'user: %s' % user
        print >> preffile, 'password: %s' % password
        preffile.close()
        os.chmod(dotfile, 0600)
    

    # get the blog
    if args:
        msg = ' '.join(args)
    else:
        msg = tmpbuffer()

    # open the url
    url = '/'.join((options.server, user))
    url += '?auth=digest' # specify authentication method
    if options.private:
        url += '&privacy=private'
    if options.secret:
        url += '&privacy=secret'
    authhandler = urllib2.HTTPDigestAuthHandler()
    authhandler.add_password('bitsyblog', url, user, password)
    opener = urllib2.build_opener(authhandler)
    urllib2.install_opener(opener)

    try:
        url = urllib2.urlopen(url, data=msg)
        print url.url # print the blog post's url
    except urllib2.HTTPError:
        pass

if __name__ == '__main__':
    main()