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
|
import logging
log = logging.getLogger(__name__)
from turbogears import controllers, expose, flash, identity, redirect
from func.overlord.client import Client
class Root(controllers.RootController):
@expose(template="funcweb.templates.minions")
@identity.require(identity.not_anonymous())
def minions(self, glob='*'):
""" Return a list of our minions that match a given glob """
fc = Client(glob)
return dict(minions=fc.system.list_methods())
index = minions # start with our minion view, for now
@expose(template="funcweb.templates.minion")
@identity.require(identity.not_anonymous())
def minion(self, name, module=None, method=None):
""" Display module or method details for a specific minion.
If only the minion name is given, it will display a list of modules
for that minion. If a module is supplied, it will display a list of
methods. If a method is supplied, it will display a method execution
form.
"""
fc = Client(name)
if not module: # list all modules
modules = fc.system.list_modules()
return dict(modules=modules)
else: # a module is specified
if method: # minion.module.method specified; bring up execution form
return dict(minion=name, module=module, method=method,
tg_template="funcweb.templates.method")
else: # return a list of methods for specified module
modules = getattr(fc, module).list_methods()
return dict(modules=modules, module=module,
tg_template="funcweb.templates.module")
@expose(template="funcweb.templates.run")
@identity.require(identity.not_anonymous())
def run(self, minion="*", module=None, method=None, arguments=''):
fc = Client(minion)
results = getattr(getattr(fc, module), method)(*arguments.split())
cmd = "%s.%s.%s(%s)" % (minion, module, method, arguments)
return dict(cmd=cmd, results=results)
@expose(template="funcweb.templates.login")
def login(self, forward_url=None, previous_url=None, *args, **kw):
from cherrypy import request, response
if not identity.current.anonymous \
and identity.was_login_attempted() \
and not identity.get_identity_errors():
raise redirect(forward_url)
forward_url=None
previous_url= request.path
if identity.was_login_attempted():
msg=_("The credentials you supplied were not correct or "
"did not grant access to this resource.")
elif identity.get_identity_errors():
msg=_("You must provide your credentials before accessing "
"this resource.")
else:
msg=_("Please log in.")
forward_url= request.headers.get("Referer", "/")
response.status=403
return dict(message=msg, previous_url=previous_url, logging_in=True,
original_parameters=request.params,
forward_url=forward_url)
@expose()
def logout(self):
identity.current.logout()
raise redirect("/")
|