3 # Purpose: XmlRpc interface client to paste.grml.org
4 # Author: Michael Gebetsroither <gebi@grml.org>
5 # License: This file is licensed under the GPL v2.
6 ################################################################################
11 from pprint import pprint
15 class ActionFailedException(Exception):
16 '''Thrown if server returned an error'''
17 def __init__(self, errormsg, ret):
18 Exception.__init__(self, errormsg, ret)
20 '''Get errormessage'''
23 '''Get more verbose errormessage'''
28 def __init__(self, args, opts):
32 def _createProxy(self):
33 return xmlrpclib.ServerProxy(self.opts_.server)
35 def _callProxy(self, functor, server=None):
36 '''Wrapper for xml-rpc calls to server which throws an
37 ActionFailedException on error'''
39 server = self._createProxy()
42 raise ActionFailedException(ret['statusmessage'], ret)
45 def call(self, method_name):
46 '''External Interface to call the appropriate action'''
47 return self.__getattribute__(method_name)()
49 def actionAddPaste(self):
50 '''Add paste to the server: <1.line> <2.line> ...
52 default Read paste from stdin.
53 [text] Every argument on the commandline will be interpreted as
54 a seperate line of paste.
56 server = self._createProxy()
59 if len(self.args_) == 0:
60 code = [ i.strip() for i in sys.stdin.readlines() ]
61 code = '\n'.join(code)
62 result = self._callProxy(lambda s: s.paste.addPaste(code, o.name, o.expire * 3600, o.lang),
64 return (result['statusmessage'], result)
66 def actionDelPaste(self):
67 '''Delete paste from server: <digest>
69 <digest> Digest of paste you want to remove.
71 digest = self.args_.pop(0)
73 result = self._callProxy(lambda s: s.paste.deletePaste(digest))
74 return (result['statusmessage'], result)
76 def actionGetPaste(self):
77 '''Get paste from server: <id>
79 <id> Id of paste you want to receive.
81 id = self.args_.pop(0)
83 result = self._callProxy(lambda s: s.paste.getPaste(id))
84 return (result['code'], result)
86 def actionGetLangs(self):
87 '''Get supported language highlighting types from server'''
88 result = self._callProxy(lambda s: s.paste.getLanguages())
89 return ('\n'.join(result['langs']), result)
92 '''Print more verbose help about specific action: <action>
94 <action> Topic on which you need more verbose help.
96 alias = self.args_.pop(0)
99 print inspect.getdoc(self.__getattribute__(fun))
100 print "\naliase: " + " ".join([i for i in actions_r[fun] if i != alias])
104 # actionAddPaste -> [add, a]
107 # add -> actionAddPaste
108 # a -> actionAddPaste
114 if __name__ == "__main__":
115 action_spec = ['actionAddPaste add a',
116 'actionDelPaste del d rm',
117 'actionGetPaste get g',
118 'actionGetLangs getlangs gl langs l',
120 for i in action_spec:
124 for (k,v) in actions_r.items():
128 usage = "usage: %prog [options] ACTION <args>\n\n" +\
130 "\n".join(["%12s\t%s" % (v[0], inspect.getdoc(getattr(Action, k)).split('\n')[0]) \
131 for (k,v) in actions_r.items()])
132 parser = optparse.OptionParser(usage=usage)
133 parser.add_option('-n', '--name', default='anonymous', help="Name of poster")
134 parser.add_option('-e', '--expire', type=int, default=72, metavar='HOURS',
135 help='Time at wich paste should expire')
136 parser.add_option('-l', '--lang', default='Plain', help='Type of language to highlight')
137 parser.add_option('-s', '--server', default='http://paste.grml.org/server.pl',
139 parser.add_option('-v', '--verbose', action='count', default=0, help='More output')
140 (opts, args) = parser.parse_args()
143 parser.error('Please provide me with an action')
144 elif args[0] in actions:
146 action = Action(args, opts)
148 (msg, ret) = action.call(actions[cmd])
149 if opts.verbose == 0:
153 except ActionFailedException, e:
154 sys.stderr.write('Server Error: %s\n' % e.what())
159 parser.error('Unknown action: %s' % args[0])