From ea5e0b9e518aabe58890dc14a0cdc1751068b4f0 Mon Sep 17 00:00:00 2001 From: infirit Date: Mon, 13 Oct 2014 12:54:55 +0200 Subject: mpaste: Rewrite for new paste website --- tools/mpaste | 158 ++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 118 insertions(+), 40 deletions(-) (limited to 'tools') diff --git a/tools/mpaste b/tools/mpaste index 901623b..c48000a 100755 --- a/tools/mpaste +++ b/tools/mpaste @@ -4,6 +4,9 @@ # Copyright (C) 2013 Steve Zesch +# Rewritten for Sticky notes 2014-10-09 +# Copyright (C) 2014 Sander Sweers + # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 @@ -18,47 +21,122 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import urllib -import urllib2 -import optparse -import sys - -def write_paste(values): - url = 'http://paste.mate-desktop.org/api/create' - data = urllib.urlencode(values) - request = urllib2.Request(url, data) - response = urllib2.urlopen(request) - page = response.read() - - return page +# TODO: cache language/expire results on disk +# TODO: If api is updated for registered users add back --author -def build_values(options, text): - values = {} - - for opt, val in options.__dict__.items(): - if val: - values[opt] = val - - values['text'] = text - - if values.has_key('private') and values['private'] == True: - values['private'] = 1 +from __future__ import unicode_literals, print_function +import json +import requests +import argparse +import sys - return values +def build_paste(args, data): + '''Build paste from arguments and data''' + values = {} + for opt, val in args.__dict__.items(): + if opt == 'infile': continue + if val: values[opt] = val + + values['data'] = data + + return values + +def create_parser(): + '''Build argument parser''' + parser = argparse.ArgumentParser(prog='mpaste') + parser.add_argument('-t', '--title', dest='title', + help='title of this paste') + ## parser.add_argument('-a', '--author', dest='author', + ## help='author of this paste') + parser.add_argument('-p', '--private', dest='private', action='store_true', + help='should this paste be private') + parser.add_argument('-pwd', '--password', dest='password', + help='password of this paste') + parser.add_argument('-lang', '--language', dest='language', default="text", + help='language this paste is in') + parser.add_argument('-ll', '--language-list', dest='lang_list', action='store_true', + help='List all supported languages') + parser.add_argument('-e', '--expire', dest='expire', type=int, default=1800, + help='paste expiration in minutes') + parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin, + help='The file to paste or when no file read stdin') + + return parser + +def get_params(session): + '''Retrieve valid parameters and defaults''' + param_api_url = 'http://paste.mate-desktop.org/api/json/parameter/' + params = {} + + resp_lang = session.get(param_api_url + 'language') + if resp_lang.status_code != 200: + params['languages'] = 'text' + print('Could not load languages from api, defaulting to \"text\"') + else: + params['languages'] = json.loads(resp_lang.content)['result']['values'] + + resp_expire = session.get(param_api_url + 'expire') + if resp_expire.status_code != 200: + params['expires'] = 1800 + print('Could not get expiration times, defaulting to 1800') + else: + params['expires'] = json.loads(resp_expire.content)['result']['values'] + + return params if __name__ == '__main__': - parser = optparse.OptionParser() - parser.add_option('-t', '--title', dest='title', help='title of this paste') - parser.add_option('-n', '--name', dest='name', help='author of this paste') - parser.add_option('-p', '--private', dest='private', action='store_true', - help='should this paste be private') - parser.add_option('-l', '--language', dest='lang', - help='language this paste is in') - parser.add_option('-e', '--expire', dest='expire', help='paste expiration in minutes') - parser.add_option('-r', '--reply', dest='reply', help='reply to existing paste') - - (options, args) = parser.parse_args() - - text = sys.stdin.read() - returned_url = write_paste(build_values(options, text)) - print returned_url + api_url = 'http://paste.mate-desktop.org/api/json/' + + session = requests.session() + params = get_params(session) + + # Create argument parser and read arguments + parser = create_parser() + args = parser.parse_args() + + # Print all supported languages + if args.lang_list: + print('Supported languages are:') + for lang in params['languages']: + print('* %s' % lang) + sys.exit() + + # Check if we are reading from a file or stdin + if sys.stdin.isatty(): + print('Reading file: %s ...' % args.infile.name) + data = args.infile.read() + else: + print('Reading from stdin ...') + data = sys.stdin.read() + + # Check if provided lang is supported + if not args.language in params['languages']: + print('Unsupported language: %s' % args.language) + print('Run --all-language to get a list of valid values') + sys.exit(1) + + # Check if expiration in minutes is valid + if not args.expire in params['expires']: + valid = ', '.join([str(i) for i in sorted(params['expires'])]) + print('Invalid expiring time: %s' % args.expire) + print('Valid expire values in minutes are: \n%s' % valid) + sys.exit(1) + + # Build the paste dict used by requests + paste = build_paste(args, data) + + # If we read a file and no title given use the file name + if not args.title and args.infile.name != '': + paste['title'] = args.infile.name + + # Post the data to the website + resp = session.post(api_url + 'create', data=paste) + result = json.loads(resp.content)['result'] + + # Show url or error + if len(result) < 2: + print('Could not paste, got error: %s' % result['error']) + else: + print('Pasted successfully \o/') + print('Url: http://paste.mate-desktop.org/%s' % result['id']) + if result['hash']: print('Got the following hash: %s' % result['hash']) -- cgit v1.2.1