summaryrefslogtreecommitdiffstats
path: root/scripts/func-transmit
blob: 677b1a66cb29574e64df7b6c5cee3b36c3fce95d (plain)
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
#!/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>
##
## 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 input file format:
"""
clients: "*"
aysnc: False
nforks: 1
module: command
method: run
parameters: "/bin/echo Hello World"
"""

import string
import sys
import distutils.sysconfig
import optparse

import func.yaml as yaml # FIXME: need to subpackage this as part of Func
import func.overlord.func_command as func_command
import func.overlord.client as fc

# load input from stdin
input = sys.stdin.read()
params = yaml.load(input).next()


# scan arguments

def is_a_list(item):
    if type(item) in [type([]), type(())]:
        return True
    return False

# 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')

if method == "list_minions":
    # clients will default to * if not specified, and specifing is a good
    # way to see who is in what group, etc, so pass it though
    minion_set = fc.Minions(clients)
    servers = minion_set.get_all_hosts()
    servers.sort()
    results = servers
 
else:
    # scan more arguments
    async      = params.get('async', False)
    nforks     = params.get('nforks', 1)
    module     = params.get('module','unknown')
    parameters = params.get('parameters', None)


    # make the call
    client = fc.Overlord(clients, async=async, nforks=nforks)
    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 YAML
output = yaml.dump(results)

# write to stdout
print output