X-Git-Url: http://git.grml.org/?p=grml-paste.git;a=blobdiff_plain;f=grml-paste;h=d8b02538e57a068628336df906e4c4666fa0f8f6;hp=cba61081bd356457306a4d0e6821af07a795cd1c;hb=0ac34191c2f3111a48fabc68c169cc51ca35f6bc;hpb=8c46f91a39aaf76a41052e860574989b746a1b25 diff --git a/grml-paste b/grml-paste index cba6108..d8b0253 100755 --- a/grml-paste +++ b/grml-paste @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 # Filename: grml-paste # Purpose: XmlRpc interface client to paste.grml.org # Author: Michael Gebetsroither @@ -6,19 +6,25 @@ ################################################################################ import sys -import xmlrpclib +from xmlrpc.client import ServerProxy import optparse -from pprint import pprint import inspect +import getpass + +# program defaults +DEFAULT_SERVER = 'http://paste.grml.org/server.pl' class ActionFailedException(Exception): '''Thrown if server returned an error''' + def __init__(self, errormsg, ret): Exception.__init__(self, errormsg, ret) + def what(self): '''Get errormessage''' return self.args[0] + def dwhat(self): '''Get more verbose errormessage''' return self.args[1] @@ -30,7 +36,7 @@ class Action(object): self.opts_ = opts def _createProxy(self): - return xmlrpclib.ServerProxy(self.opts_.server) + return ServerProxy(self.opts_.server, verbose=False) def _callProxy(self, functor, server=None): '''Wrapper for xml-rpc calls to server which throws an @@ -57,11 +63,11 @@ class Action(object): o = self.opts_ code = self.args_ if len(self.args_) == 0: - code = [ i.strip() for i in sys.stdin.readlines() ] + code = [i.rstrip() for i in sys.stdin.readlines()] code = '\n'.join(code) - result = self._callProxy(lambda s: s.paste.addPaste(code, o.name, o.expire * 3600, o.lang), - server) - return (result['statusmessage'], result) + result = self._callProxy(lambda s: s.paste.addPaste(code, o.name, o.expire * 3600, o.lang, o.private), + server) + return result['statusmessage'], result def actionDelPaste(self): '''Delete paste from server: @@ -69,35 +75,67 @@ class Action(object): Digest of paste you want to remove. ''' digest = self.args_.pop(0) - result = self._callProxy(lambda s: s.paste.deletePaste(digest)) - return (result['statusmessage'], result) + return result['statusmessage'], result def actionGetPaste(self): '''Get paste from server: Id of paste you want to receive. ''' - id = self.args_.pop(0) - - result = self._callProxy(lambda s: s.paste.getPaste(id)) - return (result['code'], result) + paste_id = self.args_.pop(0) + result = self._callProxy(lambda s: s.paste.getPaste(paste_id)) + return result['code'], result def actionGetLangs(self): '''Get supported language highlighting types from server''' result = self._callProxy(lambda s: s.paste.getLanguages()) - return ('\n'.join(result['langs']), result) + return '\n'.join(result['langs']), result + + def actionAddShortUrl(self): + '''Add short-URL: + + Short-URL to add + ''' + url = self.args_.pop(0) + result = self._callProxy(lambda s: s.paste.addShortURL(url)) + return result['url'], result + + def actionGetShortUrl(self): + '''Resolve short-URL: + + Short-URL to get clicks of + ''' + url = self.args_.pop(0) + result = self._callProxy(lambda s: s.paste.resolveShortURL(url)) + return (result['url'], result) + + def actionGetShortUrlClicks(self): + '''Get clicks of short-URL: + + Short-URL to get clicks of + ''' + url = self.args_.pop(0) + result = self._callProxy(lambda s: s.paste.ShortURLClicks(url)) + return result['count'], result def actionHelp(self): '''Print more verbose help about specific action: Topic on which you need more verbose help. ''' - alias = self.args_.pop(0) - - fun = actions[alias] - print inspect.getdoc(self.__getattribute__(fun)) - print "\naliase: " + " ".join([i for i in actions_r[fun] if i != alias]) + if len(self.args_) < 1: + alias = "help" + else: + alias = self.args_.pop(0) + + if alias in actions: + fun = actions[alias] + print(inspect.getdoc(self.__getattribute__(fun))) + print("\naliase: " + " ".join([i for i in actions_r[fun] if i != alias])) + else: + print("Error: No such command - %s" % (alias)) + OPT_PARSER.print_usage() sys.exit(0) @@ -106,7 +144,11 @@ actions_r = {} # add -> actionAddPaste # a -> actionAddPaste -actions = {} +actions = {} + +# option parser +OPT_PARSER = None + ## # MAIN @@ -116,28 +158,35 @@ if __name__ == "__main__": 'actionDelPaste del d rm', 'actionGetPaste get g', 'actionGetLangs getlangs gl langs l', + 'actionAddShortUrl addurl', + 'actionGetShortUrl geturl', + 'actionGetShortUrlClicks getclicks', 'actionHelp help'] for i in action_spec: - tmp = i.split() - cmd = tmp.pop(0) - actions_r[cmd] = tmp - for (k,v) in actions_r.items(): + aliases = i.split() + cmd = aliases.pop(0) + actions_r[cmd] = aliases + for (k, v) in actions_r.items(): for i in v: actions[i] = k usage = "usage: %prog [options] ACTION \n\n" +\ "actions:\n" +\ - "\n".join(["%12s\t%s" % (v[0], inspect.getdoc(getattr(Action, k)).split('\n')[0]) \ - for (k,v) in actions_r.items()]) + "\n".join(["%12s\t%s" % (v[0], inspect.getdoc(getattr(Action, k)).split('\n')[0]) + for (k, v) in actions_r.items()]) + running_user = getpass.getuser() parser = optparse.OptionParser(usage=usage) - parser.add_option('-n', '--name', default='anonymous', help="Name of poster") + parser.add_option('-n', '--name', default=running_user, help="Name of poster") parser.add_option('-e', '--expire', type=int, default=72, metavar='HOURS', - help='Time at wich paste should expire') + help='Time at wich paste should expire') parser.add_option('-l', '--lang', default='Plain', help='Type of language to highlight') - parser.add_option('-s', '--server', default='http://paste.grml.org/server.pl', - help='Paste server') + parser.add_option("-p", "--private", action="count", dest="private", default=0, + help='Create hidden paste'), + parser.add_option('-s', '--server', default=DEFAULT_SERVER, + help='Paste server') parser.add_option('-v', '--verbose', action='count', default=0, help='More output') (opts, args) = parser.parse_args() + OPT_PARSER = parser if len(args) == 0: parser.error('Please provide me with an action') @@ -147,13 +196,13 @@ if __name__ == "__main__": try: (msg, ret) = action.call(actions[cmd]) if opts.verbose == 0: - print msg + print(msg) else: - pprint(ret) - except ActionFailedException, e: + print(ret) + except ActionFailedException as e: sys.stderr.write('Server Error: %s\n' % e.what()) - if opts.verbose >0: - pprint(e.dwhat()) + if opts.verbose > 0: + print(e.dwhat()) sys.exit(1) else: parser.error('Unknown action: %s' % args[0])