chore: make flake8 happy
[grml-paste.git] / grml-paste
index cba6108..d8b0253 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # Filename:      grml-paste
 # Purpose:       XmlRpc interface client to paste.grml.org
 # Author:        Michael Gebetsroither <gebi@grml.org>
@@ -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: <digest>
@@ -69,35 +75,67 @@ class Action(object):
         <digest>    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>
 
         <id>        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: <url>
+
+        <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: <url>
+
+        <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: <url>
+
+        <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: <action>
 
         <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 <args>\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])