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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#!/usr/bin/python
##
## func yaml wrapper tool.
## allows usage of func over stdin/stdin using yaml as a marshalling format
## for access to the Overlord() API from non-Python code.
## this should typically be accessed via a pipe, though also works as
## func-transmit < yamlfile
##
## Copyright 2008, Various
## Marco Mornati <mmornati@byte-code.com>
## Michael DeHaan <mdehaan@redhat.com>
## Adrian Likins <alikins@redhat.com>
##
## 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.
##
## Example yaml input file format:
"""
clients: "*"
aysnc: False
nforks: 1
module: command
method: run
parameters: "/bin/echo Hello World"
"""
import exceptions
import string
import sys
import distutils.sysconfig
import optparse
import simplejson
import func.overlord.func_command as func_command
import func.overlord.client as fc
import func.yaml as yaml
class NoAsyncForListMinionException(exceptions.Exception):
def __init__(self, msg):
self.msg = msg
# scan arguments
def is_a_list(item):
if type(item) in [type([]), type(())]:
return True
return False
def main(argv):
# load input parameters
parser = optparse.OptionParser()
parser.add_option("-j","--json",
help="Json Parser",
action="store_true",
dest="json",
default=False)
parser.add_option("-y","--yaml",
help="Yaml Parser",
action="store_true",
dest="yaml",
default=False)
(options,args) = parser.parse_args()
# load input from stdin
input = sys.stdin.read()
# Setting default language if no one is selected by user
if (options.json==False and options.yaml==False):
options.json = True
if (options.yaml):
params = yaml.load(input).next()
elif (options.json):
params = simplejson.loads(input)
# slightly odd, but we expect clients to be a string we parse
# out later (glob and group expansion, etc). So if it is a list,
# flatten it into a string.
clients = params.get('clients', "*")
if is_a_list(clients):
clients = string.join(clients,';')
method = params.get('method','unknown')
async = params.get('async', False)
# scan more arguments
nforks = params.get('nforks', 1)
module = params.get('module', None)
parameters = params.get('parameters', None)
# make the call
client = fc.Overlord(clients, async=async, nforks=nforks)
if module is None:
method_handle = getattr(client, method)
else:
module_handle = getattr(client, module)
method_handle = getattr(module_handle, method)
if parameters is not None:
# listify if we get something thats not a list
if not is_a_list(parameters):
parameters = [parameters]
results = method_handle(*parameters)
else:
results = method_handle()
# convert to selected language (default is JSON)
if (options.json):
output = simplejson.dumps(results)
elif (options.yaml):
output = yaml.dump(results)
# write to stdout
print output
if __name__ == "__main__":
main(sys.argv)
|