X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=grml-paste;h=6328a7be9f5c594d16868537392d21e5e1082290;hb=c9d9ead57f0d0f6325d7f98d56059146d8a818a1;hp=cba61081bd356457306a4d0e6821af07a795cd1c;hpb=8c46f91a39aaf76a41052e860574989b746a1b25;p=grml-paste.git diff --git a/grml-paste b/grml-paste index cba6108..6328a7b 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,11 +6,13 @@ ################################################################################ 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''' @@ -30,7 +32,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,9 +59,9 @@ 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), + result = self._callProxy(lambda s: s.paste.addPaste(code, o.name, o.expire * 3600, o.lang, o.private), server) return (result['statusmessage'], result) @@ -69,7 +71,6 @@ 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) @@ -79,7 +80,6 @@ class Action(object): 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) @@ -88,16 +88,50 @@ class Action(object): result = self._callProxy(lambda s: s.paste.getLanguages()) 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) @@ -108,6 +142,10 @@ actions_r = {} # a -> actionAddPaste actions = {} +# option parser +OPT_PARSER = None + + ## # MAIN ## @@ -116,11 +154,14 @@ 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 + 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 @@ -129,15 +170,19 @@ if __name__ == "__main__": "actions:\n" +\ "\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') 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', + 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 +192,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()) + print(e.dwhat()) sys.exit(1) else: parser.error('Unknown action: %s' % args[0])