1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#!/usr/bin/python
"""
call func method invoker
Copyright 2007, Red Hat, Inc
see AUTHORS
This software may be freely redistributed under the terms of the GNU
general public license.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
"""
import optparse
import pprint
import xmlrpclib
from func.overlord import command
from func.overlord import client
DEFAULT_PORT = 51234
class Call(client.command.Command):
name = "call"
useage = "call nodule method name arg1 arg2..."
def addOptions(self):
self.parser.add_option("-v", "--verbose", dest="verbose",
action="store_true")
self.parser.add_option("-x", "--xmlrpc", dest="xmlrpc",
action="store_true")
self.parser.add_option("", "--pprint", dest="pprint",
action="store_true")
self.parser.add_option("-j", "--json", dest="json",
action="store_true")
self.parser.add_option("-p", "--port", dest="port",
default=DEFAULT_PORT)
def handleOptions(self, options):
self.options = options
self.verbose = options.verbose
self.port = options.port
# I'm not really a fan of the "module methodname" approach
# but we'll keep it for now -akl
def parse(self, argv):
self.argv = argv
return command.Command.parse(self, argv)
def format_return(self, data):
if self.options.xmlrpc:
return xmlrpclib.dumps((data,""))
if self.options.pprint:
return pprint.pformat(data)
if self.options.json:
try:
import simplejson
return simplejson.dumps(data)
except ImportError:
print "json support not found"
return data
return data
def do(self, args):
# I'm not really a fan of the "module methodname" approach
# but we'll keep it for now -akl
# I kind of feel like we shouldn't be parsing args here, but I'm
# not sure what the write place is -al;
self.module = args[0]
self.method = args[1]
self.method_args = args[2:]
# this could get weird, sub sub classes might be calling this
# this with multiple.parentCommand.parentCommands...
# maybe command.py needs a way to set attrs on subCommands?
# or some sort of shared datastruct?
self.server_spec = self.parentCommand.server_spec
client_obj = client.Client(self.server_spec,port=self.port,interactive=True,
verbose=self.verbose, config=self.config)
results = client_obj.run(self.module, self.method, self.method_args)
# TO DO: add multiplexer support
# probably as a higher level module.
# dump the return code stuff atm till we figure out the right place for it
return self.format_return(results)
|